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()
Copyright (C) 2012-2017 Edgewall Software