Skip to content

WIP: uasyncio.websocket: Websocket implementation for uasyncio. #228

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions uasyncio.websocket/example_websock.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import uasyncio
from uasyncio_.websocket import WSReader, WSWriter


def echo(reader, writer):
# Consume GET line
yield from reader.readline()

reader = yield from WSReader(reader, writer)
writer = WSWriter(writer)

while 1:
l = yield from reader.read(256)
print(l)
if l == b"\r":
await writer.awrite(b"\r\n")
else:
await writer.awrite(l)


import logging
#logging.basicConfig(level=logging.INFO)
logging.basicConfig(level=logging.DEBUG)
loop = uasyncio.get_event_loop()
#loop.create_task(asyncio.start_server(serve, "127.0.0.1", 8081))
loop.create_task(uasyncio.start_server(echo, "127.0.0.1", 8081))
loop.run_forever()
loop.close()
22 changes: 22 additions & 0 deletions uasyncio.websocket/example_websock_old.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import uasyncio
import uasyncio_.websocket


def echo(reader, writer):
while 1:
l = yield from reader.read(256)
print(l)
if l == b"\r":
await writer.awrite(b"\r\n")
else:
await writer.awrite(l)


import logging
#logging.basicConfig(level=logging.INFO)
logging.basicConfig(level=logging.DEBUG)
loop = uasyncio.get_event_loop()
#loop.create_task(asyncio.start_server(serve, "127.0.0.1", 8081))
loop.create_task(uasyncio_.websocket.start_ws_server(echo, "127.0.0.1", 8081))
loop.run_forever()
loop.close()
104 changes: 104 additions & 0 deletions uasyncio.websocket/uasyncio/websocket.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import uasyncio as asyncio
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, s):
self.s = s

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")
# await writer.awrite("\r\n\r\n")

print("Finished webrepl handshake")

ws = websocket.websocket(reader.ios)
rws = asyncio.StreamReader(reader.ios, ws)

return rws


#deprecated
def start_ws_server(client_coro, host, port, backlog=10):

def ws_wrap(reader, writer):
print(reader, writer)

print("Req:", (yield from reader.readline()))

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")
# await writer.awrite("\r\n\r\n")

print("Finished webrepl handshake")

ws = websocket.websocket(reader.ios)
rws = asyncio.StreamReader(reader.ios, ws)

return await client_coro(rws, WSWriter(writer))


await asyncio.start_server(ws_wrap, host, port, backlog)