未收到 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)并读取剩余的字节。
我目前正在创建一个 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)并读取剩余的字节。