"""HTTP Authentication and Proxy support. Copyright 2006 John J. Lee This code is free software; you can redistribute it and/or modify it under the terms of the BSD or ZPL 2.1 licenses (see the file COPYING.txt included with the distribution). """ from _urllib2_fork import HTTPPasswordMgr # TODO: stop deriving from HTTPPasswordMgr class HTTPProxyPasswordMgr(HTTPPasswordMgr): # has default realm and host/port def add_password(self, realm, uri, user, passwd): # uri could be a single URI or a sequence if uri is None or isinstance(uri, basestring): uris = [uri] else: uris = uri passwd_by_domain = self.passwd.setdefault(realm, {}) for uri in uris: for default_port in True, False: reduced_uri = self.reduce_uri(uri, default_port) passwd_by_domain[reduced_uri] = (user, passwd) def find_user_password(self, realm, authuri): attempts = [(realm, authuri), (None, authuri)] # bleh, want default realm to take precedence over default # URI/authority, hence this outer loop for default_uri in False, True: for realm, authuri in attempts: authinfo_by_domain = self.passwd.get(realm, {}) for default_port in True, False: reduced_authuri = self.reduce_uri(authuri, default_port) for uri, authinfo in authinfo_by_domain.iteritems(): if uri is None and not default_uri: continue if self.is_suburi(uri, reduced_authuri): return authinfo user, password = None, None if user is not None: break return user, password def reduce_uri(self, uri, default_port=True): if uri is None: return None return HTTPPasswordMgr.reduce_uri(self, uri, default_port) def is_suburi(self, base, test): if base is None: # default to the proxy's host/port hostport, path = test base = (hostport, "/") return HTTPPasswordMgr.is_suburi(self, base, test) class HTTPSClientCertMgr(HTTPPasswordMgr): # implementation inheritance: this is not a proper subclass def add_key_cert(self, uri, key_file, cert_file): self.add_password(None, uri, key_file, cert_file) def find_key_cert(self, authuri): return HTTPPasswordMgr.find_user_password(self, None, authuri)