Package ndg :: Package httpsclient :: Module urllib2_build_opener
[hide private]

Source Code for Module ndg.httpsclient.urllib2_build_opener

 1  """urllib2 style build opener integrates with HTTPSConnection class from this 
 2  package. 
 3  """ 
 4  __author__ = "P J Kershaw" 
 5  __date__ = "21/12/10" 
 6  __copyright__ = "(C) 2011 Science and Technology Facilities Council" 
 7  __license__ = "BSD - see LICENSE file in top-level directory" 
 8  __contact__ = "Philip.Kershaw@stfc.ac.uk" 
 9  __revision__ = '$Id$' 
10  import logging 
11  import sys 
12   
13  # Py 2 <=> 3 compatibility for class type checking 
14  if sys.version_info[0] > 2: 
15      class_type_ = type 
16      from urllib.request import (ProxyHandler, UnknownHandler,  
17                                  HTTPDefaultErrorHandler, FTPHandler,  
18                                  FileHandler, HTTPErrorProcessor,  
19                                  HTTPHandler, OpenerDirector,  
20                                  HTTPRedirectHandler) 
21  else: 
22      import types 
23      class_type_ = types.ClassType 
24       
25      from urllib2 import (ProxyHandler, UnknownHandler, HTTPDefaultErrorHandler,  
26                           FTPHandler, FileHandler, HTTPErrorProcessor,  
27                           HTTPHandler, OpenerDirector, HTTPRedirectHandler) 
28   
29  from ndg.httpsclient.https import HTTPSContextHandler 
30   
31  log = logging.getLogger(__name__) 
32   
33   
34  # Copied from urllib2 with modifications for ssl 
35 -def build_opener(*handlers, **kw):
36 """Create an opener object from a list of handlers. 37 38 The opener will use several default handlers, including support 39 for HTTP and FTP. 40 41 If any of the handlers passed as arguments are subclasses of the 42 default handlers, the default handlers will not be used. 43 """ 44 def isclass(obj): 45 return isinstance(obj, class_type_) or hasattr(obj, "__bases__")
46 47 opener = OpenerDirector() 48 default_classes = [ProxyHandler, UnknownHandler, HTTPHandler, 49 HTTPDefaultErrorHandler, HTTPRedirectHandler, 50 FTPHandler, FileHandler, HTTPErrorProcessor] 51 check_classes = list(default_classes) 52 check_classes.append(HTTPSContextHandler) 53 skip = [] 54 for klass in check_classes: 55 for check in handlers: 56 if isclass(check): 57 if issubclass(check, klass): 58 skip.append(klass) 59 elif isinstance(check, klass): 60 skip.append(klass) 61 62 for klass in default_classes: 63 if klass not in skip: 64 opener.add_handler(klass()) 65 66 # Pick up SSL context from keyword settings 67 ssl_context = kw.get('ssl_context') 68 69 # Add the HTTPS handler with ssl_context 70 if HTTPSContextHandler not in skip: 71 opener.add_handler(HTTPSContextHandler(ssl_context)) 72 73 for h in handlers: 74 if isclass(h): 75 h = h() 76 opener.add_handler(h) 77 78 return opener 79