ストリーミング方式でデータを取得して処理するための非常に単純な概念実証を開発しようとしています。私が要求しているサーバーはデータをチャンクで送信しますが、これは良いことですがhttplib
、チャンクを反復するために使用する際に問題が発生しています。
ここに私がしようとしているものがあります: import httplib
def getData(src):
d = src.read(1024)
while d and len(d) > 0:
yield d
d = src.read(1024)
if __name__ == "__main__":
con = httplib.HTTPSConnection('example.com', port='8443', cert_file='...', key_file='...')
con.putrequest('GET', '/path/to/resource')
response = con.getresponse()
for s in getData(response):
print s
raw_input() # Just to give me a moment to examine each packet
ものすごく単純。サーバーへの HTTPS 接続を開き、リソースを要求し、一度に 1024 バイトの結果を取得するだけです。HTTPS 接続は確実に成功しているので、まったく問題ありません。
しかし、私が見つけたのは、への呼び出しがsrc.read(1024)
毎回同じものを返すということです。応答の最初の 1024 バイトのみを返し、明らかにファイル内のカーソルを追跡しません。
では、一度に 1024 バイトを受信するにはどうすればよいでしょうか? のドキュメントread()
はかなりまばらです。urllib または urllib2 を使用することを考えましたが、どちらも HTTPS 接続を確立できないようです。
HTTPS が必要です。私はかなり制限された企業環境で働いており、Requestsのようなパッケージを手に入れるのは少し難しいです。可能であれば、Python の標準ライブラリ内で解決策を見つけたいと思います。
// ビッグ・オールド・ファット・エディット
元のコードでは、d
変数を更新するのを単に忘れていたことがわかりました。ループ外の読み取りで初期化し、yield
ループ内で変更しませんでした。そこに再度追加すると、完全に機能しました。
つまり、要するに、私はただの大馬鹿です。