5
from flexget.plugin import register_plugin
7
log = logging.getLogger('spy_headers')
10
class CustomHTTPConnection(httplib.HTTPConnection):
12
def __init__(self, *args, **kwargs):
13
httplib.HTTPConnection.__init__(self, *args, **kwargs)
14
self.stored_headers = []
16
def putheader(self, header, value):
17
self.stored_headers.append((header, value))
18
httplib.HTTPConnection.putheader(self, header, value)
21
class HTTPCaptureHeaderHandler(urllib2.AbstractHTTPHandler):
25
def http_open(self, req):
26
return self.do_open(CustomHTTPConnection, req)
28
http_request = urllib2.AbstractHTTPHandler.do_request_
29
https_request = urllib2.AbstractHTTPHandler.do_request_
30
https_open = http_open
32
def do_open(self, http_class, req):
33
# All code here lifted directly from the python library
36
from urllib2 import URLError
37
raise URLError('no host given')
39
h = http_class(host) # will parse host:port
40
h.set_debuglevel(self._debuglevel)
42
headers = dict(req.headers)
43
headers.update(req.unredirected_hdrs)
44
headers["Connection"] = "close"
46
(name.title(), val) for name, val in headers.items())
48
h.request(req.get_method(), req.get_selector(), req.data, headers)
50
except socket.error, err: # XXX what error?
51
raise urllib2.URLError(err)
53
fp = socket._fileobject(r, close=True)
55
resp = urllib2.addinfourl(fp, r.msg, req.get_full_url())
59
# After this our custom code!
60
req.all_sent_headers = h.stored_headers
61
log.info('Request : %s' % req.get_full_url())
62
log.info('Response : %s (%s)' % (resp.code, resp.msg))
65
log.info('-- Headers: --------------------------')
66
for sh in h.stored_headers:
67
log.info('%s: %s' % (sh[0], sh[1]))
68
log.info('--------------------------------------')
73
class PluginSpyHeaders(object):
75
Logs all headers sent in http requests. Useful for resolving issues.
77
WARNING: At the moment this modifies requests somehow!
81
from flexget import validator
82
return validator.factory('any')
84
def on_feed_start(self, feed):
86
log.debug('Adding HTTPCaptureHeaderHandler to default opener')
87
urllib2._opener.add_handler(HTTPCaptureHeaderHandler())
89
log.debug('Creating new opener and installing it')
90
opener = urllib2.build_opener(HTTPCaptureHeaderHandler())
91
urllib2.install_opener(opener)
93
def on_feed_exit(self, feed):
94
"""Feed exiting, remove additions"""
96
log.debug('Removing urllib2 default opener')
97
# TODO: this uninstalls all other handlers as well, but does it matter?
98
urllib2.install_opener(None)
100
# remove also on abort
101
on_feed_abort = on_feed_exit
103
register_plugin(PluginSpyHeaders, 'spy_headers')