如何测试将POST请求的正文和标题分开的行?

时间:2019-04-18 11:31:57

标签: python http post http-post

我试图首先从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(),但是事情是一样的-我需要在{的开头停止阅读{1}},我需要在没有任何其他模块的情况下做到这一点

1 个答案:

答案 0 :(得分:0)

按照与如何收集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')

更新

由于误解了第一个问题,我在下面添加了另一个可能的解决方案。如果您需要其他标头中的数据,则可以扩展实现以处理该问题-但是,如果(例如)缺少“ 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:]