Skip to content

Instantly share code, notes, and snippets.

@ianfun
Created June 11, 2022 14:19
Show Gist options
  • Save ianfun/1e334985cfc4c46b51a429bf9f5c7c8e to your computer and use it in GitHub Desktop.
Save ianfun/1e334985cfc4c46b51a429bf9f5c7c8e to your computer and use it in GitHub Desktop.
pretty simple websocket server in Python (44 lines)
import socket
from hashlib import sha1
from base64 import b64encode
from sys import stdout
client = None
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 80))
server.listen(5)
client= server.accept()[0]
header = client.recv(3000)
key = None
for line in header.split(b'\r\n'):
if b'Sec-WebSocket-Key' in line:
key = line[19::]
if key is None:
print("not a websocket")
client.shutdown(socket.SHUT_RDWR)
client.close()
exit()
key += b'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
client.send(b'''\
HTTP/1.1 101 Switching Protocols\r\n\
Upgrade: WebSocket\r\n\
Connection: Upgrade\r\n\
Sec-WebSocket-Accept: %b\r\n\r\n''' % b64encode(sha1(key).digest()))
try:
while True:
msg = bytearray(client.recv(100))
mask = msg[2:6:]
payload_len = msg[1] & 0b01111111
if payload_len >= 126:
print('error data too long')
exit(1)
for i in range(payload_len):
msg[i] = msg[6+i] ^ mask[i % 4]
stdout.write(chr(msg[i]))
stdout.write('\n')
client.send(b'\x81\x06Hello!')
finally:
client.shutdown(socket.SHUT_RDWR)
client.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment