Here the code that shows the problem. I adapted the function 'echo' a bit to show the problem:
Code: Select all
import uasyncio
import uhashlib, ubinascii
import websocket
def make_respkey(webkey):
d = uhashlib.sha1(webkey)
d.update(b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
respkey = d.digest()
respkey = ubinascii.b2a_base64(respkey) #[:-1]
return respkey
class WSWriter:
def __init__(self, reader, writer):
# Reader is passed for symmetry with WSReader() and ignored.
self.s = writer
async def awrite(self, data):
assert len(data) < 126
await self.s.awrite(b"\x81")
await self.s.awrite(bytes([len(data)]))
await self.s.awrite(data)
def WSReader(reader, writer):
webkey = None
while 1:
l = yield from reader.readline()
print(l)
if not l:
raise ValueError()
if l == b"\r\n":
break
if l.startswith(b'Sec-WebSocket-Key'):
webkey = l.split(b":", 1)[1]
webkey = webkey.strip()
if not webkey:
raise ValueError("Not a websocker request")
respkey = make_respkey(webkey)
await writer.awrite(b"""\
HTTP/1.1 101 Switching Protocols\r
Upgrade: websocket\r
Connection: Upgrade\r
Sec-WebSocket-Accept: """)
await writer.awrite(respkey)
await writer.awrite("\r\n")
print("Finished webrepl handshake")
if '__version__' in dir(uasyncio):
print("New uasyncio")
ws = websocket.websocket(reader.s)
rws = uasyncio.StreamReader(reader.s, ws)
else:
print("Old uasyncio")
ws = websocket.websocket(reader.ios)
rws = uasyncio.StreamReader(reader.ios, ws)
return rws
def echo(reader, writer):
yield from reader.readline() # Consume GET line
reader = yield from WSReader(reader, writer)
writer = WSWriter(reader, writer)
while 1:
l = yield from reader.read(256)
print("received: ", l)
if l == b"\r":
await writer.awrite(b"\r\n")
else:
if l[0] == 0x81:
await writer.awrite("Received %d junk-bytes" % len(l))
else:
await writer.awrite(l)
loop = uasyncio.get_event_loop()
loop.create_task(uasyncio.start_server(echo, "0.0.0.0", 80))
loop.run_forever()
loop.close()
With the old uasyncio I can receive (and then send back) data as expected.
With the new uasyncio, connection is established, but then when sending data from the client, I receive what looks like a raw websocket-packet in l.
It always starts with 0x81, 0x83 (length, when sending 3 bytes) and then some random bytes.
These random bytes differ when sending the same data from the client. (only the first 2 bytes are the same.)
Am I doing something wrong? can someone help?