[Python] Problema con proxy

Simone Federici s.federici a gmail.com
Dom 30 Set 2012 00:52:31 CEST


Premessa,
anche se l'ho fatto funzionare... dubito delle API,

mi sono configurato un apache proxy digest
<VirtualHost *:9999>
    ServerName romilda.aldaran.org
    ProxyRequests On
    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from all
        AuthType Digest
        AuthName "private"
        AuthUserFile /etc/apache2/passwd-digest
        Require valid-user
    </Proxy>
</VirtualHost>

dopodichè questo è il client python che riesce a leggere la mia pagina web
tramite proxy

#! /usr/bin/python
import urllib2
proxy_url = r'http://localhost:9999/'
proxy = urllib2.ProxyHandler({'http': proxy_url})
auth = urllib2.ProxyDigestAuthHandler()
#auth.add_password('private', proxy_url, 'user', 'gb')
auth.add_password('private', 'janua.it:80', 'user', 'gb')
auth.add_password('private', 'libera.scuola.steineriana.janua.it:80',
'user', 'gb')
opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler)

urllib2.install_opener(opener)
conn = urllib2.urlopen('http://janua.it/')
print conn.read()


come vedi ho commentato
#auth.add_password('private', proxy_url, 'user', 'gb')

e ho aggiunto 2 linee per far funzionare l'esempio.
debuggando con pdb ho visto che in effetti il client ci riprova anche 5
volte se trova una 407, ma deve associare
correttamente utente e password con il realm.

il metodo incriminato di urllib2 è questo, che nel caso "commentato"
ritorna None, None
indi per cui usciva con un secco 407 anche su wireshark non trovando user e
password per il dominio richiesto.

File:
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py
Definition: auth.passwd.find_user_password(self, realm, authuri)
Source:
    def find_user_password(self, realm, authuri):
        domains = self.passwd.get(realm, {})
        for default_port in True, False:
            reduced_authuri = self.reduce_uri(authuri, default_port)
            for uris, authinfo in domains.iteritems():
                for uri in uris:
                    if self.is_suburi(uri, reduced_authuri):
                        return authinfo
        return None, None

a me questo add_password non mi piace per niente cosi :)
che senso ha definire una strategia diversa su un proxy a seconda del
dominio da visitare? nessuna
immagino che le api sono pensate per siti web con autenticazione digest

consiglio questa strada:

#! /usr/bin/python
import urllib2

class MyHTTPPasswordMgr(urllib2.HTTPPasswordMgr):
    def find_user_password(self, realm, authuri):
        return "user", "gb"

proxy_url = r'http://localhost:9999/'
proxy = urllib2.ProxyHandler({'http': proxy_url})
auth = urllib2.ProxyDigestAuthHandler(MyHTTPPasswordMgr())
opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler)

urllib2.install_opener(opener)
conn = urllib2.urlopen('http://janua.it/')
print conn.read()

ciao
S


2012/9/29 Simone Federici <s.federici a gmail.com>

> da quello che so io i proxy continuano a darti 407 finche non gli passi la
> autenticazione nel modo giusto.
>
> secondo me sei sulla strada giusta e c'è un dettaglio che probabilmente ci
> sta sfuggendo.
> non credo invece alla teoria che urlib2 sia bacata sul digest mentre
> funziona sul basic :-D
>
> mi piacerebbe darti una mano, hai un proxy pubblico e una utenza con cui
> fare le prove?
>
> ciao
> S
>
>
> 2012/9/29 Pietro Battiston <me a pietrobattiston.it>
>
>> Grazie della dritta... io il realm lo conosco anche, ma dove dovrei
>> darglielo?!
>>
>> In HTTPPasswordMgrWithDefaultRealm.add_password gliene posso dare uno,
>> ma da quello che ho capito
>> - serve solo a stabilire quali dati di autenticazione utilizzare a
>> seconda del realm ricevuto nell'errore 407 (e None significa "per tutti
>> i realm"), ed
>> - è il realm ricevuto che dovrebbe essere utilizzato poi per
>> l'autenticazione.
>>
>> In sintesi, da quel che ho capito è _normale_ che nel corso
>> dell'autenticazione digest si riceva un 407. Non ho capito nulla?
>>
>
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20120930/3198400b/attachment.html>


Maggiori informazioni sulla lista Python