コード例 #1
0
    def __init__(self, location, port):

        self.location = "localhost" if location == "" else location
        self.port = port
        self.max_queued_connections = 5
        self.event_data_received = EventHook()
        self.event_client_connected = EventHook()
        self.event_client_disconnected = EventHook()

        self.running = False

        self.__clients = {}
        self.__next_client = 0
コード例 #2
0
ファイル: client.py プロジェクト: DerekK19/pywss
    def __init__(self, unique_id, socket, address, server_location, server_port):
        Thread.__init__(self)
        
        self.unique_id = unique_id

        self.socket = socket
        self.socket.setblocking(False)

        self.address = address
        self.server_location = server_location
        self.server_port = server_port
        
        self.state = State.ConnectionEstablished

        self.event_data_received = EventHook()
        self.event_connected = EventHook()
        self.event_disconnected = EventHook()
コード例 #3
0
    def __init__(self, unique_id, socket, address, server_location,
                 server_port):
        Thread.__init__(self)

        self.unique_id = unique_id

        self.socket = socket
        self.socket.setblocking(False)

        self.address = address
        self.server_location = server_location
        self.server_port = server_port

        self.state = State.ConnectionEstablished

        self.event_data_received = EventHook()
        self.event_connected = EventHook()
        self.event_disconnected = EventHook()
コード例 #4
0
class Client(Thread):
    def __init__(self, unique_id, socket, address, server_location,
                 server_port):
        Thread.__init__(self)

        self.unique_id = unique_id

        self.socket = socket
        self.socket.setblocking(False)

        self.address = address
        self.server_location = server_location
        self.server_port = server_port

        self.state = State.ConnectionEstablished

        self.event_data_received = EventHook()
        self.event_connected = EventHook()
        self.event_disconnected = EventHook()

    def __receive_client_handshake(self):
        #todo: close the connection on error

        handshake_raw = self.socket.recv(4096)  #todo: how much to receive ?

        handshake_entries = handshake_raw.split('\r\n')

        self._handshake_fields = {}

        self._handshake_fields['Resource'] = handshake_entries.pop(0).split(
            ' ')[1]

        for entry in handshake_entries:
            entry_data = entry.split(': ')

            if (len(entry_data) == 2):
                self._handshake_fields[entry_data[0]] = entry_data[1]

        random_bytes_position = handshake_raw.find('\r\n\r\n')

        self._handshake_fields['Random_bytes'] = handshake_raw[
            random_bytes_position + 4:random_bytes_position + 12]

        return self._handshake_fields.has_key(
            'Upgrade') and self._handshake_fields['Upgrade'] == "WebSocket"

    def __build_server_handshake(self):

        #todo: Sec-WebSocket-Protocol

        # build keys
        part_1 = self.__decode_key(
            self._handshake_fields['Sec-WebSocket-Key1'])
        part_2 = self.__decode_key(
            self._handshake_fields['Sec-WebSocket-Key2'])

        challenge = struct.pack('>II', part_1, part_2)
        challenge += self._handshake_fields['Random_bytes']

        response = hashlib.md5(challenge).digest()

        self.handshake = "HTTP/1.1 101 WebSocket Protocol Handshake\r\n"
        self.handshake += "Upgrade: WebSocket\r\n"
        self.handshake += "Connection: Upgrade\r\n"
        self.handshake += "Sec-WebSocket-Origin: {0}\r\n".format(
            self._handshake_fields['Origin'])
        self.handshake += "Sec-WebSocket-Location: ws://{0}:{1}{2}\r\n\r\n".format(
            self.server_location, self.server_port,
            self._handshake_fields['Resource'])  #multiple-resource by default
        self.handshake += response

    def __decode_key(self, encrypted_key):
        key = ""
        spaces = 0

        for c in encrypted_key:
            if c.isdigit():
                key += c
            elif c.isspace():
                spaces += 1

        return int(key) / spaces

    def __send_handshake(self):
        self.socket.send(self.handshake)

    #todo: blocking or not blocking ?
    def run(self):
        try:
            while (self.state != State.Disconnected
                   and self.state != State.NotConnected):

                if (not self.state == State.Ready):
                    self.__receive_client_handshake()
                    self.__build_server_handshake()
                    self.__send_handshake()
                    self.state = State.Ready
                    self.event_connected.fire(self)

                try:

                    data = ""
                    received_data = self.socket.recv(4096)

                    try:
                        while (True):
                            data += received_data
                            received_data = self.socket.recv(4096)
                    except socket.error:
                        pass

                    if (data == ""):
                        raise socket.error(errno.WSAEWOULDBLOCK)

                    data = data.decode('utf-8', 'ignore')
                    data = data.lstrip('\x00')
                    #data = data.rstrip('\xFF')

                    commands = data.split('\x00')

                    for command in commands:
                        self.event_data_received.fire(self, command)

                except socket.error, msg:
                    if not msg.errno in server.socket_errors:
                        raise

        except socket.error, msg:
            self.stop()

        except KeyboardInterrupt:
            self.interrupt_main()
コード例 #5
0
ファイル: client.py プロジェクト: DerekK19/pywss
class Client(Thread):

    def __init__(self, unique_id, socket, address, server_location, server_port):
        Thread.__init__(self)
        
        self.unique_id = unique_id

        self.socket = socket
        self.socket.setblocking(False)

        self.address = address
        self.server_location = server_location
        self.server_port = server_port
        
        self.state = State.ConnectionEstablished

        self.event_data_received = EventHook()
        self.event_connected = EventHook()
        self.event_disconnected = EventHook()


    def __receive_client_handshake(self):
        #todo: close the connection on error

        handshake_raw = self.socket.recv(4096) #todo: how much to receive ?

        handshake_entries = handshake_raw.split('\r\n')

        self._handshake_fields = {}

        self._handshake_fields['Resource'] = handshake_entries.pop(0).split(' ')[1]

        for entry in handshake_entries:
            entry_data = entry.split(': ')

            if (len(entry_data) == 2):
                self._handshake_fields[entry_data[0]] = entry_data[1]

        random_bytes_position = handshake_raw.find('\r\n\r\n')

        self._handshake_fields['Random_bytes'] = handshake_raw[random_bytes_position+4:random_bytes_position+12]

        return self._handshake_fields.has_key('Upgrade') and self._handshake_fields['Upgrade'] == "WebSocket"


    def __build_server_handshake(self):

        #todo: Sec-WebSocket-Protocol

        # build keys
        part_1 = self.__decode_key(self._handshake_fields['Sec-WebSocket-Key1'])
        part_2 = self.__decode_key(self._handshake_fields['Sec-WebSocket-Key2'])

        challenge = struct.pack('>II', part_1, part_2)
        challenge += self._handshake_fields['Random_bytes']

        response = hashlib.md5(challenge).digest()

        self.handshake =  "HTTP/1.1 101 WebSocket Protocol Handshake\r\n"
        self.handshake += "Upgrade: WebSocket\r\n"
        self.handshake += "Connection: Upgrade\r\n"
        self.handshake += "Sec-WebSocket-Origin: {0}\r\n".format(self._handshake_fields['Origin'])
        self.handshake += "Sec-WebSocket-Location: ws://{0}:{1}{2}\r\n\r\n".format(self.server_location, self.server_port, self._handshake_fields['Resource']) #multiple-resource by default
        self.handshake += response


    def __decode_key(self, encrypted_key):
        key = ""
        spaces = 0

        for c in encrypted_key:
            if c.isdigit():
                key += c
            elif c.isspace():
                spaces += 1

        return int(key) / spaces


    def __send_handshake(self):
        self.socket.send(self.handshake)

    #todo: blocking or not blocking ?
    def run(self):
        try:
            while (self.state != State.Disconnected and
                   self.state != State.NotConnected):

                if (not self.state == State.Ready):
                    self.__receive_client_handshake()
                    self.__build_server_handshake()
                    self.__send_handshake()
                    self.state = State.Ready
                    self.event_connected.fire(self)

                try:

                    data = ""
                    received_data = self.socket.recv(4096)

                    try:
                        while (True):
                            data += received_data
                            received_data = self.socket.recv(4096)
                    except socket.error: pass

                    if (data == ""):
                        raise socket.error(errno.WSAEWOULDBLOCK)

                    data = data.decode('utf-8', 'ignore')
                    data = data.lstrip('\x00')
                    #data = data.rstrip('\xFF')

                    commands = data.split('\x00')
 
                    for command in commands:
                        self.event_data_received.fire(self, command)

                except socket.error, msg:
                    if not msg.errno in server.socket_errors:
                        raise

        except socket.error, msg:
           self.stop()

        except KeyboardInterrupt:
            self.interrupt_main()