خطوط هدر را جدا از بدنهٔ پاسخ جمع کنید. انتقال از طریق پروکسی ممکن است هدرهای CONNECT، احراز هویت، تغییرمسیر و پاسخ مقصد را در یک عملیات تحویل دهد:

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

این تابع بازخوانی ترتیب خام خطوط را حفظ می‌کند و تعداد بایت‌های پذیرفته‌شده را برمی‌گرداند. خطوط کامل را دریافت می‌کند؛ اما هنوز آن‌ها را در پاسخ‌ها گروه‌بندی نمی‌کند و هدرهای وب‌سایت نهایی را انتخاب نمی‌کند.

دنباله را به‌صورت بلوک تفسیر کنید

یک خط وضعیت HTTP یک بلوک پاسخ را آغاز می‌کند و یک خط خالی هدرهای آن را پایان می‌دهد. این مرزها را پیش از انتخاب پاسخ نهایی مقصد حفظ کنید. تلاش‌های احراز هویت میانی و تغییرمسیرها هرکدام می‌توانند بلوک اضافه کنند.

تریلرها ممکن است بعداً از طریق تابع بازخوانی برسند. به‌اندازهٔ کافی وضعیت تجزیه‌گر نگه دارید تا آن‌ها را از هدرهای اولیه تشخیص دهید، به‌جای اینکه هر فیلد بعدی را به پاسخ نخست بچسبانید.

شواهد تونل را نگه دارید یا سرکوب کنید

برای وضعیت CONNECT تونل HTTPS، CURLINFO_HTTP_CONNECTCODE را جداگانه بخوانید. تونل پذیرفته‌شده پاسخ موفق وب‌سایت را اثبات نمی‌کند.

اگر هدرهای CONNECT برای جمع‌کننده لازم نیستند، CURLOPT_SUPPRESS_CONNECT_HEADERS تحویل آن‌ها به خروجی هدر پیکربندی‌شده و مسیرهای بازخوانی را کنترل می‌کند. پشتیبانی را در libcurl و بیلد PHP متصل بررسی کنید. سرکوب، جمع‌آوری را ساده می‌کند اما شواهد تونل در سطح هدر را که می‌تواند به عیب‌یابی کمک کند حذف می‌کند.

بدنه را با یک جابه‌جایی ثابت یا با جست‌وجوی یک تگ HTML بازیابی نکنید. اندازهٔ هدرها متفاوت است، پاسخ‌های میانی تفاوت دارند و بدنه می‌تواند دودویی یا خالی باشد. گزارش خطای قدیمی مربوط به یک نسخهٔ خاص، جابه‌جایی حدسی را توجیه نمی‌کند.

مدیریت بدنه را جدا نگه دارید و اگر جمع‌آوری یا تجزیه شکست خورد، خطای انتقال را همراه با مراحل مشاهده‌شدهٔ پاسخ نگه دارید. این کار بازخوانی قطع‌شده، دادهٔ معیوب برنامه و تبادل ردشدهٔ پروکسی را از هم متمایز می‌کند.

مقالات مرتبط