Python通过443发送数据包

2024-04-23 13:54:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我看过,也许错过了。我现在有一个类似于下面的文件:

PUT /URL/TO/SEND/REQUEST
Host: 127.0.0.1
Connection: keep-alive
...

bunch of data here

此文件包含我要通过ssl发送的头和数据。我知道在窗户上我可以用提琴等。。但我希望用python发送原始数据。我试着查看(可能还不够难)urllib2urllib&httplib,看看是否可以将这个文件作为我不想处理的整个请求来发送,等等。。。这可能吗?在

我注意到,在httplib中,我可以使用request,其中“body可以是一个文件对象”。但是从描述来看,它似乎仍然单独发送头,而该文件仅用于发送的数据。在

谢谢


Tags: 文件ofto数据sendhosturldata
1条回答
网友
1楼 · 发布于 2024-04-23 13:54:22

虽然没有文档记录,但看起来您应该能够使用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对象,因此您的代码可能如下所示(未测试):

^{pr2}$

编辑:事实证明,有一些内部状态的东西使它无法正常工作,这里有一个解决方法(google主页的完整示例),但这有点麻烦。使用Python2.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()

这里的关键部分是在调用send()之后将conn.__state(损坏的名称)设置为httplib._CS_REQ_SENT。在

相关问题 更多 >