#! /usr/bin/python from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer import httplib import logging import os import socket import sys import time global redirecthost redirecthost = '' global hostname hostname = '' log = logging.getLogger('log') hdlr = logging.FileHandler('dav.log') formatter = logging.Formatter('%(message)s') hdlr.setFormatter(formatter) log.addHandler(hdlr) log.setLevel(logging.DEBUG) # # a logging http-method handler # def do_HTTP(self): try: log.info('%s %s' % (self.command, self.path)) headers = {} for header in self.headers.headers: s = header.strip().split(': ') if len(s) == 2: headers[s[0]] = s[1] log.info('%s: %s' % (s[0], s[1])) if len(headers) == 0: log.info('no headers') if headers.has_key('Content-Length'): cl = int(headers['Content-Length']) body = self.rfile.read(cl) log.info(body) else: body = '' log.info('\n----------------------------------------------------------------\n') conn = httplib.HTTPConnection(redirecthost) print 'headers = %s' % str(headers) print 'path = %s' % self.path print 'body = %s' % body if headers.has_key('Host'): headers['Host'] = hostname conn.request(self.command, self.path, body, headers) resp = conn.getresponse() status = resp.status reason = resp.reason log.info('Status: %s' % status) log.info('Reason: %s' % reason) if resp.msg.has_key('Content-Length'): body = resp.read(int(resp.msg['Content-Length'])) elif resp.msg.has_key('Transfer-Encoding') and resp.msg['Transfer-Encoding'] == 'chunked': body = resp.read() elif not resp.msg.has_key('Content-Length'): body = resp.read() else: body = '' self.send_response(status, reason) clheader = False for header in resp.msg.headers: s = header.strip().split(': ') if s[0] == 'Transfer-Encoding': self.send_header('Content-Length', len(body)) log.info('Content-Length (replaced): %s' % len(body)) clheader = True elif s[0] == 'Connection': self.send_header('Connection', 'Close') log.info('Connection: Close') else: self.send_header(s[0], s[1]) if s[0] == 'Content-Length': clheader = True log.info('%s: %s' % (s[0], s[1])) if not clheader: log.info('Content-Length (added): %s' % len(body)) self.send_header('Content-Length', len(body)) log.info('') self.end_headers() log.info(body) self.wfile.write(body) self.wfile.flush() log.info('\n================================================================\n') except IOError, e: self.send_error(500, e) class MyHandler(BaseHTTPRequestHandler): pass # # http methods we'll handle # MyHandler.do_COPY = do_HTTP MyHandler.do_DELETE = do_HTTP MyHandler.do_GET = do_HTTP MyHandler.do_LOCK = do_HTTP MyHandler.do_MKCOL = do_HTTP MyHandler.do_MOVE = do_HTTP MyHandler.do_OPTIONS = do_HTTP MyHandler.do_POST = do_HTTP MyHandler.do_PROPFIND = do_HTTP MyHandler.do_PROPPATCH = do_HTTP MyHandler.do_PUT = do_HTTP MyHandler.do_TRACE = do_HTTP MyHandler.do_UNLOCK = do_HTTP if __name__ == '__main__': if len(sys.argv) < 2: print 'Usage: logproxy.py [redirecthost] [port]' print ' For example: logproxy.py localhost:80 8080' print ' -- will setup a proxy on port 8080 redirecting to localhost 80' sys.exit(1) redirecthost = sys.argv[1] port = int(sys.argv[2]) hostname = redirecthost.split(':')[0] rtn = os.fork() if rtn == 0: try: server = HTTPServer(('', port), MyHandler) server.serve_forever() except KeyboardInterrupt: log.info('^C received, shutting down server') server.socket.close() else: try: while 1: line = sys.stdin.readline() log.info('************** %s' % line) except KeyboardInterrupt: pass