2011-10-08 6 views
18

estoy haciendo una solicitud utilizando urllib2 y la HTTPBasicAuthHandler así:cómo depurar solicitud urllib2 que utiliza un controlador de autenticación básica

import urllib2 

theurl = 'http://someurl.com' 
username = 'username' 
password = 'password' 

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, theurl, username, password) 

authhandler = urllib2.HTTPBasicAuthHandler(passman) 
opener = urllib2.build_opener(authhandler) 
urllib2.install_opener(opener) 

params = "foo=bar" 

response = urllib2.urlopen('http://someurl.com/somescript.cgi', params) 

print response.info() 

Actualmente estoy recibiendo una excepción httplib.BadStatusLine cuando se ejecuta este código. ¿Cómo podría llevar a cabo la depuración? ¿Hay alguna manera de ver cuál es la respuesta sin procesar independientemente del código de estado HTTP no reconocido?

Respuesta

26

¿Ha intentado establecer el nivel de depuración en su propio controlador HTTP? Cambiar el código para algo como esto:

>>> import urllib2 
>>> handler=urllib2.HTTPHandler(debuglevel=1) 
>>> opener = urllib2.build_opener(handler) 
>>> urllib2.install_opener(opener) 
>>> resp=urllib2.urlopen('http://www.google.com').read() 
send: 'GET/HTTP/1.1 
     Accept-Encoding: identity 
     Host: www.google.com 
     Connection: close 
     User-Agent: Python-urllib/2.7' 
reply: 'HTTP/1.1 200 OK' 
header: Date: Sat, 08 Oct 2011 17:25:52 GMT 
header: Expires: -1 
header: Cache-Control: private, max-age=0 
header: Content-Type: text/html; charset=ISO-8859-1 
... the remainder of the send/reply other than the data itself 

Así que las tres líneas para anteponer son:

handler=urllib2.HTTPHandler(debuglevel=1) 
opener = urllib2.build_opener(handler) 
urllib2.install_opener(opener) 
... the rest of your urllib2 code... 

que mostrará el ciclo de envío/respuesta HTTP pura en stderr.

Editar comentario

hace este trabajo?

... same code as above this line 
opener=urllib2.build_opener(authhandler, urllib2.HTTPHandler(debuglevel=1)) 
... rest of your code 
+0

vi una mención alguna parte del parámetro '' debuglevel' para HTTPHandler', pero el sitio que estoy comunicando con necesidades de autenticación básica, y por lo que yo sé 'HTTPBasicAuthHandler' no tiene una depuración opción. ¿Hay algo mas que pueda hacer? He logrado encontrar la causa de mi problema (parámetros mal formados). – Acorn

+0

recuerde que los parámetros para [urllib2.build_opener()] (http://docs.python.org/library/urllib2.html#urllib2.build_opener) es una lista de cadenas. Puede etiquetar su controlador http de depuración en su controlador de autenticación ... Ver ejemplo. –

+0

Con 'urllib2.build_opener (authhandler, urllib2.HTTPHandler (debuglevel = 1))' Obtengo salida de depuración, pero el controlador de autenticación no funciona y obtengo un '401 no autorizado'. He intentado con el orden de los manejadores cambiar también (no estoy seguro de si eso haría alguna diferencia) y el comportamiento fue el mismo. – Acorn

Cuestiones relacionadas