Збірайце радкі загалоўкаў асобна ад цела адказу. Перадача праз проксі можа даставіць загалоўкі CONNECT, аўтэнтыфікацыі, перанакіравання і адказу прызначэння за адну аперацыю:

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

Гэты зваротны выклік захоўвае сырую паслядоўнасць радкоў і вяртае колькасць прынятых байтаў. Ён атрымлівае поўныя радкі; але пакуль не групуе іх у адказы і не выбірае загалоўкі канчатковага сайта.

Тлумачце паслядоўнасць як блокі

Радок статусу HTTP пачынае блок адказу, а пусты радок завяршае яго загалоўкі. Захоўвайце гэтыя межы перад выбарам канчатковага адказу прызначэння. Прамежкавыя спробы аўтэнтыфікацыі і перанакіраванні могуць дадаваць блокі.

Трэйлеры могуць пазней прыйсці праз зваротны выклік. Захоўвайце дастаткова стану парсера, каб адрозніць іх ад пачатковых загалоўкаў, замест таго каб далучаць кожнае наступнае поле да першага адказу.

Захавайце або прыхавайце сведчанні тунэля

Чытайце CURLINFO_HTTP_CONNECTCODE асобна для статусу CONNECT тунэля HTTPS. Прыняты тунэль не пацвярджае паспяховы адказ сайта.

Калі загалоўкі CONNECT не патрэбныя зборшчыку, CURLOPT_SUPPRESS_CONNECT_HEADERS кіруе іх дастаўкай у наладжаны вывад загалоўкаў і шляхі зваротнага выкліку. Праверце падтрымку ў звязаных libcurl і зборцы PHP. Прыхаванне спрашчае збор, але выдаляе сведчанні тунэля на ўзроўні загалоўкаў, якія могуць дапамагчы дыягностыцы.

Не аднаўляйце цела з дапамогай фіксаванага зруху або пошуку HTML-тэга. Памеры загалоўкаў розныя, прамежкавыя адказы адрозніваюцца, а цела можа быць бінарным або пустым. Старыя справаздачы пра памылку канкрэтнай версіі не апраўдваюць меркаваны зрух.

Трымайце апрацоўку цела асобна і захоўвайце памылку перадачы разам з назіранымі этапамі адказу, калі збор або разбор не ўдаўся. Гэта адрознівае перарваны зваротны выклік, пашкоджаныя даныя праграмы і адхілены абмен праз проксі.

Падобныя артыкулы