    # -*- Mode: Python; tab-width: 4 -*-

    import asynchat
    import asyncore
    import socket
    import string

    class proxy_server (asyncore.dispatcher):

        def __init__ (self, host, port):
            asyncore.dispatcher.__init__ (self)
            self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
            self.set_reuse_addr()
            self.there = (host, port)
            here = ('', port + 9000)
            self.bind (here)
            self.listen (5)

        def handle_accept (self):
            proxy_receiver (self, self.accept())

    class proxy_sender (asynchat.async_chat):

        def __init__ (self, receiver, address):
            asynchat.async_chat.__init__ (self)
            self.receiver = receiver
            self.set_terminator (None)
            self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
            self.buffer = ''
            self.set_terminator ('\n')
            self.connect (address)

        def handle_connect (self):
            print 'Connected'

        def collect_incoming_data (self, data):
            self.buffer = self.buffer + data

        def found_terminator (self):
            data = self.buffer
            self.buffer = ''
            print '==> (%d) %s' % (self.id, repr(data))
            self.receiver.push (data + '\n')

         def handle_close (self):
             self.receiver.close()
             self.close()

    class proxy_receiver (asynchat.async_chat):

        channel_counter = 0

        def __init__ (self, server, (conn, addr)):
            asynchat.async_chat.__init__ (self, conn)
            self.set_terminator ('\n')
            self.server = server
            self.id = self.channel_counter
            self.channel_counter = self.channel_counter + 1
            self.sender = proxy_sender (self, server.there)
            self.sender.id = self.id
            self.buffer = ''

        def collect_incoming_data (self, data):
            self.buffer = self.buffer + data

        def found_terminator (self):
            data = self.buffer
            self.buffer = ''
            print '<== (%d) %s' % (self.id, repr(data))
            self.sender.push (data + '\n')

         def handle_close (self):
             print 'Closing'
             self.sender.close()
             self.close()

    if __name__ == '__main__':
        import sys
        import string
        if len(sys.argv) < 3:
            print 'Usage: %s <server-host> <server-port>' % sys.argv[0]
        else:
            ps = proxy_server (sys.argv[1], string.atoi (sys.argv[2]))
            asyncore.loop()