Выполнение ответов 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?
Ответы
Ответ 1
Принудительные ответы без правильного пути
Существует поддерживаемый способ отключения кодировки: вам просто нужно удалить заголовок Transfer-Encoding
, используя request.removeHeader(name):
response.removeHeader('transfer-encoding');
Node.js будет уважать независимо от того, что. Там даже test, чтобы кто-то случайно не изменил это поведение, поэтому я считаю, что это довольно безопасно.
Таким образом, вы можете просто придерживаться попытки №1, но делать это, как описано выше.
Ответ 2
В моих целях я нашел простой способ отключить принудительное использование chunked, используя недокументированное свойство объекта ответа:
response.useChunkedEncodingByDefault = false;
Это так просто. Конечно, полагаться на это свойство, чтобы быть доступным для будущих версий Node.js, не самый лучший. Возможно, есть лучшее решение, но сейчас это работает для меня.