4

Python3 で tornado を使用して非同期 http リバース プロキシを実装しようとしています。

ハンドラー クラスは次のとおりです。

class RProxyHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self):
        backend_url = 'http://backend-host/content.html'   # temporary fixed

        req = tornado.httpclient.HTTPRequest(
                                    url=backend_url)
        http_client = tornado.httpclient.AsyncHTTPClient()
        http_client.fetch(req, self.backend_callback)

    def backend_callback(self, response):
        self.write(response.body)
        self.finish()

content.html が小さい場合、このコードは正常に機能します。しかし、大きな content.html では、このコードは例外を発生させます:

ERROR:tornado.general:Reached maximum read buffer size

pycurl で大きなコンテンツを処理する方法を見つけました。ただし、Python3 では動作しないようです。

さらに、HTTPRequest に streaming_callback オプションを追加しました。ただし、バックエンド サーバーによってチャンクされた応答が無効になっている場合、コールバックは呼び出されません。

大きなコンテンツをどのように処理できますか?

ありがとう。

4

1 に答える 1

1

最大バッファサイズを設定する呼び出しにmax_buffer_size渡すことができるはずです。tornado.httpclient.AsyncHTTPClient() 50MB バッファの場合:

import tornado.ioloop
import tornado.web
from tornado.httpclient import AsyncHTTPClient
from tornado import gen
from tornado.web import asynchronous


class MainHandler(tornado.web.RequestHandler):
    client = AsyncHTTPClient(max_buffer_size=1024*1024*150)

    @gen.coroutine
    @asynchronous
    def get(self):
        response = yield self.client.fetch("http://test.gorillaservers.com/100mb.bin", request_timeout=180)
        self.finish("%s\n" % len(response.body))

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

更新: 完全なサンプル プログラムになりました。

于 2013-09-04T13:56:55.217 に答える