我看了,也许我错过了。我目前有一个文件如下:
PUT /URL/TO/SEND/REQUEST
Host: 127.0.0.1
Connection: keep-alive
...
bunch of data here
此文件包含标题&我希望通过ssl发送的数据。我知道在Windows上我可以使用fiddler等..发送这个原始数据但我希望使用python。我试着在urllib2 urllib&上寻找(可能不够硬) httplib看看我是否可以发送此文件作为整个请求我不想处理解析文件等...这可能吗?
我注意到在httplib中我可以使用request
,其中“body可以是文件对象”。但是从描述看来它似乎仍然单独发送标题,该文件仅用于发送的数据。
由于
答案 0 :(得分:0)
没有记录,但看起来您应该可以使用httplib.HTTPConnection.send()
:
In [13]: httplib.HTTPConnection.send??
Type: instancemethod
String Form:<unbound method HTTPConnection.send>
File: /usr/local/lib/python2.7/httplib.py
Definition: httplib.HTTPConnection.send(self, data)
Source:
def send(self, data):
"""Send `data' to the server."""
if self.sock is None:
if self.auto_open:
self.connect()
else:
raise NotConnected()
if self.debuglevel > 0:
print "send:", repr(data)
blocksize = 8192
if hasattr(data,'read') and not isinstance(data, array):
if self.debuglevel > 0: print "sendIng a read()able"
datablock = data.read(blocksize)
while datablock:
self.sock.sendall(datablock)
datablock = data.read(blocksize)
else:
self.sock.sendall(data)
request()
方法组合了标题和正文,并将其传递给此函数,该函数看起来应该处理字符串或文件对象。
当然,您仍然需要知道主机,以便您可以创建HTTPConnection
对象,因此您的代码可能看起来像这样(未经测试):
import httplib
conn = httplib.HTTPConnection('127.0.0.1')
conn.send(open(filename))
response = conn.getresponse()
编辑:事实证明,有一些内部状态可以阻止此工作,这是一种解决方法(谷歌主页的完整示例),但它有点像黑客攻击。使用Python 2.6和2.7进行测试,只需将httplib
替换为http.client
,就无法在3.x上运行:
import httplib
conn = httplib.HTTPConnection('www.google.com')
conn.send('GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n')
conn._HTTPConnection__state = httplib._CS_REQ_SENT
response = conn.getresponse()
此处的关键部分是在致电conn.__state
后将httplib._CS_REQ_SENT
(受损名称)设置为send()
。