HTTP请求内容为空

时间:2017-08-15 16:14:43

标签: python sockets http

我正在使用HTTP套接字发送POST python个请求:

import socket

s = socket.socket(
    socket.AF_INET, socket.SOCK_STREAM)

s.connect(("127.0.0.1", 4001))

s.send(b'POST /session HTTP/1.1\r\nContent-Type:application/json\r\nUser-Agent: test/1\r\n\r\n{"desiredCapabilities": {}, "capabilities":{}}')
response = s.recv(10000)
print(response)

输出:

b'HTTP/1.1 200 OK\r\ncontent-length: 270\r\nContent-Type: application/json; charset=utf-8\r\nConnection: close\r\n\r\n{"sessionId":"72418bd14689c1cd9ee48706eada96a4","status":33,"value":{"message":"session not created exception: Missing or invalid capabilities\\n  (Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Linux 4.4.0-91-generic x86_64)"}}'

输出摘要 - 返回错误消息,指出我尝试发送的json对象丢失或不正确。

这就是我决定捕获请求的原因 mitmproxy

enter image description here

它没有内容,但它应该包含以下json内容:

{"desiredCapabilities": {}, "capabilities":{}}

我无法理解问题所在。我遵循了HTTP规范 - 在每个标题之后我放了CRLF\r\n),在最后一个标题(用户代理)之后我添加了CRLF,因为必须有1个身体内容前的空行。

Wiki HTTP message body

  

请求/状态行和标题必须以<CR><LF>结尾(即a   回车后跟换行)。空行必须包含   只有<CR><LF>而没有其他空格。

1 个答案:

答案 0 :(得分:1)

您发送的POST请求缺少Content-length标头,即您发送的请求无效。由于缺少Content-length标题,服务器可能无法知道正文结束的位置,并且可能认为根本没有正文,即远离预期。这也反映在您的评论中:“在摘要响应中表示缺少json对象”

我建议使用现有的HTTP库,而不是尝试直接使用套接字。 HTTP比大多数开发人员想象的要复杂得多。