Обслуживание ответов 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?

13
задан Brad 21 July 2012 в 05:13
поделиться