flexget.plugins.module_spy_headers
Covered: 24 lines
Missed: 46 lines
Skipped 27 lines
Percent: 34 %
 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):
18
    handler_order = 400
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):
29
        host = req.get_host()
30
        if not host:
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"
40
        headers = dict(
41
            (name.title(), val) for name, val in headers.items())
42
        try:
43
            h.request(req.get_method(), req.get_selector(), req.data, headers)
44
            r = h.getresponse()
45
        except socket.error, err: # XXX what error?
46
            raise urllib2.URLError(err)
47
        r.recv = r.read
48
        fp = socket._fileobject(r, close=True)
50
        resp = urllib2.addinfourl(fp, r.msg, req.get_full_url())
51
        resp.code = r.status
52
        resp.msg = r.reason
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('--------------------------------------')
65
        return resp
67
class PluginSpyHeaders:
68
    """
69
        Logs all headers sent in http requests. Useful for resolving issues.
71
        WARNING: At the moment this modifies requests somehow!
72
    """
73
    def validator(self):
74
        from flexget import validator
75
        return validator.factory('any')
77
    def on_feed_start(self, feed):
78
        if urllib2._opener:
79
            log.debug('Adding HTTPCaptureHeaderHandler to default opener')
80
            urllib2._opener.add_handler(HTTPCaptureHeaderHandler())
81
        else:
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"""
88
        if urllib2._opener:
89
            log.debug('Removing urllib2 default opener')
91
            urllib2.install_opener(None)
94
    on_feed_abort = on_feed_exit
96
register_plugin(PluginSpyHeaders, 'spy_headers')