2010-12-10 10 views
22

He buscado en todas partes y encontré millones de servidores proxy de python, pero ninguno hace exactamente lo que me gustaría (creo: s)Serpiente HTTP python seriamente simple?

He tenido bastante experiencia con python en general, pero soy bastante nuevo en el mundo de los oscuros y profundos secretos del protocolo HTTP.

Lo que creo que podría ser útil sería un ejemplo de proxy muy simple al que se pueda conectar y que a continuación intente conectar con la dirección que se le haya transmitido.

Además, creo que lo que me ha estado confundiendo es todo lo que hacen las cosas ocultas, p. si la clase hereda de BaseHTTPServer.BaseHTTPRequestHandler qué ocurre exactamente cuando se solicita una página, como en muchos de los ejemplos que he encontrado, no hay referencia a la variable de ruta, ¡entonces de repente poof! self.path se usa en una función. Supongo que ha sido heredado, pero ¿cómo termina con la ruta utilizada?

lo siento si eso no tiene mucho sentido, ya que mi idea de mi problema es, probablemente, revueltos :(

si se puede pensar en otra cosa que haría que mi pregunta más clara por favor, por favor, sugiera lo añado. xxx

Editar:

Además, un enlace a una explicación de los procesos detallados a través del cual el proxy controla la solicitud, solicita la página (cómo leer/modificar los datos en este punto) y lo pasa a la el solicitante original sería muy apreciado xxxx

+0

Si hay alguna modificación de la solicitud o la respuesta que desea realizar, debe detallar el proceso. P.ej. dado el URL que le pasaron, ¿cómo determina la URL a la que desea conectarse? (no diga "lo mismo", ya que eso le correspondería). –

+0

umm, para elaborar, quise decir el filtrado de URL, el acceso a los datos para algo como conteo de palabras ponderado, o quizás para editar arbitrariamente (aún general, pero simplemente acceder a él como una cadena es realmente necesario) – jma

Respuesta

26

"un ejemplo de proxy muy simple al que se puede conectar y que intentará conectarse a la dirección que se le pasó". Esa es prácticamente la definición de un proxy HTTP.

Hay una realmente ejemplo sencillo de proxy aquí: http://effbot.org/librarybook/simplehttpserver.htm

El núcleo de la misma se encuentra a sólo 3 líneas:

class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler): 
    def do_GET(self): 
     self.copyfile(urllib.urlopen(self.path), self.wfile) 

lo que es una SimpleHTTPRequestHandler que, en respuesta a una petición GET, se abre la URL en la ruta (una solicitud a un proxy generalmente se ve como "GET http://example.com/", no como "GET /index.html"). Luego solo copia todo lo que puede leer de esa URL a la respuesta.

No es que esto es realmente mínimo. No se trata de encabezados en absoluto, creo.

BTW: path se documenta en http://docs.python.org/library/basehttpserver.html. Se configuró antes de llamar al método do*.

+0

Eso fue increíblemente rápido gracias ¡¡¡¡tú!!!! sí, perdón por el longwindedness ..... xx – jma

+0

más allá de lo que dice esa página, estaba pensando ¿tienes alguna pista sobre cómo editar los datos? estaba pensando en rfile/wfile, pero no tengo idea de dónde debería colocarse esto en un script, si es lo correcto xxx – jma

+2

Para un manejo mínimo del encabezado (ni siquiera obtienes 200 OK con esto), agrega 'self .send_response (200) 'y' self.end_headers() 'como las dos primeras líneas de' do_GET() '. (Sin ellos, 'ab' considera que las solicitudes han fallado). – mjs

11

Desde el twisted Wiki

from twisted.web import proxy, http 
from twisted.internet import reactor 
from twisted.python import log 
import sys 
log.startLogging(sys.stdout) 

class ProxyFactory(http.HTTPFactory): 
    protocol = proxy.Proxy 

reactor.listenTCP(8080, ProxyFactory()) 
reactor.run() 
4

proxpy parece bastante prometedora, es muy fácil de ajustar las solicitudes y respuestas.

+2

+1. Si desea un proxy que reenvía la solicitud exacta (incluidos encabezados y todo), pero desea poder modificar la solicitud, entonces desea algo como ProxPy. –