def __build_url_opener(self, uri): """ Build the url opener for managing HTTP Basic Authentication """ # Create an OpenerDirector with support # for Basic HTTP Authentication... auth_handler = urllib2.HTTPBasicAuthHandler() auth_handler.add_password(None, uri, self.client_id, self.client_secret) opener = urllib2.build_opener(auth_handler) return opener
def _http_opener(self, req, headers=None, auth=True): """ Configure a HTTP opener for API operations @param req: the Request @param headers: array of HTTP headers @param auth: False - do not add Authorization "Basic" - add Auth header using username+password "Token" - add Auth header using access token any tru-ish value - add a 401-handler with username+password @returns: OpenerDirector instance """ # Configure opener headers addheaders = [] if headers: addheaders.extend(headers) # Configure opener handlers handlers = [] # Proxy handling proxy = self.proxy if proxy and self.use_proxy: protocol = req.get_type() if PY2 else req.type proxy_handler = urllib2.ProxyHandler({protocol: proxy}) handlers.append(proxy_handler) # Authentication handling username = self.username password = self.password if auth == "Basic": if username and password: import base64 base64string = base64.b64encode( ('%s:%s' % (username, password)).encode("utf-8")) addheaders.append( ("Authorization", "Basic %s" % s3_str(base64string))) elif auth == "Token": token = self.access_token token_type = self.token_type or "Bearer" expiry_date = self.token_expiry_date if not token or \ expiry_date and expiry_date <= current.request.utcnow: try: token = self.get_access_token() except NotImplementedError: token = None if token: addheaders.append( ("Authorization", "%s %s" % (token_type, token))) else: # No pre-emptive auth pass if auth and username and password: # Add a HTTP-401-handler as fallback in case pre-emptive auth fails passwd_manager = urllib2.HTTPPasswordMgrWithDefaultRealm() passwd_manager.add_password( realm=None, uri=req.get_full_url(), user=username, passwd=password, ) auth_handler = urllib2.HTTPBasicAuthHandler(passwd_manager) handlers.append(auth_handler) # Create the opener and add headers opener = urllib2.build_opener(*handlers) if addheaders: opener.addheaders = addheaders return opener
def _http_opener(self, url, headers=None, auth=True): """ Configure a HTTP opener for sync operations @param url: the target URL """ repository = self.repository config = repository.config # Configure opener headers addheaders = [] if headers: addheaders.extend(headers) # Configure opener handlers handlers = [] # Proxy handling proxy = repository.proxy or config.proxy or None if proxy: # Figure out the protocol from the URL url_split = url.split("://", 1) if len(url_split) == 2: protocol = url_split[0] else: protocol = "http" proxy_handler = urllib2.ProxyHandler({protocol: proxy}) handlers.append(proxy_handler) # Authentication handling if auth: username = repository.username password = repository.password if username and password: # Add a 401 handler (in case Auth header is not accepted) passwd_manager = urllib2.HTTPPasswordMgrWithDefaultRealm() passwd_manager.add_password( realm=None, uri=url, user=username, passwd=password, ) auth_handler = urllib2.HTTPBasicAuthHandler(passwd_manager) handlers.append(auth_handler) # Create the opener opener = urllib2.build_opener(*handlers) if auth and username and password: # Send credentials unsolicitedly to force login - otherwise # the request would be treated as anonymous if login is not # required (i.e. no 401 triggered), but we want to login in # any case: import base64 base64string = base64.encodestring('%s:%s' % (username, password))[:-1] addheaders.append(("Authorization", "Basic %s" % base64string)) if addheaders: opener.addheaders = addheaders return opener