【发布时间】:2019-04-18 11:31:56
【问题描述】:
我正在尝试从 POST 请求的正文中获取参数 first 和 last。基本上我有一个套接字服务器。此套接字服务器在连接时获取客户端并生成文件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() 的开头停止阅读,我需要在没有任何其他模块的情况下这样做
【问题讨论】:
-
解析 HTTP/1.1 消息很困难,因为标头块的文本性质以及分隔消息的各种方式。尝试编写自定义解析器可能是个坏主意。在任何情况下,请参阅 RFC 7230 (greenbytes.de/tech/webdav/rfc7230.html#rfc.section.3.3.3) 的第 3.3.3 节
-
您在循环的每次迭代中都调用了两次
readline(),这意味着您将丢弃每隔一行! -
@SamMason 是的,我非常快地起草了代码,感谢您指出。我现在已经编辑过了。谢谢指出
标签: python http post http-post