Mercurial > bitten > bitten-test
diff scripts/proxy.py @ 10:2269b705deb9
Improved the BEEP protocol implementation:
* Callbacks for replying to messages.
* Starting of channels implemented.
* Some error handling (though not much yet).
Also, added a sample client that sends a message using the echo protocol.
Finally, added a simple proxy script that outputs the peer-to-peer communication to the console.
author | cmlenz |
---|---|
date | Fri, 10 Jun 2005 20:21:10 +0000 |
parents | |
children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/scripts/proxy.py @@ -0,0 +1,93 @@ +# Based on the proxy module from the Medusa project +# Used for inspecting the communication between two BEEP peers + +import asynchat +import asyncore +import socket +import sys + + +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 + 1) + 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('\r\n') + self.connect(address) + print 'L:', '<wait for incoming connections>' + + def handle_connect(self): + print 'L:', '<open connection>' + + def collect_incoming_data(self, data): + self.buffer = self.buffer + data + + def found_terminator(self): + data = self.buffer + self.buffer = '' + for line in data.splitlines(): + print 'L:', '\x1b[35m' + line + '\x1b[0m' + self.receiver.push(data + '\r\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('\r\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 = '' + for line in data.splitlines(): + print 'I:', '\x1b[34m' + line + '\x1b[0m' + self.sender.push (data + '\r\n') + + def handle_connect(self): + print 'I:', '<open connection>' + + def handle_close(self): + print 'I:', '<close connection>' + self.sender.close() + self.close() + + +if __name__ == '__main__': + if len(sys.argv) < 3: + print 'Usage: %s <server-host> <server-port>' % sys.argv[0] + else: + ps = proxy_server(sys.argv[1], int(sys.argv[2])) + asyncore.loop()