未收到http POST消息正文

时间:2016-09-15 19:05:32

标签: python sockets http http-1.1

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

<%= link_to "like", like_post_path(post), method: :post %>

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

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正文?

谢谢!

1 个答案:

答案 0 :(得分:0)

while True:

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

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

但即使这样也是一个过于简单的实施,迟早会出错。要正确实现,您应该正确实现HTTP协议:首先读取HTTP标头,如果标头很大,可能需要多个recv。然后你应该解析标题,找出正文的大小(Content-length标题)并读取剩余的字节。