Skip to content

Getting URL query parameters on connection opened? #53

Open

Description

@stevenliebregt

How can I retrieve URL query parameters in the on_connect method?

For example:

I have a client which connects using the following url: ws://localhost:5000?identification=web-client

How can I retrieve the identification parameter in the on_connect?

Activity

  1. mfranchitti commented on Dec 4, 2018

    @mfranchitti

    Were you able to figure this out? I have a similar need.

  2. amattu2 commented on Jan 20, 2019

    @amattu2

    Also in need of this. I'm not great with Python but I'm going to give it a shot, and see if I can manually add it.

    Edit: I have finished the portion to grab the query string. It's now working as expected, I simply need to finish the code. I will update with the appropriate code within a day or two.

  3. amattu2 commented on Jan 23, 2019

    @amattu2

    For sake of simplicity, I'll just post the updated code here. I haven't tested the code on a wide range of strings, right now if your query parameters contain more than alphanumeric characters, it could potentially break. I simply made this for my needs.

    In order to add this feature, you will need to update two functions in the websocket_server.py source code.

    1. Find: def _new_client(self, handler) [Line 102] and replace it with the following code
    	def _new_client_(self, handler):
    		self.id_counter += 1
    		client={
    			'id'      : self.id_counter,
    			'handler' : handler,
    			'address' : handler.client_address,
    			'query'   : handler.query
    		}
    		self.clients.append(client)
    		self.new_client(client, self)
    
    1. Find: def handshake(self) [Line 242] and replace it with the following code
    	def handshake(self):
    		# Variables
    		message = self.request.recv(1024).decode().strip()
    		upgrade = re.search('\nupgrade[\s]*:[\s]*websocket', message.lower())
    		key = re.search('\n[sS]ec-[wW]eb[sS]ocket-[kK]ey[\s]*:[\s]*(.*)\r\n', message)
    		get_header = re.search('[\n]*[gG][eE][tT][\s]*[/?&=!#$a-zA-Z0-9]*', message)
    		query = ""
    
    		# Checks
    		if not upgrade:
    			self.keep_alive = False
    			return
    		if key:
    			key = key.group(1)
    		else:
    			print("Client tried to connect but was missing a key")
    			self.keep_alive = False
    			return
    		if get_header:
    			get_header = get_header.group()
    			query = re.sub('[gG][eE][tT][\s]*/', '', get_header)
    
    		# Setup
    		response = self.make_handshake_response(key)
    		self.query = query
    		self.handshake_done = self.request.send(response.encode())
    		self.valid_client = True
    		self.server._new_client_(self)
    

    After you edit the websocket_server.py script, you can then access the query parameters via any callback that provides the client.

    Eg:

    def connect(client, server):
    	print(client['query'])
    
  4. adityamohta commented on Jan 20, 2023

    @adityamohta

    I have created a PR, which can be a solution for this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions