Python: BaseHTTPRequestHandler - Читать необработанный пост

Как мне прочитать необработанный http пост STRING. Я нашел несколько решений для чтения разобранной версии поста, однако проект, над которым я работаю, представляет необработанную полезную нагрузку xml без заголовка. Поэтому я пытаюсь найти способ прочитать данные поста без разбора их на массив ключ => значение.

2 ответа

Решение

Я думаю self.rfile.read(self.headers.getheader('content-length')) должен вернуть необработанные данные в виде строки. Согласно документации непосредственно внутри класса BaseHTTPRequestHandler:

- rfile is a file object open for reading positioned at the
start of the optional input data part;

self.rfile.read(int(self.headers.getheader('Content-Length'))) вернет необработанные данные HTTP POST в виде строки.

Разбивая это:

  1. Заголовок "Content-Length" указывает, сколько байтов содержит данные HTTP POST.
  2. self.headers.getheader('Content-Length') возвращает длину содержимого (значение заголовка) в виде строки.
  3. Это должно быть преобразовано в целое число перед передачей в качестве параметра self.rfile.read() так что используйте int() функция.

Также обратите внимание, что имя заголовка чувствительно к регистру, поэтому его нужно указывать только как "Content-Length".

Редактировать: Очевидно, что поле заголовка не чувствительно к регистру (по крайней мере, в Python 2.7.5), что я считаю правильным поведением, поскольку https://tools.ietf.org/html/rfc2616 гласит:

Каждое поле заголовка состоит из имени, за которым следуют двоеточие (":") и значение поля. Имена полей не чувствительны к регистру.

Для python 3.7 у меня сработало следующее:

rawData = (self.rfile.read(int(self.headers['content-length']))).decode('utf-8')

С помощью других ответов на этот вопрос, а также на этот и этот. Последняя ссылка на самом деле содержит полное решение.

В read() метод на io.BufferedIOBaseобъект читается до EOF. Не все браузеры отправляют символ EOF (источник). Чтение байтов Content-Length - хорошее решение. Используя read1() метод тоже работал у меня. Он читает как можно больше за один неблокирующий вызов API.

Другие вопросы по тегам