6

Как я прочитал необработанный HTTP-адрес STRING. Я нашел несколько решений для чтения анализируемой версии сообщения, однако проект, над которым я работаю, отправляет необработанную полезную нагрузку xml без заголовка. Поэтому я пытаюсь найти способ читать данные сообщения, не анализируя его в массив значений = = значение.Python: BaseHTTPRequestHandler - Чтение исходного сообщения

ответ

11

Думаю, 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; 
+2

После того, как вы попытаетесь выполнить некоторые быстрые поисковые запросы, эти операции блокируют выполнение как для меня, так и для других. – kwolfe

+1

Необходимо указать длину контента: data = self.rfile.read (int (self.headers.getheader ('content-length'))) – kwolfe

+5

Да, извините. Это блокирование, потому что объект rfile является сокетом, и вызов 'read()' в основном говорит «читать, пока не осталось ничего, чтобы читать», но есть еще что читать, пока сокет открыт, поэтому он зависает и ждет входящего контента , Серверы избегают повесить ВСЕГДА, указывая, КАК МНОГО содержимое читать. Извините, я должен был положить это в первую очередь. – smakateer

13

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» только.

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

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

+0

Пожалуйста, будьте более подробными, я понятия не имею, что вы предлагаете. –

+1

@jb: Я добавил дополнительные сведения к ответу. Дайте мне знать, если есть что-то конкретное, которое еще нужно разработать. –

+0

@SindhuriKuppasad, имя заголовка не зависит от регистра. Следующие утверждения возвращают длину содержимого в моих тестах: 'self.headers.getheader ('content-length')' и 'self.headers.getheader ('content-LENGTH')' – famzah

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