2016-07-27 9 views
1

私は、Webコンテンツをフィルタするために、pythonでHTTPプロキシを設定しています。 StackOverflowでgood exampleが見つかりました。これは正確にはTwistedを使っています。しかし、Webにアクセスするには別のプロキシが必要です。したがって、プロキシは要求を別のプロキシに転送する必要があります。 twisted.web.proxyを使用してこれを行う最善の方法は何ですか?別のプロキシ(プロキシチェーン)へのツイストフォワーディングプロキシリクエスト

私はa related questionを見つけましたが、これに似たものが必要ですが、リバースプロキシです。

twisted.web.proxy.ProxyClientを変更またはサブクラス化して、Webに直接接続するのではなく、次のプロキシに接続することによって、連鎖したプロキシを構築できるようにすることをお勧めします。残念ながら、私はこれを行う方法に関する文書に手がかりを見つけませんでした。

私は今のところ(cite)持っているコードは:

from twisted.python import log 
from twisted.web import http, proxy 

class ProxyClient(proxy.ProxyClient): 
    def handleResponsePart(self, buffer): 
     proxy.ProxyClient.handleResponsePart(self, buffer) 

class ProxyClientFactory(proxy.ProxyClientFactory): 
    protocol = ProxyClient 

class ProxyRequest(proxy.ProxyRequest): 
    protocols = dict(http=ProxyClientFactory) 

class Proxy(proxy.Proxy): 
    requestFactory = ProxyRequest 

class ProxyFactory(http.HTTPFactory): 
    protocol = Proxy 

portstr = "tcp:8080:interface=localhost" # serve on localhost:8080 

if __name__ == '__main__': 
    import sys 
    from twisted.internet import endpoints, reactor 

    log.startLogging(sys.stdout) 
    endpoint = endpoints.serverFromString(reactor, portstr) 
    d = endpoint.listen(ProxyFactory()) 
    reactor.run() 

答えて

0

これは、ツイストを使用して実装し、実際に難しいことではありません。簡単な例をあなたに教えてください。

質問に貼り付けたコードのように、最初のプロキシがproxy1.pyであるとします。 第2プロキシはproxy2.pyです。

proxy1.pyの場合、ProxyRequestprocess機能を無効にするだけで済みます。このように:proxy2.pyについては

class ProxyRequest(proxy.ProxyRequest): 
    def process(self): 
     parsed = urllib_parse.urlparse(self.uri) 
     protocol = parsed[0] 
     host = parsed[1].decode('ascii') 
     port = self.ports[protocol] 
     if ':' in host: 
      host, port = host.split(':') 
      port = int(port) 
     rest = urllib_parse.urlunparse((b'', b'') + parsed[2:]) 
     if not rest: 
      rest = rest + b'/' 
     class_ = self.protocols[protocol] 
     headers = self.getAllHeaders().copy() 
     if b'host' not in headers: 
      headers[b'host'] = host.encode('ascii') 
     self.content.seek(0, 0) 
     s = self.content.read() 
     clientFactory = class_(self.method, rest, self.clientproto, headers, s, self) 
     if (NeedGoToSecondProxy): 
      self.reactor.connectTCP(your_second_proxy_server_ip, your_second_proxy_port, clientFactory) 
     else: 
      self.reactor.connectTCP(host, port, clientFactory) 

、あなただけの別の簡単なプロキシを設定する必要があります。問題は気付かれる必要があります。self.uriがプロキシ転送(チェーン)の後に有効でない可能性があるため、proxy2.pyprocess機能を再度オーバーライドする必要があります。

たとえば、元のself.urihttp://www.google.com/something?para1=xxxで、2番目のプロキシでは/something?para1=xxxと表示されます。したがって、self.headersからホスト情報を抽出し、self.uriを補完する必要があります。これにより、2番目のプロキシが正常に正しい宛先に配信できるようになります。

関連する問題