0

私は見ましたが、おそらく私はそれを見逃しました。現在、以下のようなファイルがあります。

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

bunch of data here

このファイルには、ssl 経由で送信するヘッダーとデータが含まれています。私はWindowsでフィドラーなどを使用できることを知っています..この生データを送信しますが、Pythonを使用したいと思っていました。urllib2 urllib & httplib を調べてみました (十分に難しいことではないかもしれません)。ファイルの解析などに対処したくないリクエスト全体としてこのファイルを送信できるかどうかを確認しました...これは可能ですか?

httplib ではrequest、「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()

編集:これがそのまま機能するのを妨げる内部状態の問題があることがわかりました。これは回避策です(Googleメインページの完全な例)が、少しハックです. httplibPython 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に (マングル名) を に設定することです。httplib._CS_REQ_SENTsend()

于 2013-01-10T17:21:19.230 に答える