未收到 http POST 消息 body

http POST message body not received

我目前正在创建一个 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

此代码在处理来自网页的 post 请求后生成 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

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

谢谢!

while True:

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

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

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