summaryrefslogtreecommitdiffstatshomepage
path: root/esp8266/scripts/websocket_helper.py
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2016-04-22 18:18:06 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2016-04-22 18:18:27 +0300
commiteb4076961309e3ac73db01c0edf4d6cac55f72cc (patch)
treedceb530a198a6f5d8b61537d238e593c901e3412 /esp8266/scripts/websocket_helper.py
parent51dca54cd09ba66986191129dfa5dfcfcf8b4e01 (diff)
downloadmicropython-eb4076961309e3ac73db01c0edf4d6cac55f72cc.tar.gz
micropython-eb4076961309e3ac73db01c0edf4d6cac55f72cc.zip
esp8266/scripts/websocket_helper: Module encapsulating handshake sequences.
Diffstat (limited to 'esp8266/scripts/websocket_helper.py')
-rw-r--r--esp8266/scripts/websocket_helper.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/esp8266/scripts/websocket_helper.py b/esp8266/scripts/websocket_helper.py
new file mode 100644
index 0000000000..15211c1873
--- /dev/null
+++ b/esp8266/scripts/websocket_helper.py
@@ -0,0 +1,73 @@
+import sys
+try:
+ import ubinascii as binascii
+except:
+ import binascii
+try:
+ import uhashlib as hashlib
+except:
+ import hashlib
+
+
+def server_handshake(sock):
+ clr = sock.makefile("rwb", 0)
+ l = clr.readline()
+ sys.stdout.write(repr(l))
+
+ webkey = None
+
+ while 1:
+ l = clr.readline()
+ if not l:
+ raise OSError("EOF in headers")
+ if l == b"\r\n":
+ break
+ # sys.stdout.write(l)
+ h, v = [x.strip() for x in l.split(b":", 1)]
+ print((h, v))
+ if h == b'Sec-WebSocket-Key':
+ webkey = v
+
+ if not webkey:
+ raise OSError("Not a websocket request")
+
+ print(webkey, len(webkey))
+
+ respkey = webkey + b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
+ respkey = hashlib.sha1(respkey).digest()
+ print(repr(respkey))
+ respkey = binascii.b2a_base64(respkey)[:-1]
+ print(repr(respkey))
+
+ resp = b"""\
+HTTP/1.1 101 Switching Protocols\r
+Upgrade: websocket\r
+Connection: Upgrade\r
+Sec-WebSocket-Accept: %s\r
+\r
+""" % respkey
+
+ print(resp)
+ sock.send(resp)
+
+
+# Very simplified client handshake, works for MicroPython's
+# websocket server implementation, but probably not for other
+# servers.
+def client_handshake(sock):
+ cl = sock.makefile("rwb", 0)
+ cl.write(b"""\
+GET / HTTP/1.1\r
+Host: echo.websocket.org\r
+Connection: Upgrade\r
+Upgrade: websocket\r
+Sec-WebSocket-Key: foo\r
+\r
+""")
+ l = cl.readline()
+# print(l)
+ while 1:
+ l = cl.readline()
+ if l == b"\r\n":
+ break
+# sys.stdout.write(l)