Получая доступ к серверу oracle apex через прокси-сервер apache, я время от времени получаю следующий HTTP-пакет в качестве ответа от сервера:
Connection:Keep-Alive
Date:Fri, 20 Jan 2017 16:00:24 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.6 () PHP/5.4.16
Transfer-Encoding:chunked
0
HTTP/1.1 200 OK
Server: Oracle XML DB/Oracle Database
Content-Type: text/html; charset=utf-8
Content-Length: 33388
ACTUAL HTML PAGE FROM APEX
Я не знаю, откуда взялся 0. Хотя кажется, что прокси-сервер обертывает полный HTTP-ответ, который он получает от APEX (включая HTTP-заголовок), как тело HTTP в другой пакет HTTP:
<Apache HTTP PACKAGE>
<Apache HTTP HEADER>
Connection:Keep-Alive
Date:Fri, 20 Jan 2017 16:00:24 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.6 () PHP/5.4.16
Transfer-Encoding:chunked
</Apache HTTP HEADER>
<Apache HTTP BODY>
0
<APEX HTTP PACKAGE>
HTTP/1.1 200 OK
Server: Oracle XML DB/Oracle Database
Content-Type: text/html; charset=utf-8
Content-Length: 33388
ACTUAL HTML PAGE FROM APEX
</APEX HTTP PACKAGE>
</Apache HTTP BODY>
</Apache HTTP PACKAGE>
Вместо этого прокси должен просто пересылать HTTP-пакет клиенту. Таким образом, клиент получает пакет HTTP, как если бы он поступил из APEX, не зная, что он был перенаправлен прокси. Это работает, как ожидалось, 29 из 30 раз, но иногда ведет себя так, как описано выше. Это ошибка прокси? Не могли бы вы предложить возможное решение?
Это не упаковка, это связано с transfer-encoding: chunked
заголовок. Видеть https://en.wikipedia.org/wiki/Chunked_transfer_encoding
0 - это сигнал последнего фрагмента. Со страницы выше:
Каждый блок начинается с числа октетов внедряемых данных, выраженного в виде шестнадцатеричного числа в ASCII, за которым следуют необязательные параметры (расширение блока) и завершающая последовательность CRLF, за которой следуют данные блока. Фрагмент завершается CRLF.
и
Завершающий блок - это обычный блок, за исключением того, что его длина равна нулю. За ним следует трейлер, который состоит из (возможно, пустой) последовательности полей заголовка объекта. Обычно такие поля заголовка отправляются в заголовке сообщения; однако может быть более эффективным определить их после обработки всего объекта сообщения. В этом случае полезно отправить эти заголовки в трейлере.
Пытаться SetEnv proxy-nokeepalive 1
в вашей конфигурации Apache mod_proxy. Или попробуйте
SetEnv proxy-sendcl 1
SetEnv proxy-sendchunked 0
Видеть http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#request-bodies для объяснений.