1
import logging, urllib2, httplib, socket
2
from flexget.plugin import *
4
log = logging.getLogger('spy_headers')
6
class CustomHTTPConnection(httplib.HTTPConnection):
8
def __init__(self, *args, **kwargs):
9
httplib.HTTPConnection.__init__(self, *args, **kwargs)
10
self.stored_headers = []
12
def putheader(self, header, value):
13
self.stored_headers.append((header, value))
14
httplib.HTTPConnection.putheader(self, header, value)
16
class HTTPCaptureHeaderHandler(urllib2.AbstractHTTPHandler):
20
def http_open(self, req):
21
return self.do_open(CustomHTTPConnection, req)
23
http_request = urllib2.AbstractHTTPHandler.do_request_
24
https_request = urllib2.AbstractHTTPHandler.do_request_
25
https_open = http_open
27
def do_open(self, http_class, req):
28
# All code here lifted directly from the python library
31
from urllib2 import URLError
32
raise URLError('no host given')
34
h = http_class(host) # will parse host:port
35
h.set_debuglevel(self._debuglevel)
37
headers = dict(req.headers)
38
headers.update(req.unredirected_hdrs)
39
headers["Connection"] = "close"
41
(name.title(), val) for name, val in headers.items())
43
h.request(req.get_method(), req.get_selector(), req.data, headers)
45
except socket.error, err: # XXX what error?
46
raise urllib2.URLError(err)
48
fp = socket._fileobject(r, close=True)
50
resp = urllib2.addinfourl(fp, r.msg, req.get_full_url())
54
# After this our custom code!
55
req.all_sent_headers = h.stored_headers
56
log.info('Request : %s' % req.get_full_url())
57
log.info('Response : %s (%s)' % (resp.code, resp.msg))
60
log.info('-- Headers: --------------------------')
61
for sh in h.stored_headers:
62
log.info('%s: %s' % (sh[0], sh[1]))
63
log.info('--------------------------------------')
67
class PluginSpyHeaders:
69
Logs all headers sent in http requests. Useful for resolving issues.
71
WARNING: At the moment this modifies requests somehow!
74
from flexget import validator
75
return validator.factory('any')
77
def on_feed_start(self, feed):
79
log.debug('Adding HTTPCaptureHeaderHandler to default opener')
80
urllib2._opener.add_handler(HTTPCaptureHeaderHandler())
82
log.debug('Creating new opener and installing it')
83
opener = urllib2.build_opener(HTTPCaptureHeaderHandler())
84
urllib2.install_opener(opener)
86
def on_feed_exit(self, feed):
87
"""Feed exiting, remove additions"""
89
log.debug('Removing urllib2 default opener')
90
# TODO: this uninstalls all other handlers as well, but does it matter?
91
urllib2.install_opener(None)
93
# remove also on abort
94
on_feed_abort = on_feed_exit
96
register_plugin(PluginSpyHeaders, 'spy_headers')