Если клиент HTTP / 1.0 запрашивает Connection: keep-alive, будет ли он понимать кодировку фрагментов?

Если мой HTTP-сервер получает запрос HTTP / 1.0 с заголовком «Connection: keep-alive», справедливо ли предположить, что клиент поймет «Transfer-Encoding: chunked»?

По сути, я пытаюсь решить, следует ли учитывать заголовок «Connection: keep-alive» от клиентов HTTP / 1.0. Если я его соблюдаю, то мне придется использовать для ответа фрагментированное кодирование, потому что я не могу буферизовать весь ответ, чтобы вычислить заголовок Content-Length.

Если небезопасно ожидать, что клиент HTTP / 1.0, запрашивающий «Connection: keep-alive», также будет понимать фрагментированное кодирование, то мне придется закрывать соединение после каждого ответа. (Или я что-то пропустил?)


person Ian Goldby    schedule 23.05.2012    source источник


Ответы (3)


Это окончательное «Нет». Цитата из спецификации:

Однако постоянное соединение с клиентом HTTP / 1.0 не может использовать кодирование передачи по частям и, следовательно, ДОЛЖНО использовать Content-Length для маркировки конечной границы каждого сообщения.

- RFC 2068 §19.7.1

person Benxamin    schedule 29.03.2013

В HTTP 1.0 невозможно фрагментированное кодирование передачи. Запросы проверки активности с фрагментированным кодированием передачи на самом деле являются одним из определяющих различий между HTTP 1.0 и 1.1.

Чтобы сервер мог использовать какую-то функцию, которую поддерживают не все клиенты, например, keep-alive или фрагментированное кодирование передачи, он должен был бы знать до начала своего ответа, что клиент совместим с этой функцией, потому что нет текущих двусторонняя связь между клиентом и сервером после первоначального запроса.

  • Сам Keep-Alive может поддерживаться в HTTP 1.0, поскольку клиент может включать в запрос заголовок Keep-Alive, указывающий серверу, что клиент его поддерживает.

  • Для клиента HTTP 1.0 не существует установленного способа указать, что он поддерживает фрагментированное кодирование передачи, поэтому сервер не может отправлять фрагментированные ответы на запросы HTTP 1.0. Если вы отправите фрагментированный ответ клиенту, который его не понимает, клиент получит мусор.

    Когда HTTP 1.0 использует keep-alive, он делает это без фрагментированного кодирования передачи.

  • Когда для проверки активности нельзя использовать фрагментированное кодирование передачи, он должен отправлять заголовок Content-Length для каждого ответа. Это означает, что поддержка активности может быть возможна в HTTP 1.0 только в том случае, если серверу известна длина содержимого ответа в начале ответа, чтобы сгенерировать допустимый заголовок Content-Length. Это может быть не так, если ответ генерируется сценарием, и сервер не буферизует его полностью перед его отправкой.

    Если сервер не знает длину содержимого ответа перед его отправкой, сервер просто отключает поддержку активности для этого ответа. Для сервера не обязательно делать каждый ответ ответом проверки активности, когда это возможно.

  • Клиенты HTTP 1.1 обязаны поддерживать как keep-alive, так и фрагментированное кодирование передачи, поэтому при выполнении запроса HTTP 1.1 клиент просто указывает HTTP / 1.1 в качестве протокола и не указывает заголовок Keep-Alive.

    На практике клиент может по-прежнему отправлять заголовок keep-alive, поэтому он может использовать keep-alive, даже если сервер поддерживает только HTTP 1.0. Если сервер поддерживает HTTP 1.1 или выше, этот заголовок будет проигнорирован, а индикатор протокола HTTP / 1.1 будет иметь приоритет. Примечание. Я считаю, что сегодня сервер очень редко не поддерживает HTTP 1.1 или выше, но по-прежнему поддерживает keep-alive, поэтому его отправка редко бывает полезной.

person thomasrutter    schedule 24.01.2014

Определенно нет, учитывая, что Transfer-Encoding есть только в HTTP 1.1. Учитывая вашу ситуацию, я не думаю, что вы действительно можете поддерживать заголовок Connection: keep-alive для клиента HTTP 1.0 (для вашего варианта использования он иначе поддерживается HTTP 1.0). Вам следует просто проигнорировать это и закрыть соединение. Вы будете в безопасности, так как на самом деле это всего лишь оптимизация.

person Francis Upton IV    schedule 23.05.2012
comment
Keep-alive совершенно надежен в HTTP 1.0, когда клиент соглашается, отправляя заголовок keep-alive в запросе - сервер просто не может ответить с фрагментированной кодировкой передачи. Следовательно, он должен иметь Content-Length для каждого ответа, чтобы иметь возможность использовать keep-alive. - person thomasrutter; 24.01.2014
comment
Верно, вот что он спрашивает, весь смысл вопроса был связан с фрагментированным кодированием, поэтому я не понимаю, почему голосование против. - person Francis Upton IV; 24.01.2014
comment
Ответ, по-видимому, подразумевает, что HTTP 1.0 не поддерживает keep-alive, но он поддерживает, просто не поддерживает разбиение на части. При повторном чтении я теперь вижу, что в ответе явно не указано, поддерживает ли HTTP 1.0 keep-alive или нет. Вероятно, что нет в ответе, должно быть определенно нет. - person thomasrutter; 25.01.2014