简单的Python HTTP请求遇到ResponseNotReady怎么办?

1 投票
2 回答
5691 浏览
提问于 2025-04-17 07:43

我正在用Python写一个简单的脚本,目的是重放保存的HTTP请求

这是我的脚本:

import httplib

requestFileName = 'C:/Users/Owner/request.txt'
connectionURL = 'localhost:4059'

requestFile = open(requestFileName,'r')

connection = httplib.HTTPConnection(connectionURL)
connection.send(requestFile.read())

response = connection.getresponse()
print response.status + " " + response.reason

connection.close()

这是我的 request.txt 文件:

POST /ipn/handler.ashx?inst=272&msgType=result HTTP/1.0
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Host: mysite.com
Content-Length: 28
User-Agent: AGENT/1.0 (UserAgent)

region=website&compName=ACTL

当我运行这个脚本时,出现了这个错误信息:

Traceback (most recent call last):
  File "C:/Users/Owner/doHttpRequest.py", line 11, in <module>
    response = connection.getresponse()
  File "C:\Python27\lib\httplib.py", line 1015, in getresponse
    raise ResponseNotReady()
ResponseNotReady

不过,我的服务器确实收到了请求。我可以用调试工具查看服务器代码,看到请求已经正确发送,所有的头信息都在。

为什么我的脚本会显示 ResponseNotReady 呢?这并不是个大问题,因为我的脚本主要功能是重放保存的HTTP请求,但我希望能在脚本中输出一些基本信息,比如状态码,或者把响应的内容保存到某个地方。

2 个回答

1

这是我使用“socket”模块的一个例子,可能对某些人有用。

input_request_string = '''GET /cherry/mirror_simple HTTP/1.1\r\nContent-Length: 0\r\nHost: test-host.dom:8001\r\n\r\n'''

host = 'test-host.dom'
port = 8001

# Connect to the server
s = socket.socket()
s.connect((host, port))
s.send(request_string)

from httplib import HTTPResponse    
response = HTTPResponse(s)
response.begin()
body = response.read()
headers = str(response.msg)
s.close()
1

HTTPConnection.send 是用来发送 HTTP 请求中的数据部分的。所以,你只需要提供请求文件中的最后一行,而不是整个文件。

如果你想直接使用你的请求,那么应该使用 socket 模块,这样可以和服务器建立一个原始的连接。

撰写回答