我试图首先从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}},我需要在没有任何其他模块的情况下做到这一点
答案 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:]