Как заставить http.client отправлять chunked-encoding HTTP body в python?

Я хочу отправить chunked тело HTTP для проверки моего собственного HTTP-сервера. Поэтому я написал этот код python:

import http.client body = 'Hello World!' * 80 conn = http.client.HTTPConnection("some.domain.com") url = "/some_path?arg=true_arg" conn.request("POST", url, body, {"Transfer-Encoding":"chunked"}) resp = conn.getresponse() print(resp.status, resp.reason) 

Я ожидаю, что тело запроса HTTP будет передано, но я захватил сетевой пакет с Wireshark, тело HTTP-запроса не передано.

Как передать chunked тело http.client lib в python?

2 Solutions collect form web for “Как заставить http.client отправлять chunked-encoding HTTP body в python?”

Хорошо, я понимаю.

Во-первых, напишите мою собственную функцию chunked encode.

Затем используйте putrequest (), putheader (), endheaders () и send () вместо запроса ()

 import http.client def chunk_data(data, chunk_size): dl = len(data) ret = "" for i in range(dl // chunk_size): ret += "%s\r\n" % (hex(chunk_size)[2:]) ret += "%s\r\n\r\n" % (data[i * chunk_size : (i + 1) * chunk_size]) if len(data) % chunk_size != 0: ret += "%s\r\n" % (hex(len(data) % chunk_size)[2:]) ret += "%s\r\n" % (data[-(len(data) % chunk_size):]) ret += "0\r\n\r\n" return ret conn = http.client.HTTPConnection(host) url = "/some_path" conn.putrequest('POST', url) conn.putheader('Transfer-Encoding', 'chunked') conn.endheaders() conn.send(chunk_data(body, size_per_chunk).encode('utf-8')) resp = conn.getresponse() print(resp.status, resp.reason) conn.close() 

Я бы предположил, что, если вы уже знаете размер ваших данных, как в ответе, вы можете просто установить Content-Length и отправить его обратно за один раз, что похоже на то, что вы делаете с одним вызовом conn.send любом случае.

Копирование с чередующимися передачами наиболее полезно, когда вы не знаете, насколько велики данные, например, динамически созданный контент. Я изменил ваш код, чтобы проиллюстрировать:

 import httplib def write_chunk(conn, data): conn.send("%s\r\n" % hex(len(data))[2:]) conn.send("%s\r\n" % data) def dynamically_generate_data(): for i in range(80): yield "hello world" conn = httplib.HTTPConnection("localhost") url = "/some_path" conn.putrequest('POST', url) conn.putheader('Transfer-Encoding', 'chunked') conn.endheaders() for new_chunk in dynamically_generate_data(): write_chunk(conn, new_chunk) conn.send('0\r\n') resp = conn.getresponse() print(resp.status, resp.reason) conn.close() 
  • imgurpython.helpers.error.ImgurClientRateLimitError: предел превышен
  • Как загрузить файл с помощью urllib.request в Python 3?
  • Как отправить запрос без заголовка «Host Header» с помощью Python?
  • urlencode массив значений
  • Является ли это ошибкой, чтобы опустить заголовок Accept * / * в HTTP / 1.0 Request для REST API
  • запросы python - POST Multipart / form-data без имени файла в HTTP-запросе
  • Какой протокол следует использовать для потоковой передачи аудио (не вживую)?
  • Источник страницы загрузки страницы Python
  • Python - лучший язык программирования в мире.