0

我看过了,也许我错过了。我目前有一个文件,如下所示:

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 中我可以使用requestwhere “body can be a file object”。但从描述看来,它似乎仍然单独发送标头,并且该文件仅用于正在发送的数据。

谢谢

4

1 回答 1

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()

编辑:事实证明,有一些内部状态的东西使它无法按原样工作,这是一个解决方法(谷歌主页的完整示例),但它有点像黑客。httplib使用 Python 2.6 和 2.7 进行测试,仅通过替换为3.x 似乎不起作用http.client

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(mangled name) 设置为httplib._CS_REQ_SENTafter call send()

于 2013-01-10T17:21:19.230 回答