google-code-export / turpial

Automatically exported from code.google.com/p/turpial
0 stars 0 forks source link

Turpial 1.3.4 no conecta al estar detrás de un Proxy -> Problema con urllib2.py #207

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
Versión: turpial 1.3.4

Al intentar hacer una conexión con turpial estando detŕas de un proxy, la 
conexión falla generando la siguiente salida de error:

Traceback (most recent call last):
  File "/home/montillajcx/Desktop/turpial-1.3.4/turpial/api/turpialapi.py", line 124, in __handle_oauth
    response = urllib2.urlopen(req)
  File "/usr/lib/python2.5/urllib2.py", line 124, in urlopen
    return _opener.open(url, data)
  File "/usr/lib/python2.5/urllib2.py", line 381, in open
    response = self._open(req, data)
  File "/usr/lib/python2.5/urllib2.py", line 399, in _open
    '_open', req)
  File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.5/urllib2.py", line 1115, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "/usr/lib/python2.5/urllib2.py", line 1082, in do_open
    raise URLError(err)
URLError: <urlopen error timed out>
Error: <urlopen error timed out>
None

Googleando un poco encontré que actualmente urllib2 no tiene soporte para 
conexiones https cuando se encuentra detrás de un proxy -> 
http://www.voidspace.org.uk/python/articles/urllib2.shtml#proxies

"Currently urllib2 does not support fetching of https locations through a 
proxy. This can be a problem."

De igual manera conseguí un posible solución a este problema en la siguiente 
dirección: 

http://code.activestate.com/recipes/456195/

Probé la solución implementando las clases dadas en la página en el api de 
turpial -> turpialapi.py y básicamente la solución consiste en construir un 
opener utilizando la clase ConnectHTTPSHandler() especificando manualmente la 
dirección del proxy antes de ejecutar  urllib2.urlopen(req)

De esta manera quedo definida el procedimiento de autenticación, sin embargo 
debería existir una solución más elegante donde se permita definir la 
dirección del proxy a través de la interfaz gráfica de turpial.

def __handle_oauth(self, callback):
        if self.has_oauth_support():
            self.client = TurpialAuthClient()
        else:
            self.client = TurpialAuthClient(api_url=self.apiurl)
        self.consumer = oauth.OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET)
        self.sign_method_hmac_sha1 = oauth.OAuthSignatureMethod_HMAC_SHA1()
        self.access_url = 'https://api.twitter.com/oauth/access_token'
        try:
            request = oauth.OAuthRequest.from_consumer_and_token(
                oauth_consumer=self.consumer,
                http_method='POST', http_url=self.access_url,
                parameters = {
                    'x_auth_mode': 'client_auth',
                    'x_auth_username': self.username,
                    'x_auth_password': self.password
                }
            )
            ###### modificaciones por marshall
        prx = 'proxy:puerto'
        opener = urllib2.build_opener(ConnectHTTPSHandler(proxy=prx))
        urllib2.install_opener(opener)
            ####### hasta aquí
            request.sign_request(self.sign_method_hmac_sha1, self.consumer, None)
            req = urllib2.Request(self.access_url, data=request.to_postdata())
            response = urllib2.urlopen(req)
            self.token = oauth.OAuthToken.from_string(response.read())
            callback({'auth': True})

        except Exception, error:
            print "Error: %s\n%s" % (error, traceback.print_exc())
            callback({'auth': False, 'error': 'Invalid Credentials'})

Espero que se pueda implementar en la nueva versión .. o que esto sirva de 
ayuda para pensar una solución alternativa.

Saludos, 

Marshall 

Original issue reported on code.google.com by montilla...@gmail.com on 3 Sep 2010 at 4:03

GoogleCodeExporter commented 9 years ago
Actualmente se ha implementado un fix basado en el aporte de Marshall y de 
Alfonso Alí. Está disponible en la versión de desarrollo y detecta el proxy 
automáticamente en GNOME. Espero más adelante poder expandirlo para otros 
entornos o crear una interfaz propia para Turpial.

Saludos y gracias por su colaboración

Original comment by wil.alej...@gmail.com on 8 Sep 2010 at 3:31

GoogleCodeExporter commented 9 years ago

Original comment by wil.alej...@gmail.com on 8 Sep 2010 at 3:44

GoogleCodeExporter commented 9 years ago
El día de ayer me di cuenta que las clases que fueron agregadas en el fix, 
permiten la conexión https mediante urlib2 detrás de un proxy, sin embargo 
esto solo funciona si estamos ejecutando turpial en una consola donde se 
encuentre establecida la variable de ambiente $http_proxy.

Para corregir esto es necesario establecer dicha variable de ambiente 
directamente desde turpial, leyendo encontré que se puede hacer fácilmente a 
través del módulo  "os" estableciendo os.environ['http_proxy'].

Como ya se tiene soporte para detectar el proxy desde Gnome es fácil 
establecer este valor jugando con los valores obtenidos.. algo así: 

if proxies:
    self.log.debug('Proxies detectados: %s' % proxies)
   if proxies.has_key('https'):
      os.environ['http_proxy'] = 'http://'+proxies['http'];
          opener = urllib2.build_opener(ConnectHTTPSHandler(proxy=proxies['https']))
      urllib2.install_opener(opener)

De esta manera ya no es necesario ejecutar turpial desde una consola haciendo 
export de esta variable de ambiente.

Saludos,

Marshall 

Original comment by montilla...@gmail.com on 15 Oct 2010 at 9:43