2009-07-23 10 views
19

Sto scrivendo un'app Web che utilizza diverse API Web di terze parti e desidero tenere traccia della richiesta e delle risposte di basso livello per l'analisi ad hoc. Quindi sto cercando una ricetta che permetta a urllib2 di Python di registrare tutti i byte trasferiti via HTTP. Forse un Handler sottoclassato?Come ottenere urllib2 per registrare TUTTI i byte trasferiti

+0

+1 Una domanda pitone molto carina è stata richiesta quasi 2 anni fa senza alcun upvotes. È davvero strano Sto cercando una risposta da solo. Nel mio caso, tuttavia, sono interessato solo alle intestazioni HTTP. –

risposta

12

Beh, ho trovato come impostare il meccanismo incorporato debug della 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) 

Ma sto ancora cercando un modo per scaricare tutte le informazioni trasferite.

2

Questo sembra piuttosto difficile da fare. Non ci sono hook in urllib2, urllib o httplib (su cui questo si basa) per intercettare i dati di input o di output.

L'unica cosa che mi viene in mente, oltre a cambiare tattica per usare uno strumento esterno (di cui ci sono molti e molte persone usano queste cose), sarebbe scrivere una sottoclasse di socket.socket nel proprio modulo (ad esempio, "capture_socket") e quindi inserirlo in httplib utilizzando "import capture_socket; import httplib; httplib.socket = capture_socket". Dovresti copiare tutti i riferimenti necessari (qualcosa del formato "socket.foo" che è usato in httplib) nel tuo modulo, ma poi potresti scavalcare cose come recv() e sendall() nella sottoclasse da fare cosa ti piace con i dati.

Probabilmente si verificherebbero complicazioni se si stesse utilizzando SSL, e non sono sicuro se questo sarebbe sufficiente o se si debba anche creare il proprio socket._fileobject. Sembra fattibile, tuttavia, e esaminare la fonte in httplib.py e socket.py nella libreria standard potrebbe dirti di più.

Problemi correlati