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
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
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
67 ssl_context = kw.get('ssl_context')
68
69
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