aboutsummaryrefslogtreecommitdiffstats
path: root/netlib/websockets/implementations.py
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2015-04-17 13:46:51 +1200
committerAldo Cortesi <aldo@nullcube.com>2015-04-17 13:46:51 +1200
commit3bbafa24bd4b78452e72ae6cc2bb17521d3903fe (patch)
tree66c44cdefea4ce7e4c93197cbd23f67c11ea79b3 /netlib/websockets/implementations.py
parentc53d89fd7fad6c46458ab3d0140528e344de605f (diff)
parent2d72a1b6b56f1643cd1d8be59eee55aa7ca2f17f (diff)
downloadmitmproxy-3bbafa24bd4b78452e72ae6cc2bb17521d3903fe.tar.gz
mitmproxy-3bbafa24bd4b78452e72ae6cc2bb17521d3903fe.tar.bz2
mitmproxy-3bbafa24bd4b78452e72ae6cc2bb17521d3903fe.zip
Merge pull request #54 from Chandler/websockets
Netlib WebSockets take 1
Diffstat (limited to 'netlib/websockets/implementations.py')
-rw-r--r--netlib/websockets/implementations.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/netlib/websockets/implementations.py b/netlib/websockets/implementations.py
new file mode 100644
index 00000000..1ded3b85
--- /dev/null
+++ b/netlib/websockets/implementations.py
@@ -0,0 +1,80 @@
+from netlib import tcp
+from base64 import b64encode
+from StringIO import StringIO
+from . import websockets as ws
+import struct
+import SocketServer
+import os
+
+# Simple websocket client and servers that are used to exercise the functionality in websockets.py
+# These are *not* fully RFC6455 compliant
+
+class WebSocketsEchoHandler(tcp.BaseHandler):
+ def __init__(self, connection, address, server):
+ super(WebSocketsEchoHandler, self).__init__(connection, address, server)
+ self.handshake_done = False
+
+ def handle(self):
+ while True:
+ if not self.handshake_done:
+ self.handshake()
+ else:
+ self.read_next_message()
+
+ def read_next_message(self):
+ decoded = ws.WebSocketsFrame.from_byte_stream(self.rfile.read).decoded_payload
+ self.on_message(decoded)
+
+ def send_message(self, message):
+ frame = ws.WebSocketsFrame.default(message, from_client = False)
+ self.wfile.write(frame.safe_to_bytes())
+ self.wfile.flush()
+
+ def handshake(self):
+ client_hs = ws.read_handshake(self.rfile.read, 1)
+ key = ws.process_handshake_from_client(client_hs)
+ response = ws.create_server_handshake(key)
+ self.wfile.write(response)
+ self.wfile.flush()
+ self.handshake_done = True
+
+ def on_message(self, message):
+ if message is not None:
+ self.send_message(message)
+
+
+class WebSocketsClient(tcp.TCPClient):
+ def __init__(self, address, source_address=None):
+ super(WebSocketsClient, self).__init__(address, source_address)
+ self.version = "13"
+ self.client_nounce = ws.create_client_nounce()
+ self.resource = "/"
+
+ def connect(self):
+ super(WebSocketsClient, self).connect()
+
+ handshake = ws.create_client_handshake(
+ self.address.host,
+ self.address.port,
+ self.client_nounce,
+ self.version,
+ self.resource
+ )
+
+ self.wfile.write(handshake)
+ self.wfile.flush()
+
+ server_handshake = ws.read_handshake(self.rfile.read, 1)
+
+ server_nounce = ws.process_handshake_from_server(server_handshake, self.client_nounce)
+
+ if not server_nounce == ws.create_server_nounce(self.client_nounce):
+ self.close()
+
+ def read_next_message(self):
+ return ws.WebSocketsFrame.from_byte_stream(self.rfile.read).payload
+
+ def send_message(self, message):
+ frame = ws.WebSocketsFrame.default(message, from_client = True)
+ self.wfile.write(frame.safe_to_bytes())
+ self.wfile.flush()