Как проверить строку, разделяющую тело и заголовок запроса POST? - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь получить параметры первым и последним из тела запроса POST.По сути у меня есть сокет-сервер.Этот сокет-сервер получает клиент при подключении и создает файл client= connection.makefile("wrb").

...
b'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0\r\n'
b'Accept-Language: en-US,en;q=0.5\r\n'
b'Referer: http://localhost:8080/app-index\r\n'
b'Content-Length: 22\r\n'
b'Upgrade-Insecure-Requests: 1\r\n'
b'first=dasda&last=dasda'

Теперь я просматриваю файл с помощью readline ().

while 1:
   line = client.readline()
   print(line)
   if("Content-Length" in line.decode("utf-8")):
      num=line.decode("utf-8")
   "if line doesnt have \n break":
      break
temp = client.read(int(num[16:])) 

Переменная num - это длина содержимого тела.Теперь я пытаюсь найти способ сломать время, когда оно достигает тела, и использовать read(num), чтобы прочитать содержимое тела, а затем обработать их дальше.

Я не знаю, где еще можнопойти с этим - если есть более эффективный способ чтения необработанных данных POST, я бы хотел услышать это, но я не могу использовать какие-либо модули или импорт (я бы хотел использовать модуль requests, но это просто не вариант).

Проблема с кодом выше в том, что когда дело доходит до тела, оно никогда не останавливается, потому что ищет последний \n.Я не могу добавить его к клиенту, потому что client.write() возвращает заголовок клиенту.

Я пробовал много вещей, я пробовал readline(), read(), readlines(), но дело в том же - мне нужно прекратить чтение в начале body() иМне нужно сделать это без каких-либо других модулей

1 Ответ

0 голосов
/ 18 апреля 2019

После реализации, аналогичной тому, как вы собираете Content-Length, не возможно ли сделать следующее?

#Example:
#b'first=john&last=doe'

decoded_line = client.readline().decode("utf-8")
while decoded_line:
   if("first=" in decoded_line):
        first_split = decoded_line.split('first=')
        second_split = first_split[1].split('&last=')
        first_value = second_split[0]

    if("last=" in decoded_line):
        first_split = decoded_line.split('&last=')
        last_value = first_split[1][:-1]

В случае, если линия существует:

first_value: должно содержать первое значение (из примера 'john')

last_value: должно содержать последнее значение (из примера 'doe')

UPDATE

Из-за неправильного понимания первого вопроса я добавил другое возможное решение ниже. Если вам требуются данные из других заголовков, реализация может быть расширена, чтобы обработать это - однако это прекратится, если (например) отсутствует Content-Length.

finished_parsing = False
content_length_line = ''

while not finished_parsing:
   line = client.readline().decode("utf-8")
   print(line)
   if("Content-Length" in line.decode("utf-8")):
       content_length_line = line
       finished_parsing = True

if content_length_line != '':
    content_length = content_length_line[16:]
...