2016-07-27 11 views
1

Ich richte einen HTTP-Proxy in Python ein, um Web-Inhalte zu filtern. Ich habe eine good example auf StackOverflow gefunden, die genau dies unter Verwendung Twisted tut. Ich benötige jedoch einen anderen Proxy, um auf das Web zuzugreifen. Daher muss der Proxy Anforderungen an einen anderen Proxy weiterleiten. Was ist der beste Weg, dies mit twisted.web.proxy zu tun?Twisted - Weiterleiten von Proxy-Anforderungen an einen anderen Proxy (Proxy-Kette)

Ich fand a related question, die etwas ähnliches benötigt, aber von einem Reverse-Proxy.

Meine beste Schätzung ist, dass es möglich sein sollte, einen verketteten Proxy zu erstellen, indem Sie ändern oder ableiten, um eine Verbindung zum nächsten Proxy herzustellen, anstatt direkt mit dem Web zu verbinden. Leider habe ich keine Hinweise in der Dokumentation dazu gefunden.

Der Code, den ich bisher haben (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() 

Antwort

0

Dies ist eigentlich nicht schwer, mit Verdrehte zu implementieren. Lassen Sie mich Ihnen ein einfaches Beispiel geben.

Angenommen, der erste Proxy ist proxy1.py, wie der Code, den Sie in Ihre Frage eingefügt haben; der zweite Proxy ist proxy2.py.

Für proxy1.py müssen Sie nur die process-Funktion der Klasse ProxyRequest überschreiben. Wie folgt aus:

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) 

Für proxy2.py, brauchen Sie nur eine weitere einfache Proxy einzurichten. Ein Problem muss jedoch bemerkt werden, Sie müssen möglicherweise process Funktion in proxy2.py erneut überschreiben, da die self.uri möglicherweise nicht gültig nach dem Proxy Forward (Kette).

Zum Beispiel sollte das Original self.urihttp://www.google.com/something?para1=xxx sein, und Sie können es nur als /something?para1=xxx finden, bei zweiten Proxy. Sie müssen daher die Host-Informationen aus self.headers extrahieren und die self.uri ergänzen, damit Ihr zweiter Proxy sie normalerweise an das richtige Ziel liefern kann.

Verwandte Themen