1111import errno
1212import threading
1313from socketserver import ThreadingMixIn , TCPServer , StreamRequestHandler
14+ from urllib .parse import urlparse , parse_qs
1415
1516from websocket_server .thread import WebsocketServerThread
1617
@@ -261,6 +262,8 @@ class WebSocketHandler(StreamRequestHandler):
261262
262263 def __init__ (self , socket , addr , server ):
263264 self .server = server
265+ self .headers = {}
266+ self .query_params = {}
264267 assert not hasattr (self , "_send_lock" ), "_send_lock already exists"
265268 self ._send_lock = threading .Lock ()
266269 if server .key and server .cert :
@@ -412,6 +415,16 @@ def send_text(self, message, opcode=OPCODE_TEXT):
412415 with self ._send_lock :
413416 self .request .send (header + payload )
414417
418+ @staticmethod
419+ def parse_query (http_get ):
420+ """
421+ Parses the query parameters from the first line.
422+ Example: "GET /?q=hello HTTP/1.1" will be parsed to {'q': ['hello']}
423+ """
424+ query = http_get .split (" " )[1 ] # example: http_get = "GET /?q=hello HTTP/1.1"
425+ parsed_url = urlparse (query )
426+ return parse_qs (parsed_url .query )
427+
415428 def read_http_headers (self ):
416429 headers = {}
417430 # first line should be HTTP GET
@@ -424,6 +437,8 @@ def read_http_headers(self):
424437 break
425438 head , value = header .split (':' , 1 )
426439 headers [head .lower ().strip ()] = value .strip ()
440+ self .headers = headers
441+ self .query_params = WebSocketHandler .parse_query (http_get )
427442 return headers
428443
429444 def handshake (self ):
0 commit comments