Skip to content

Commit c3f0b00

Browse files
committed
Read HTTP headers properly no matter of size (i.e. larger than buffer previously)
1 parent 9bd9c40 commit c3f0b00

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

websocket_server/websocket_server.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -292,19 +292,36 @@ def send_text(self, message, opcode=OPCODE_TEXT):
292292

293293
self.request.send(header + payload)
294294

295+
def read_http_headers(self):
296+
headers = {}
297+
# first line should be HTTP GET
298+
http_get = self.rfile.readline().decode().strip()
299+
assert http_get.upper().startswith('GET')
300+
# remaining should be headers
301+
while True:
302+
header = self.rfile.readline().decode().strip()
303+
if not header:
304+
break
305+
head, value = header.split(':', 1)
306+
headers[head.lower().strip()] = value.strip()
307+
return headers
308+
295309
def handshake(self):
296-
message = self.request.recv(1024).decode().strip()
297-
upgrade = re.search('\nupgrade[\s]*:[\s]*websocket', message.lower())
298-
if not upgrade:
310+
headers = self.read_http_headers()
311+
312+
try:
313+
assert headers['upgrade'].lower() == 'websocket'
314+
except AssertionError:
299315
self.keep_alive = False
300316
return
301-
key = re.search('\n[sS]ec-[wW]eb[sS]ocket-[kK]ey[\s]*:[\s]*(.*)\r\n', message)
302-
if key:
303-
key = key.group(1)
304-
else:
317+
318+
try:
319+
key = headers['sec-websocket-key']
320+
except KeyError:
305321
logger.warning("Client tried to connect but was missing a key")
306322
self.keep_alive = False
307323
return
324+
308325
response = self.make_handshake_response(key)
309326
self.handshake_done = self.request.send(response.encode())
310327
self.valid_client = True

0 commit comments

Comments
 (0)