Как сделать чанк-запрос через nginx - PullRequest
5 голосов
/ 16 декабря 2011

Кажется, что nginx плохо поддерживает запросы по частям.Но я пытаюсь получить более точный (и актуальный) ответ.У меня есть клиент, делающий SOAP-запрос к серверу от клиента Java, который устанавливает заголовок Transfer-Encoding: chunked.Все работает хорошо, когда я подключаюсь напрямую к своему приложению на Tomcat.

Но когда я помещаю nginx между ними, все ломается.

Чтобы добавить несколько деталей: я работаю с CloudFoundry.Я использую Micro Cloud Foundry, чтобы подтвердить, что в отсутствие nginx все работает как положено.Но мое требование - использовать cloudfoundry.com, поэтому у меня нет возможности обойти там nginx.

Этот вопрос и ответ говорят, что это, пожалуй, мой единственный обходной путь: http://wiki.nginx.org/NginxHttpChunkinModule. Но этот обходной путь недоступен, поскольку я не могу изменить конфигурацию на cloudfoundry.com.

Этот вопрос также выглядит аналогичным, но на самом деле он охватывает обратную сторону этого требования.,Он охватывает фрагментированные ответы, а не фрагментированные запросы.

Так как насчет каких-либо изменений на клиенте, чтобы обойти это?Можно ли отправить как Transfer-Encoding: chunked, так и Content-Length: 123 как заголовки?Эта область является новой для меня, но из таких проектов, как Apache HttpComponents, кажется, что можно задать либо длину, либо порцию, но не оба.Смысл в том, что вам не нужно знать длину, когда начинается запрос.Могу ли я сказать своему клиенту использовать HTTP / 1.0 и хорошо играть с nginx без чанкинга?Есть ли другие идеи обойти, которые я забыл?

Ответы [ 2 ]

4 голосов
/ 23 января 2012

Я собрал ответы на все части этого вопроса.

База nginx не поддерживает фрагментированные запросы (как подтвердил Александр!). Nginx может поддерживать фрагментированный запрос, используя NginXHttpCunkinModule (как упоминает мой вопрос). Лучше: этот модуль перешел от бета-статуса к качеству продукции более 18 месяцев назад. Лучший: я говорил с некоторыми членами команды разработчиков CloudFoundry на недавней встрече ; они подтверждают, что планируется добавить этот модуль в свою версию nginx. Задача решена. (Ну, это полностью решено в долгосрочной перспективе. Но у нас нет точной даты, когда ожидать этого.)

Поэтому было бы неплохо и краткосрочное решение. Я нашел один.

Отвечая на мой вопрос, направленный Александру: невозможно отправить «Content-Length» с кусками сообщений. В этом-то и состоит смысл фрагментированных сообщений: вы начинаете отправлять их до того, как получите полный контент, поэтому пока не можете знать их длину. Так что его идея избежать частичных запросов верна. Но для большей практичности я бы сказал: «Используйте HTTP / 1.0, а не HTTP / 1.1». Это приводит к тому, что не отправляются фрагментированные сообщения. Мы смогли временно исправить наш клиент, чтобы проверить эту идею. Это сработало. Но мы не планируем выпускать публичный патч. Кажется контрпродуктивным заставить всех использовать 10-летний протокол (и 10-летнюю неподдерживаемую клиентскую библиотеку!) Для решения проблемы в этой единственной ситуации.

Вместо этого я буду использовать взломанный клиент при необходимости, отправлю электронное письмо, если другие найдут в этом необходимость, и мы дождемся обновления CloudFoundry до HttpChunkin и HTTP / 1.1.

2 голосов
/ 16 декабря 2011

Nginx действительно не поддерживает фрагментированные запросы. Возвращается 411 Content Length required при отсутствии заголовка Content-Length.

Поскольку вы управляете своим клиентским кодом, я думаю, что единственный выбор - избегать использования фрагментированных запросов и явно указывать Content-Length.

...