2017-02-12 25 views
0

Недавно я увидел вызов GET, у которого заголовок Transfer-Encoding был установлен на Chunked. То, что мы заметили из этого вызова, - это задержка, тогда 500 таймаут.HTTP GET с передачей-кодированием Chunked

Копаем глубже, мы показали это поведение 500, поступающих с веб-серверов ELB и Apache.

Обратите внимание, что если мы сделаем GET-вызов с Transfer-Encoding как Chunked и включим пустую полезную нагрузку, ELB в нашем случае позволит проходу пройти как обычно.

Учитывая, что эти веб-серверы ELB и Apache устраняют это поведение, мой вопрос отправляет Transfer-Encoding как Chunked по вызову HTTP GET или нет?

ответ

2

Заголовок Transfer-Encoding теперь находится под властью RFC 7230, section 3.3.1 (см также IANA Message Header Registry. Вы увидите, что этот заголовок является частью обрамления HTTP сообщения, поэтому оно справедливо для обоих, запросов и ответов.

Имея в помните, что GET requests may carry bodies, реакция сервера (ов) является абсолютно правильной. Что вызывает задержку, за которой следует 500, возможно, следующее: сервер будет ожидать тело, но не сможет его найти, поскольку кодированное в блоке представление пустая строка - это не пустая строка, а zero-sized chunk. В результате сервер переходит в таймаут.

+1

Имейте в виду также, что спецификация запрещает любую семантику присваивать значение тела запроса в GET. Следовательно, многие агенты (например, прокси) могут блокировать или блокировать запросы GET с помощью тел, поэтому рекомендуется избегать этого. – Adrien

+0

@Adrien while true, это немного выходит за рамки этого вопроса. Я хотел показать, что запросам 'GET' разрешено иметь тело * вообще *, и поэтому заголовок' Transfer-Encoding' не помещается здесь. – DaSourcerer

+0

Понял, как и Content-Length, наличие заголовка Transfer-Encoding: chunked request указывает, что есть тело, и оно должно быть завершено. – Adrien