Pithikos / python-websocket-server

A simple fully working websocket-server in Python with no external dependencies
MIT License
1.15k stars 385 forks source link

Getting URL query parameters on connection opened? #53

Open stevenliebregt opened 6 years ago

stevenliebregt commented 6 years ago

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?

mfranchitti commented 5 years ago

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

amattu2 commented 5 years ago

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.

amattu2 commented 5 years ago

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)
  2. 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'])
adityamohta commented 1 year ago

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