#!/usr/bin/python # logproxy.py takes a hostname as its argument and redirects all requests to that host, # in the meantime logging the headers and content body (if content has been sent). # The response is also logged, and then sent back to the client accordingly. from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer import httplib import logging import os import socket import sys import time global redirecthost redirecthost = " 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) conn.request(self.command, self.path, body, headers) resp = conn.getresponse() status = resp.status reason = resp.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) for header in resp.msg.headers: s = header.strip().split(': ') if s[0] == 'Transfer-Encoding': self.send_header('Content-Length', len(body)) else: self.send_header(s[0], s[1]) log.info('%s: %s' % (s[0], s[1])) 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 def main(): global redirecthost redirecthost = sys.argv[1] rtn = os.fork() if rtn == 0: try: server = HTTPServer((", 19080), 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 if __name__ == '__main__': main()