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