Hola Eduard,<br><br>He probado el código que recomiendas, pero no funciona. <br>Un print "hola mundo" (para hacer debug a mano) me dice que nunca se está llamando al método https_open(), y por tanto nunca estoy mandando la información del certificado PEM para autenticarme (creo).<br>
Parece que me está faltando algo. <br><br>Por cierto, el error que devuelve el server es un error implementado específico para la aplicación, no es un mensaje de error estándard que tenga significado para el común de los mortales. <br>
En concreto es SC=60. <br>Pero, como digo, significa que en los parámetros de la conexión no hay info de autenticación. <br><br>Muchas gracias de todas formas por tu respuesta. <br>Sigo googleando...<br>Saludos cordiales,<br>
Jose <br><br><br><br><br><div class="gmail_quote">El 23 de enero de 2011 07:50, Eduard Diaz <span dir="ltr"><<a href="mailto:eventgrafic@gmail.com">eventgrafic@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola jose,<br><br>Seria interesante que enviaras el mensaje de error para tener mas informacion<br><br>A veces es muy util activar el modo debuglevel en el opener:<div class="im"><br><br>opener = urllib2.build_opener(<br>
HTTPSClientAuthHandler('/tmp/pem_certificate', '/tmp/pem_certificate'),<br></div>
urllib2.HTTPHandler(debuglevel=1)<br> )<br><br>según la documentación, urllib2.urlopen envia conexiones HTTP/1.1 con Connection:close en el header<br><a href="http://docs.python.org/library/urllib2.html#urllib2.urlopen" target="_blank">http://docs.python.org/library/urllib2.html#urllib2.urlopen</a><br>
<br>Por lo que creo que el problema está en que cada llamada a connect se abre una nueva sesion y por eso en la segunda conexión no estas autenticado.<br><br>En estos casos normalmente no utilizo urlopen sino que como ya tienes el opener, utilizo request= urllib2.Request para crear el request, esto permite personalizar los headers mediante request.add_header y añadir los datos mediante request.add_data. <br>
<br>Una vez que el request tiene toda la información necesaria, haces la llamada mediante opener.open(request).read().<br><br>Esto se ha de repetir para cada consulta<br><br>Ejemplo:<div class="im"><br><br>opener = urllib2.build_opener(<br>
HTTPSClientAuthHandler('/tmp/pem_certificate', '/tmp/pem_certificate'),<br></div> urllib2.HTTPHandler(debuglevel=1)<br> )<br><br># primera conexion<br>req = urllib2.Request(url)<br># ... añadir el data ...<br>
req.add_data(data1)<br>print opener.open(req).read()<br><br># segunda conexion<br>req = urllib2.Request(url)<br># ... añadir el data ...<br>req.add_data(data2)<br>print opener.open(req).read()<br><br>Todo esto seria interesante implementarlo en una clase Client que conserve la sesión y que permita hacer las llamadas necesarias según se requiera<br>
<br>Por cierto, si te ha sido útil y encuentras la solución, te agradecería que lo publicaras en el hilo, para mi es interesante las comunicaciones entre servicios web y intercambiar las experiencias nos permite a todos profundizar en el tema<br>
<br>Un saludo<br><br><div class="gmail_quote">El 21 de enero de 2011 21:18, Jose Caballero <span dir="ltr"><<a href="mailto:jcaballero.hep@gmail.com" target="_blank">jcaballero.hep@gmail.com</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div class="h5">
Hola,<br><br>necesito enviar ciertos datos a un servidor mediante el método POST, y analizar la respuesta que el servidor me devuelve. <br>Este proceso se realiza varias veces, pasando distinta información en cada comunicación. <br>
<br>La comunicación se debe autenticar mediante un certificado PEM. <br><br>Lo estoy intentando con urllib/urllib2, con un código más o menos como el siguiente (parte copiado de un blog que encontré en google):<br><br>------------------------------------------------------------------------------------------------------------------------------<br>
<br>import urllib<br>import urllib2 <br>import httplib <br><br><br>def connect(url, data):<br><br> class HTTPSClientAuthHandler(urllib2.HTTPSHandler):<br> def __init__(self, key, cert):<br> urllib2.HTTPSHandler.__init__(self)<br>
self.key = key<br> self.cert = cert<br> <br> def https_open(self, req):<br> # Rather than pass in a reference to a connection class, we pass in<br> # a reference to a function which, for all intents and purposes,<br>
# will behave as a constructor<br> return self.do_open(self.getConnection, req)<br> <br> def getConnection(self, host, timeout=300):<br> return httplib.HTTPSConnection(host, key_file=self.key, cert_file=self.cert)<br>
<br> opener = urllib2.build_opener(HTTPSClientAuthHandler('/tmp/pem_certificate', '/tmp/pem_certificate') )<br> urllib2.install_opener(opener)<br> urlhandler = urllib2.urlopen(url, urllib.urlencode(data))<br>
ret = urlhandler.read()<br> <br> return ret<br><br><br>ret1 = connect(url, data1)<br>print ret1<br><br>ret2 = connect(url, data2)<br>
print ret2<br>
<br>
ret3 = connect(url, data3)<br>print ret3<br>
<br>------------------------------------------------------------------------------------------------------------------------------<br><br>Mi problema es que sólo la primera conexión funciona. <br>Para la segunda y la tercera el servidor me devuelve un mensaje de error. <br>
Este mensaje, algo críptico, viene a decir que estoy estableciendo una comunicación sin autenticar. <br>Sin embargo, el fichero PEM sigue ahí, uso el mismo para las tres conexiones. <br>¿Por qué funciona la primera vez y no las demás?<br>
Nota: no tengo acceso a los logs del servidor. Sólo sé lo que me devuelve como mensaje de error. <br><br>Lo único que se me ocurre es algún problema de conexiones abiertas que deberían haber sido cerradas o algo similar. <br>
<br>Si alguien me puede dar alguna pista estaré eternamente agradecido. <br><br>
<br>
Muchas gracias por adelantando.<br><font color="#888888">Jose<br><br><br><br><br><br><br>
</font><br></div></div>_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-es" target="_blank">http://mail.python.org/mailman/listinfo/python-es</a><br>
FAQ: <a href="http://python-es-faq.wikidot.com/" target="_blank">http://python-es-faq.wikidot.com/</a><br>
<br></blockquote></div><font color="#888888"><br><br clear="all"><br>-- <br>//////////////////////////////////////////////////////////////////////////<br>Eduard Díaz<br><a href="http://www.scopia.es" target="_blank">www.scopia.es</a><br>
SCOPIA VISUAL INTERFACES SYSTEMS S.L.<br>
Barcelona<br>Tel. 625 055 126, 933 171 771<br>//////////////////////////////////////////////////////////////////////////<br>
</font><br>_______________________________________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org">Python-es@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-es" target="_blank">http://mail.python.org/mailman/listinfo/python-es</a><br>
FAQ: <a href="http://python-es-faq.wikidot.com/" target="_blank">http://python-es-faq.wikidot.com/</a><br>
<br></blockquote></div><br>