Python - Twisted, Proxy and modifying content

后端 未结 2 503

So i\'ve looked around at a few things involving writting an HTTP Proxy using python and the Twisted framework.

Essentially, like some other questions, I\'d like to

相关标签:
2条回答
  • 2020-11-29 03:36

    To create ProxyFactory that can modify server response headers, content you could override ProxyClient.handle*() methods:

    from twisted.python import log
    from twisted.web import http, proxy
    
    class ProxyClient(proxy.ProxyClient):
        """Mangle returned header, content here.
    
        Use `self.father` methods to modify request directly.
        """
        def handleHeader(self, key, value):
            # change response header here
            log.msg("Header: %s: %s" % (key, value))
            proxy.ProxyClient.handleHeader(self, key, value)
    
        def handleResponsePart(self, buffer):
            # change response part here
            log.msg("Content: %s" % (buffer[:50],))
            # make all content upper case
            proxy.ProxyClient.handleResponsePart(self, buffer.upper())
    
    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
    

    I've got this solution by looking at the source of twisted.web.proxy. I don't know how idiomatic it is.

    To run it as a script or via twistd, add at the end:

    portstr = "tcp:8080:interface=localhost" # serve on localhost:8080
    
    if __name__ == '__main__': # $ python proxy_modify_request.py
        import sys
        from twisted.internet import endpoints, reactor
    
        def shutdown(reason, reactor, stopping=[]):
            """Stop the reactor."""
            if stopping: return
            stopping.append(True)
            if reason:
                log.msg(reason.value)
            reactor.callWhenRunning(reactor.stop)
    
        log.startLogging(sys.stdout)
        endpoint = endpoints.serverFromString(reactor, portstr)
        d = endpoint.listen(ProxyFactory())
        d.addErrback(shutdown, reactor)
        reactor.run()
    else: # $ twistd -ny proxy_modify_request.py
        from twisted.application import service, strports
    
        application = service.Application("proxy_modify_request")
        strports.service(portstr, ProxyFactory()).setServiceParent(application)
    

    Usage

    $ twistd -ny proxy_modify_request.py
    

    In another terminal:

    $ curl -x localhost:8080 http://example.com
    
    0 讨论(0)
  • 2020-11-29 03:42

    For two-way proxy using twisted see the article:

    http://sujitpal.blogspot.com/2010/03/http-debug-proxy-with-twisted.html

    0 讨论(0)
提交回复
热议问题