flexget.plugins.plugin_spy_headers
Covered: 27 lines
Missed: 46 lines
Skipped 31 lines
Percent: 36 %
  1
import logging
  2
import urllib2
  3
import httplib
  4
import socket
  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):
 23
    handler_order = 400
 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):
 34
        host = req.get_host()
 35
        if not host:
 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"
 45
        headers = dict(
 46
            (name.title(), val) for name, val in headers.items())
 47
        try:
 48
            h.request(req.get_method(), req.get_selector(), req.data, headers)
 49
            r = h.getresponse()
 50
        except socket.error, err: # XXX what error?
 51
            raise urllib2.URLError(err)
 52
        r.recv = r.read
 53
        fp = socket._fileobject(r, close=True)
 55
        resp = urllib2.addinfourl(fp, r.msg, req.get_full_url())
 56
        resp.code = r.status
 57
        resp.msg = r.reason
 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('--------------------------------------')
 70
        return resp
 73
class PluginSpyHeaders(object):
 74
    """
 75
        Logs all headers sent in http requests. Useful for resolving issues.
 77
        WARNING: At the moment this modifies requests somehow!
 78
    """
 80
    def validator(self):
 81
        from flexget import validator
 82
        return validator.factory('any')
 84
    def on_feed_start(self, feed):
 85
        if urllib2._opener:
 86
            log.debug('Adding HTTPCaptureHeaderHandler to default opener')
 87
            urllib2._opener.add_handler(HTTPCaptureHeaderHandler())
 88
        else:
 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"""
 95
        if urllib2._opener:
 96
            log.debug('Removing urllib2 default opener')
 98
            urllib2.install_opener(None)
101
    on_feed_abort = on_feed_exit
103
register_plugin(PluginSpyHeaders, 'spy_headers')