Как заставить 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() 
  • Как получить больше мест?
  • Почему я получаю эту ошибку в python? (HTTPLIB)
  • Python, механизация, правильный синтаксис для установки нескольких заголовков?
  • Ограничение размера ответа с помощью httplib2
  • imgurpython.helpers.error.ImgurClientRateLimitError: предел превышен
  • Использование модуля запросов Python для отправки формы без имени ввода
  • Python, Flask: как настроить заголовок ответа для всех ответов
  • Python 3.3 HTTP Cookie Error
  • Ошибка при использовании conn = httplib.HTTPConnection ("http: // ipaddr: port")
  • Поиск Google возвращает None 302 на AppEngine
  • Как вернуть изображение в HTTP-ответе с помощью CherryPy
  •  
    Interesting Posts for Van-Lav

    Как напечатать строку без включения '\ n' в Python

    «EOL во время сканирования строки с одним кавычком»? (обратная косая черта в строке)

    Parse config files, environment и аргументы командной строки, чтобы получить один набор параметров

    Как проверить, есть ли у моего Python все необходимые пакеты?

    Каков правильный способ лечения Python argparse.Namespace () в качестве словаря?

    Как автоматически запускать поток

    Функция для сопоставления значений в нескольких столбцах

    Параметрическая проверка подлинности

    Переменные Globals и многопроцессорность Python

    Функции, вызываемые объекты и как они созданы в Python

    Извлечение XML в фрейм данных с родительским атрибутом в качестве заголовка столбца

    Постройте график, очистите его оси, затем постройте новый график

    Освобождение от копирования Networkx

    Как заменить первые n элементов в каждой строке кадра данных, которые превышают определенный порог

    Перечитайте открытый файл Python

    Python - лучший язык программирования в мире.