40ad8f1666
This is consistent with the other 'micro' modules and allows implementing additional features in Python via e.g. micropython-lib's sys. Note this is a breaking change (not backwards compatible) for ports which do not enable weak links, as "import sys" must now be replaced with "import usys".
86 lines
1.7 KiB
Python
86 lines
1.7 KiB
Python
try:
|
|
import usys as sys
|
|
except ImportError:
|
|
import sys
|
|
|
|
try:
|
|
import ubinascii as binascii
|
|
except:
|
|
import binascii
|
|
try:
|
|
import uhashlib as hashlib
|
|
except:
|
|
import hashlib
|
|
|
|
DEBUG = 0
|
|
|
|
|
|
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)]
|
|
if DEBUG:
|
|
print((h, v))
|
|
if h == b"Sec-WebSocket-Key":
|
|
webkey = v
|
|
|
|
if not webkey:
|
|
raise OSError("Not a websocket request")
|
|
|
|
if DEBUG:
|
|
print("Sec-WebSocket-Key:", webkey, len(webkey))
|
|
|
|
d = hashlib.sha1(webkey)
|
|
d.update(b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
|
|
respkey = d.digest()
|
|
respkey = binascii.b2a_base64(respkey)[:-1]
|
|
if DEBUG:
|
|
print("respkey:", respkey)
|
|
|
|
sock.send(
|
|
b"""\
|
|
HTTP/1.1 101 Switching Protocols\r
|
|
Upgrade: websocket\r
|
|
Connection: Upgrade\r
|
|
Sec-WebSocket-Accept: """
|
|
)
|
|
sock.send(respkey)
|
|
sock.send("\r\n\r\n")
|
|
|
|
|
|
# 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)
|