Я обслуживаю ресурс неизвестной длины через Node.JS. Из-за этого заголовок Content-Length
не может быть установлен. Для HTTP 1.1 требуется, чтобы для ресурсов такого типа использовалось кодирование по частям. Node.JS знает об этом и отправляет мои данные с кодировкой передачи по частям самостоятельно со следующими заголовками:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: close
...
Все это прекрасно и хорошо для хорошо -клиентов. Тем не менее, у меня есть некоторые не -поэтому -хорошие клиенты (, а именно Android 2.2 и более ранние версии ), которые я должен поддерживать. Эти клиенты не поддерживают должным образом кодирование передачи по частям.
Моей первоначальной мыслью было установить кодировку на none
вот так:
response.writeHead(200, {'Transfer-Encoding': 'none'});
Это отключает автоматическое кодирование фрагментов Node.JS и поддерживает совместимость с большинством клиентов. Однако теперь у меня сломаны клиенты Android 2.3+, так как они просто кашляют и задыхаются, когда видят такой фиктивный заголовок кодировки передачи.
Когда я делаю запросы с HTTP/1.0
, сервер правильно возвращает ответ без фрагментированного кодирования :
HTTP/1.1 200 OK
Connection: close
...
. Это решает мою проблему и позволяет мне обслуживать поток, который работает для всех моих проблемных клиентов. Мне не нужно отправлять фиктивный заголовок для Transfer-Encoding
, и мне по-прежнему не нужно указывать длину содержимого.
Как заставить HTTP-сервер Node.JS всегда работать в режиме HTTP/1.0?