2015-08-12 6 views
3

В настоящее время я пишу HTTP-клиент для выполнения HTTP-POST по URL-адресу, который возвращает HTTP-ответ.Как сообщить HTTP-серверу, что он не отправляет закодированную кодировку

Тем не менее, для сообщений об ошибках 400 и 500 он отправляет обратно не ответивший HTTP-ответ, а для сообщений о успехе - 201, он отправляет ответный ответ.

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

 headerList.append("POST /v2/charges HTTP/1.1") 
     headerList.append("Content-Type: application/json") 
     headerList.append("host: xxxxxxxxx") 
     headerList.append("request-id: ABCD001123") 
     headerList.append("Content-length: %d" %len(Msg)) 
     hostReqHeader = "\r\n".join(headerList) 
     reqData = hostReqHeader + '\r\n\r\n' + qbPosMsg 

Я использую сокеты для отправки этих HTTP-сообщений, а не с помощью библиотеки httplib или запросов.

+0

Плохая новость: [RFC7230, ¶4.1] (http://tools.ietf.org/html/rfc7230#section-4.1), "* Получатель ДОЛЖЕН быть в состоянии разобрать и декодировать кодировку с перекосом . * «Таким образом, нет общего стандартного способа предотвращения кодирования с чередованием. Я полагаю, что может быть какой-то способ, характерный для вашего сервера и вне рамок стандарта. Какой сервер вы используете? –

+0

См. Также ¶4.3, "* Клиент НЕ ДОЛЖЕН посылать имя кодированного кодированного перевода в TE, chunked всегда приемлемо для получателей HTTP/1.1. *" –

ответ

2

Chunked - обязательная функция HTTP/1.1. Если вам не нужны какие-либо другие 1,1-специфические особенности, указать HTTP/1.0 в запросе:

headerList.append("POST /v2/charges HTTP/1.0") 
0

Content-Length заголовок вы задаете в запросе применяется к запросу, а не ответ сервера.

Чанк-кодированное кодирование никогда не используется для HTTP-запроса, только для ответа, и только когда клиент указывает HTTP/1.1 в качестве протокола.

Если ваш клиент не поддерживает поддерживаемые ответы, просто укажите HTTP/1.0 в качестве протокола в вашем запросе (замените HTTP/1.1 на HTTP/1.0 в вашем коде).

Нет ничего плохого в использовании HTTP 1.0. HTTP 1.0 остается весьма полезным для возможности писать простые клиенты с несколькими строками кода, которые могут запросить все современные веб-серверы. Поэтому в этой ситуации это вполне уместно. Я думаю, что это красота HTTP, что базовый протокол настолько прост. HTTP 1.1 и HTTP 2.0 постепенно увеличивают сложность с точки зрения возможности записи клиента, который их поддерживает, но вся эта сложность необязательна - HTTP 1.0 все еще можно использовать.

 Смежные вопросы

  • Нет связанных вопросов^_^