python - 未收到 http POST 消息正文

标签 python sockets http http-1.1

我目前正在创建一个 python 套接字 http 服务器,并且我正在处理我的 GET 和 POST 请求。我的 GET 实现工作正常,但 POST 请求的 body 元素不会显示。 代码片段:

self.host = ''
self.port = 8080

self.listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.listener.bind((self.host, self.port))
self.listener.listen(1)

while True:

        client_connection, client_address = self.listener.accept()
        request = client_connection.recv(2048)
        print request

此代码在处理来自网页的发布请求后生成 http header :

POST /test.txt HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Origin: http://localhost:8080
Content-Length: 21
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/601.6.17 (KHTML, like Gecko) Version/9.1.1 Safari/601.6.17
Referer: http://localhost:8080/
Accept-Language: nb-no
Accept-Encoding: gzip, deflate

但是没有正文,所以问题是为什么我知道它已发送但没有收到 http 正文?

谢谢!

最佳答案

while True:

        client_connection, client_address = self.listener.accept()
        request = client_connection.recv(2048)
        print request

recv 不完全读取 2048 字节,但最多读取 2048 字节。如果一些数据到达,即使后面可能有更多数据,recv 也会与数据一起返回。我的猜测是,在您的情况下,客户端首先发送 HTTP header ,然后发送正文。如果 NAGLE 算法在客户端关闭(常见),则您的第一个 recv 可能只会获取 header ,而您需要另一个 recv 来获取正文。这将解释你的情况发生了什么:你得到了标题而不是正文,因为你没有做另一个 recv

但即便如此,实现起来也过于简单,迟早会出错。要使其正确,您应该正确实现 HTTP 协议(protocol):首先读取 HTTP header ,如果 header 很大,则可能需要多个 recv。然后您应该解析 header ,计算出正文的大小(Content-length header )并读取剩余的字节。

关于python - 未收到 http POST 消息正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39518577/

相关文章:

c++ - 需要 boost :asio async server with receiver and acceptor 的例子

c# - 开始了解 Web 套接字和 http 请求(和 STOMP)

android - Cordova:创建套接字服务器

http - 哪种服务器类型最适合 "validation server"?

http - 我想将文档通过管道传输到 pdfutils 并通过 http POST

python - 如何查看是否是周一至周五,时间是否在上午 10 点至下午 3 点之间?

android - Android Studio 重构和基本搜索/替换之间有什么区别?

python - 了解 Keras LSTM

python - Django 'Cannot add foreign key constraint' 执行 makemigrations 操作时出错

php - 当页面不存在时如何发送对 URL 的响应?