esp8266/scripts/websocket_helper: Module encapsulating handshake sequences.
This commit is contained in:
parent
51dca54cd0
commit
eb40769613
|
@ -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)
|
Loading…
Reference in New Issue