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.feder...@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 <m...@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? >> > >
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python