@@ -473,47 +473,73 @@ def __init__(self, configuration=None, name=None):
473473 self .user = self .configuration .get ('user' )
474474 self .password = self .configuration .get ('pass' )
475475 self .ss_cert = self .configuration .get ('ss_cert' )
476+ self .proxy = self .configuration .get ('proxy' )
476477
477- def __add_openers (self ):
478- def self_signed_cert (ss_cert ):
479- if ss_cert :
480- try :
481- ctx = ssl .create_default_context ()
482- ctx .check_hostname = False
483- ctx .verify_mode = ssl .CERT_NONE
484- return urllib2 .build_opener (urllib2 .HTTPSHandler (context = ctx ))
485- except AttributeError :
486- return None
487- else :
488- return None
478+ def __add_openers (self , user = None , password = None , ss_cert = None , proxy = None , url = None ):
479+ user = user or self .user
480+ password = password or self .password
481+ ss_cert = ss_cert or self .ss_cert
482+ proxy = proxy or self .proxy
489483
490- self . opener = self_signed_cert ( self . ss_cert ) or urllib2 . build_opener ()
484+ handlers = list ()
491485
492- # HTTP Basic Auth
493- if self .user and self .password :
494- url_parse = urlparse (self .url )
486+ # HTTP Basic Auth handler
487+ if all ([user , password , isinstance (user , str ), isinstance (password , str )]):
488+ url = url or self .url
489+ url_parse = urlparse (url )
495490 top_level_url = '://' .join ([url_parse .scheme , url_parse .netloc ])
496491 passman = urllib2 .HTTPPasswordMgrWithDefaultRealm ()
497- passman .add_password (None , top_level_url , self . user , self . password )
498- self . opener . add_handler (urllib2 .HTTPBasicAuthHandler (passman ))
492+ passman .add_password (None , top_level_url , user , password )
493+ handlers . append (urllib2 .HTTPBasicAuthHandler (passman ))
499494 self .debug ("Enabling HTTP basic auth" )
500495
501- def _get_raw_data (self , custom_url = None ):
496+ # HTTPS handler
497+ # Self-signed certificate ignore
498+ if ss_cert :
499+ try :
500+ ctx = ssl .create_default_context ()
501+ ctx .check_hostname = False
502+ ctx .verify_mode = ssl .CERT_NONE
503+ except AttributeError :
504+ self .error ('HTTPS self-signed certificate ignore not enabled' )
505+ else :
506+ handlers .append (urllib2 .HTTPSHandler (context = ctx ))
507+ self .debug ("Enabling HTTP self-signed certificate ignore" )
508+
509+ # PROXY handler
510+ if proxy and isinstance (proxy , str ) and not ss_cert :
511+ handlers .append (urllib2 .ProxyHandler (dict (http = proxy )))
512+ self .debug ("Enabling HTTP proxy handler (%s)" % proxy )
513+
514+ opener = urllib2 .build_opener (* handlers )
515+ return opener
516+
517+ def _build_opener (self , ** kwargs ):
518+ try :
519+ return self .__add_openers (** kwargs )
520+ except TypeError as error :
521+ self .error ('build_opener() error:' , str (error ))
522+ return None
523+
524+ def _get_raw_data (self , url = None , opener = None ):
502525 """
503526 Get raw data from http request
504527 :return: str
505528 """
506- raw_data = None
507- f = None
529+ data = None
508530 try :
509- f = self .opener .open (custom_url or self .url , timeout = self .update_every * 2 )
510- raw_data = f .read ().decode ('utf-8' , 'ignore' )
531+ opener = opener or self .opener
532+ data = opener .open (url or self .url , timeout = self .update_every * 2 )
533+ raw_data = data .read ().decode ('utf-8' , 'ignore' )
534+ except urllib2 .URLError as error :
535+ self .error ('Url: %s. Error: %s' % (url or self .url , str (error )))
536+ return None
511537 except Exception as error :
512- self .error ('Url: %s. Error: %s' % ( custom_url or self . url , str (error ) ))
538+ self .error (str (error ))
513539 return None
514540 finally :
515- if f is not None : f . close ()
516-
541+ if data is not None :
542+ data . close ()
517543 return raw_data or None
518544
519545 def check (self ):
@@ -525,7 +551,7 @@ def check(self):
525551 self .error ('URL is not defined or type is not <str>' )
526552 return False
527553
528- self .__add_openers ()
554+ self .opener = self . __add_openers ()
529555
530556 try :
531557 data = self ._get_data ()
0 commit comments