Проблема
Я обслуживаю ресурс неизвестной длины через 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?