2009-07-23 15 views
19

Estoy escribiendo una aplicación web que usa varias API web de terceros, y deseo hacer un seguimiento de la solicitud de bajo nivel y las respuestas para el análisis de ad-hock. Así que estoy buscando una receta que logre que el urllib2 de Python registre todos los bytes transferidos a través de HTTP. Tal vez un Handler sub-clasificado?Cómo obtengo que urllib2 registre TODOS los bytes transferidos

+0

+1 Muy buena pregunta de python hace casi 2 años sin votos ascendentes. Es realmente extraño. Estoy buscando una respuesta yo mismo. En mi caso, me preocupan solo los encabezados HTTP, sin embargo. –

Respuesta

12

Bueno, he encontrado la manera de configurar el mecanismo integrado de depuración de la biblioteca:

import logging, urllib2, sys 

hh = urllib2.HTTPHandler() 
hsh = urllib2.HTTPSHandler() 
hh.set_http_debuglevel(1) 
hsh.set_http_debuglevel(1) 
opener = urllib2.build_opener(hh, hsh) 
logger = logging.getLogger() 
logger.addHandler(logging.StreamHandler(sys.stdout)) 
logger.setLevel(logging.NOTSET) 

Pero todavía estoy buscando una manera de volcar toda la información transferida.

2

Esto parece bastante complicado de hacer. No hay ganchos en urllib2, urllib o httplib (que se basa en esto) para interceptar datos de entrada o salida.

Lo único que se me ocurre, aparte de cambiar de táctica para usar una herramienta externa (de la que hay muchas, y la mayoría de las personas usa tales cosas), sería escribir una subclase de socket.socket en su propia nueva módulo (por ejemplo, "captura_conjunto") y luego inserte eso en httplib con "importación captura_consejo; importación httplib; httplib.socket = captura_conjunto". Tendría que copiar todas las referencias necesarias (cualquier cosa de la forma "socket.foo" que se utiliza en httplib) en su propio módulo, pero luego podría anular cosas como recv() y sendall() en su subclase para hacer lo que te gusta con los datos.

Probablemente surgirían complicaciones si usabas SSL, y no estoy seguro de si esto sería suficiente o si también tendrías que hacer tu propio socket._fileobject también. Sin embargo, parece factible, y leer detenidamente la fuente en httplib.py y socket.py en la biblioteca estándar le dirá más.

Cuestiones relacionadas