# -*- Mode: Python; tab-width: 4 -*-
# This server can be used to record HTTP requests for debugging.
import socket
import asyncore
import asynchat
class recorder_channel (asyncore.dispatcher):
def __init__ (self, sock, addr):
asyncore.dispatcher.__init__ (self, sock)
self.fd = open ('%s:%d' % addr, 'wb')
def handle_read (self):
data = self.recv (1024)
if not data:
self.fd.close()
self.close()
else:
self.fd.write (data)
self.fd.flush()
class recorder_server (asyncore.dispatcher):
SERVER_IDENT = 'Recorder'
def __init__ (self, port=8989):
self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
self.bind (('', port))
print '%s started on port %d' % (self.SERVER_IDENT, port)
self.listen (5)
def handle_accept (self):
conn, addr = self.accept()
print 'incoming connection',addr
recorder_channel (conn, addr)
# force a clean shutdown
def shutdown():
sm = asyncore.socket_map
asyncore.socket_map = {}
for s in sm.values():
try:
s.close()
except:
pass
print 'Done.'
if __name__ == '__main__':
import string
import sys
if len(sys.argv) > 1:
port = string.atoi (sys.argv[1])
else:
port = 8989
s = recorder_server (port)
try:
asyncore.loop()
except KeyboardInterrupt:
import sys
import tb
print sys.exc_type, sys.exc_value
tb.printtb (sys.exc_traceback)
print 'Shutting down due to unhandled exception...'
shutdown()
|