websocket_helper.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import sys
  2. try:
  3. import ubinascii as binascii
  4. except:
  5. import binascii
  6. try:
  7. import uhashlib as hashlib
  8. except:
  9. import hashlib
  10. DEBUG = 0
  11. def server_handshake(sock):
  12. clr = sock.makefile("rwb", 0)
  13. l = clr.readline()
  14. #sys.stdout.write(repr(l))
  15. webkey = None
  16. while 1:
  17. l = clr.readline()
  18. if not l:
  19. raise OSError("EOF in headers")
  20. if l == b"\r\n":
  21. break
  22. # sys.stdout.write(l)
  23. h, v = [x.strip() for x in l.split(b":", 1)]
  24. if DEBUG:
  25. print((h, v))
  26. if h == b'Sec-WebSocket-Key':
  27. webkey = v
  28. if not webkey:
  29. raise OSError("Not a websocket request")
  30. if DEBUG:
  31. print("Sec-WebSocket-Key:", webkey, len(webkey))
  32. d = hashlib.sha1(webkey)
  33. d.update(b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
  34. respkey = d.digest()
  35. respkey = binascii.b2a_base64(respkey)[:-1]
  36. if DEBUG:
  37. print("respkey:", respkey)
  38. sock.send(b"""\
  39. HTTP/1.1 101 Switching Protocols\r
  40. Upgrade: websocket\r
  41. Connection: Upgrade\r
  42. Sec-WebSocket-Accept: """)
  43. sock.send(respkey)
  44. sock.send("\r\n\r\n")
  45. # Very simplified client handshake, works for MicroPython's
  46. # websocket server implementation, but probably not for other
  47. # servers.
  48. def client_handshake(sock):
  49. cl = sock.makefile("rwb", 0)
  50. cl.write(b"""\
  51. GET / HTTP/1.1\r
  52. Host: echo.websocket.org\r
  53. Connection: Upgrade\r
  54. Upgrade: websocket\r
  55. Sec-WebSocket-Key: foo\r
  56. \r
  57. """)
  58. l = cl.readline()
  59. # print(l)
  60. while 1:
  61. l = cl.readline()
  62. if l == b"\r\n":
  63. break
  64. # sys.stdout.write(l)