Подтвердить что ты не робот

Выполнение ответов HTTP/1.0 с помощью Node.JS(неизвестная длина содержимого, кодировка с коротким переносом)

Проблема

Я обслуживаю ресурс неизвестной длины через Node.JS. Из-за этого заголовок Content-Length не может быть установлен. Для HTTP 1.1 требуется, чтобы закодированное кодирование использовалось для ресурсов такого рода. Node.JS знает об этом и отправляет мои данные с помощью кодированной кодировки передачи по отдельности со следующими заголовками:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: close
...

Это хорошо и хорошо для хорошо управляемых клиентов. Тем не менее, у меня есть некоторые не очень хорошие клиенты (а именно Android 2.2 и более ранние версии), которые я должен поддерживать. Эти клиенты не поддерживают кодирование с коротким передачей.

Исправить попытку # 1

Моя первоначальная мысль была установлена ​​для кодировки на none следующим образом:

response.writeHead(200, {'Transfer-Encoding': 'none'});

Это отключает автоматическую кодировку с кодировкой Node.JS и поддерживает совместимость с большинством клиентов. Однако теперь я сломал Android 2.3+ клиентов, так как они просто кашляют и задыхаются, когда видят такой заголовок кодирования фальшивых передач.

Исправить попытку №2 (где мне нужна помощь)

Когда я делаю запросы с HTTP/1.0, сервер правильно возвращает ответ без кодированной кодировки:

HTTP/1.1 200 OK
Connection: close
...

Это решает мою проблему и позволяет мне обслуживать поток, который работает для всех моих проблемных клиентов. Мне не нужно посылать фиктивный заголовок для Transfer-Encoding, и мне все равно не нужно указывать, сколько времени занимает контент.

Как заставить HTTP-сервер Node.JS всегда работать в режиме HTTP/1.0?

4b9b3361

Ответ 1

Принудительные ответы без правильного пути

Существует поддерживаемый способ отключения кодировки: вам просто нужно удалить заголовок Transfer-Encoding, используя request.removeHeader(name):

response.removeHeader('transfer-encoding');

Node.js будет уважать независимо от того, что. Там даже test, чтобы кто-то случайно не изменил это поведение, поэтому я считаю, что это довольно безопасно.

Таким образом, вы можете просто придерживаться попытки №1, но делать это, как описано выше.

Ответ 2

В моих целях я нашел простой способ отключить принудительное использование chunked, используя недокументированное свойство объекта ответа:

response.useChunkedEncodingByDefault = false;

Это так просто. Конечно, полагаться на это свойство, чтобы быть доступным для будущих версий Node.js, не самый лучший. Возможно, есть лучшее решение, но сейчас это работает для меня.