אספו שורות כותרת בנפרד מגוף התגובה. העברה דרך פרוקסי עשויה למסור כותרות CONNECT, אימות, הפניה ותגובת יעד בפעולה אחת:

$headerLines = [];
curl_setopt($handle, CURLOPT_HEADERFUNCTION,
    function ($handle, $line) use (&$headerLines) {
        $headerLines[] = $line;
        return strlen($line);
    }
);

קריאת חזרה זו שומרת על רצף השורות הגולמי ומחזירה את מספר הבתים שהתקבלו. היא מקבלת שורות שלמות; אך עדיין אינה מקבצת אותן לתגובות ואינה בוחרת את כותרות האתר הסופי.

פרשו את הרצף כבלוקים

שורת סטטוס HTTP פותחת בלוק תגובה, ושורה ריקה מסיימת את הכותרות שלו. שמרו על הגבולות הללו לפני בחירת תגובת היעד הסופית. ניסיונות אימות ביניים והפניות יכולים כל אחד להוסיף בלוקים.

כותרות סיום (trailers) עשויות להגיע מאוחר יותר דרך קריאת החזרה. החזיקו מספיק מצב של המנתח כדי להבדיל אותן מהכותרות הראשוניות, במקום לצרף כל שדה מאוחר לתגובה הראשונה.

שמרו או דכאו את הראיה של המנהרה

קראו את CURLINFO_HTTP_CONNECTCODE בנפרד עבור סטטוס CONNECT של מנהרת HTTPS. מנהרה שהתקבלה אינה מוכיחה תגובת אתר מוצלחת.

אם כותרות CONNECT אינן נחוצות לאספן, CURLOPT_SUPPRESS_CONNECT_HEADERS שולט במסירתן לפלט הכותרות המוגדר ולנתיבי קריאת החזרה. בדקו תמיכה ב-libcurl ובבניית PHP המקושרות. דיכוי מפשט את האיסוף אך מסיר ראיה של מנהרה ברמת הכותרות שיכולה לסייע באבחון.

אל תשחזרו את הגוף באמצעות היסט קבוע או בחיפוש אחר תג HTML. גדלי הכותרות משתנים, תגובות ביניים שונות, והגוף עשוי להיות בינארי או ריק. דוח באג ישן הספציפי לגרסה אינו מצדיק היסט משוער.

שמרו על טיפול נפרד בגוף, ושמרו את שגיאת ההעברה יחד עם שלבי התגובה שנצפו אם האיסוף או הפענוח נכשלים. זה מבדיל בין קריאת חזרה שנקטעה, נתוני אפליקציה פגומים וחילופי פרוקסי שנדחו.

מאמרים קשורים