preg_replace на HTML-странице дает net::ERR_INVALID_CHUNKED_ENCODING

У меня есть простой вызов curl, который получает HTML-страницу с сервера, а затем preg_replace() который вставляет что-то в страницу, а затем результат возвращается в браузер.

Я заметил, что если HTTP-сервер, с которого curl пытается получить HTML-страницу, использует заголовок 'Transfer-Enoding: chunked', вывод html будет как-то закодирован (я заметил несколько странных признаков) и preg_replace() вызов сделает работу, но браузер просто получит ERR_INVALID_CHUNKED_ENCODING и не будет загружать страницу. Должен быть способ заменить часть страницы, не испортив кусочную кодировку?

1 ответ

Chunked Transfer-Encoding - это функция HTTP 1.1, где сервер не знает размер ресурса, когда он начинает отправлять данные, поэтому он отправляет клиенту серию "чанков", каждому чанку предшествует размер (в количестве байт в шестнадцатеричном) куска.

Увы, если вы вставляете данные в чанк, вы также должны изменить размер чанка, когда отправляете его в браузер. В качестве альтернативы, конечно, вы получаете полную вещь, делаете замену и отправляете весь ответ за один кусок (или даже без блоков).

Надлежащий клиент HTTP 1.1 должен иметь возможность декодировать чанки, а надлежащий сервер HTTP 1.1 должен отправлять допустимые серии чанков (довольно распространенная ошибка на стороне сервера - исключить окончательный чанк нулевого размера).

Смотрите здесь для спецификации: https://tools.ietf.org/html/rfc7230

Другие вопросы по тегам