2011-06-27 15 views
9

Deseo escribir un proxy simple que mezcle el texto en el cuerpo de las páginas solicitadas. He leído partes de la documentación retorcida y algunas otras preguntas similares aquí en stackoverflow, pero soy un poco novato, así que todavía no lo entiendo.Necesita ayuda para escribir un proxy retorcido

Esto es lo que tengo ahora, no sé cómo acceder y modificar la página

from twisted.web import proxy, http 
from twisted.internet import protocol, reactor 
from twisted.python import log 
import sys 

log.startLogging(sys.stdout) 

class ProxyProtocol(http.HTTPChannel): 
    requestFactory = PageHandler 

class ProxyFactory(http.HTTPFactory): 
    protocol = ProxyProtocol 

if __name__ == '__main__': 
    reactor.listenTCP(8080, ProxyFactory()) 
    reactor.run() 

¿Me podría ayudar? Agradecería un ejemplo simple (por ejemplo, agregar algo al cuerpo, etc.).

Respuesta

6

Lo que hago es implementar un nuevo ProxyClient, donde modifico los datos después de que los descargué del servidor web, y antes de enviarlos al navegador web.

from twisted.web import proxy, http 
class MyProxyClient(proxy.ProxyClient): 
def __init__(self,*args,**kwargs): 
    self.buffer = "" 
    proxy.ProxyClient.__init__(self,*args,**kwargs) 
def handleResponsePart(self, buffer): 
    # Here you will get the data retrieved from the web server 
    # In this example, we will buffer the page while we shuffle it. 
    self.buffer = buffer + self.buffer 
def handleResponseEnd(self): 
    if not self._finished: 
    # We might have increased or decreased the page size. Since we have not written 
    # to the client yet, we can still modify the headers. 
    self.father.responseHeaders.setRawHeaders("content-length", [len(self.buffer)]) 
    self.father.write(self.buffer) 
    proxy.ProxyClient.handleResponseEnd(self) 

class MyProxyClientFactory(proxy.ProxyClientFactory): 
protocol = MyProxyClient 

class ProxyRequest(proxy.ProxyRequest): 
protocols = {'http': MyProxyClientFactory} 
ports = {'http': 80 } 
def process(self): 
    proxy.ProxyRequest.process(self) 

class MyProxy(http.HTTPChannel): 
requestFactory = ProxyRequest 

class ProxyFactory(http.HTTPFactory): 
protocol = MyProxy 

Espero que esto también funcione para usted.

+0

Cuando mi solicitud de proxy obtiene una respuesta de error 404, aparece un "Error no controlado en Diferido: Error: error.ruido.error.error: 404 no encontrado". ¿Cómo atrapo este error? –

Cuestiones relacionadas