def __call__(self, environ, start_response): if not ("Upgrade" in _extract_comma(environ.get('HTTP_CONNECTION', '')) and environ.get('HTTP_UPGRADE', '').lower() == 'websocket'): # need to check a few more things here for true compliance start_response('400 Bad Request', [('Connection', 'close')]) return [""] if 'HTTP_SEC_WEBSOCKET_KEY' in environ: protocol_version = environ[ 'HTTP_SEC_WEBSOCKET_VERSION'] # RFC 6455 if protocol_version in ('13', ): #skip version 4,5,6,7,8 protocol_version = int(protocol_version) else: # Unknown raise NotImplementedError("Not Supported") else: # Unknown raise NotImplementedError("Not Supported") # Get the underlying socket and wrap a WebSocket class around it client = environ[CLIENT_KEY] sock = server._get_socket_fromfd(client.get_fd(), socket.AF_INET, socket.SOCK_STREAM) ws = WebSocket(sock, environ, self.protocol_version) # If it's new-version, we need to work out our challenge response key1 = _wsgi_to_bytes(environ['HTTP_SEC_WEBSOCKET_KEY']) key2 = _wsgi_to_bytes('258EAFA5-E914-47DA-95CA-C5AB0DC85B11)') digest = sha1(key1 + key2).digest() response = b64encode(digest).strip() if is_py3(): response = response.decode("iso-8859-1") # Start building the response location = 'ws://%s%s%s' % (environ.get('HTTP_HOST'), environ.get('SCRIPT_NAME'), environ.get('PATH_INFO')) qs = environ.get('QUERY_STRING') if qs: location += '?' + qs if protocol_version == 13: handshake_reply = ("HTTP/1.1 101 Switching Protocols\r\n" "Upgrade: websocket\r\n" "Connection: Upgrade\r\n" "Origin: %s\r\n" "Sec-WebSocket-Accept: %s\r\n" "\r\n" % (environ.get('HTTP_ORIGIN'), response)) if 'HTTP_SEC_WEBSOCKET_PROTOCOL' in environ: handshake_reply += 'Sec-WebSocket-Protocol: %s\r\n' % environ.get( 'HTTP_SEC_WEBSOCKET_PROTOCOL') else: #pragma NO COVER raise ValueError("Unknown WebSocket protocol version.") r = sock.sendall(_wsgi_to_bytes(handshake_reply)) self.handler(ws) # Make sure we send the closing frame ws._send_closing_frame(True) # use this undocumented feature of eventlet.wsgi to ensure that it # doesn't barf on the fact that we didn't call start_response return [""]
def __call__(self, environ, start_response): if not (environ.get('HTTP_CONNECTION') == 'Upgrade' and environ.get('HTTP_UPGRADE') == 'WebSocket'): # need to check a few more things here for true compliance start_response('400 Bad Request', [('Connection','close')]) return [""] # See if they sent the new-format headers if 'HTTP_SEC_WEBSOCKET_KEY1' in environ: self.protocol_version = 76 if 'HTTP_SEC_WEBSOCKET_KEY2' not in environ: # That's bad. start_response('400 Bad Request', [('Connection','close')]) return [""] else: self.protocol_version = 75 # Get the underlying socket and wrap a WebSocket class around it client = environ[CLIENT_KEY] sock = server._get_socket_fromfd(client.get_fd(), socket.AF_INET, socket.SOCK_STREAM) ws = WebSocket(sock, environ, self.protocol_version) # If it's new-version, we need to work out our challenge response if self.protocol_version == 76: key1 = self._extract_number(environ['HTTP_SEC_WEBSOCKET_KEY1']) key2 = self._extract_number(environ['HTTP_SEC_WEBSOCKET_KEY2']) # There's no content-length header in the request, but it has 8 # bytes of data. key3 = environ['wsgi.input'].read(8) key = struct.pack(">II", key1, key2) + key3 response = md5(key).digest() # Start building the response location = 'ws://%s%s%s' % ( environ.get('HTTP_HOST'), environ.get('SCRIPT_NAME'), environ.get('PATH_INFO') ) qs = environ.get('QUERY_STRING') if qs: location += '?' + qs if self.protocol_version == 75: handshake_reply = ("HTTP/1.1 101 Web Socket Protocol Handshake\r\n" "Upgrade: WebSocket\r\n" "Connection: Upgrade\r\n" "WebSocket-Origin: %s\r\n" "WebSocket-Location: %s\r\n\r\n" % ( environ.get('HTTP_ORIGIN'), location)) elif self.protocol_version == 76: handshake_reply = ("HTTP/1.1 101 Web Socket Protocol Handshake\r\n" "Upgrade: WebSocket\r\n" "Connection: Upgrade\r\n" "Sec-WebSocket-Origin: %s\r\n" "Sec-WebSocket-Protocol: %s\r\n" "Sec-WebSocket-Location: %s\r\n" "\r\n%s"% ( environ.get('HTTP_ORIGIN'), environ.get('HTTP_SEC_WEBSOCKET_PROTOCOL', 'default'), location, response)) else: #pragma NO COVER raise ValueError("Unknown WebSocket protocol version.") r = sock.sendall(handshake_reply) self.handler(ws) # Make sure we send the closing frame ws._send_closing_frame(True) # use this undocumented feature of eventlet.wsgi to ensure that it # doesn't barf on the fact that we didn't call start_response return [""]
def __call__(self, environ, start_response): if not ("Upgrade" in _extract_comma(environ.get('HTTP_CONNECTION','')) and environ.get('HTTP_UPGRADE','').lower() == 'websocket'): # need to check a few more things here for true compliance start_response('400 Bad Request', [('Connection','close')]) return [""] if 'HTTP_SEC_WEBSOCKET_KEY' in environ: protocol_version = environ['HTTP_SEC_WEBSOCKET_VERSION'] # RFC 6455 if protocol_version in ('13',): #skip version 4,5,6,7,8 protocol_version = int(protocol_version) else: # Unknown raise NotImplementedError("Not Supported") else: # Unknown raise NotImplementedError("Not Supported") # Get the underlying socket and wrap a WebSocket class around it client = environ[CLIENT_KEY] sock = server._get_socket_fromfd(client.get_fd(), socket.AF_INET, socket.SOCK_STREAM) ws = WebSocket(sock, environ, self.protocol_version) # If it's new-version, we need to work out our challenge response key1 = _wsgi_to_bytes(environ['HTTP_SEC_WEBSOCKET_KEY']) key2 = _wsgi_to_bytes('258EAFA5-E914-47DA-95CA-C5AB0DC85B11)') digest = sha1(key1 + key2).digest() response = b64encode(digest).strip() if is_py3(): response = response.decode("iso-8859-1") # Start building the response location = 'ws://%s%s%s' % ( environ.get('HTTP_HOST'), environ.get('SCRIPT_NAME'), environ.get('PATH_INFO') ) qs = environ.get('QUERY_STRING') if qs: location += '?' + qs if protocol_version == 13: handshake_reply = ("HTTP/1.1 101 Switching Protocols\r\n" "Upgrade: websocket\r\n" "Connection: Upgrade\r\n" "Origin: %s\r\n" "Sec-WebSocket-Accept: %s\r\n" "\r\n"% ( environ.get('HTTP_ORIGIN'), response)) if 'HTTP_SEC_WEBSOCKET_PROTOCOL' in environ: handshake_reply += 'Sec-WebSocket-Protocol: %s\r\n' % environ.get('HTTP_SEC_WEBSOCKET_PROTOCOL') else: #pragma NO COVER raise ValueError("Unknown WebSocket protocol version.") r = sock.sendall(_wsgi_to_bytes(handshake_reply)) self.handler(ws) # Make sure we send the closing frame ws._send_closing_frame(True) # use this undocumented feature of eventlet.wsgi to ensure that it # doesn't barf on the fact that we didn't call start_response return [""]
def __call__(self, environ, start_response): if not (environ.get('HTTP_CONNECTION') == 'Upgrade' and environ.get('HTTP_UPGRADE') == 'WebSocket'): # need to check a few more things here for true compliance start_response('400 Bad Request', [('Connection', 'close')]) return [""] # See if they sent the new-format headers if 'HTTP_SEC_WEBSOCKET_KEY1' in environ: self.protocol_version = 76 if 'HTTP_SEC_WEBSOCKET_KEY2' not in environ: # That's bad. start_response('400 Bad Request', [('Connection', 'close')]) return [""] else: self.protocol_version = 75 # Get the underlying socket and wrap a WebSocket class around it client = environ[CLIENT_KEY] sock = server._get_socket_fromfd(client.get_fd(), socket.AF_INET, socket.SOCK_STREAM) ws = WebSocket(sock, environ, self.protocol_version) # If it's new-version, we need to work out our challenge response if self.protocol_version == 76: key1 = self._extract_number(environ['HTTP_SEC_WEBSOCKET_KEY1']) key2 = self._extract_number(environ['HTTP_SEC_WEBSOCKET_KEY2']) # There's no content-length header in the request, but it has 8 # bytes of data. key3 = environ['wsgi.input'].read(8) key = struct.pack(">II", key1, key2) + key3 response = md5(key).digest() # Start building the response location = 'ws://%s%s%s' % (environ.get('HTTP_HOST'), environ.get('SCRIPT_NAME'), environ.get('PATH_INFO')) qs = environ.get('QUERY_STRING') if qs: location += '?' + qs if self.protocol_version == 75: handshake_reply = ("HTTP/1.1 101 Web Socket Protocol Handshake\r\n" "Upgrade: WebSocket\r\n" "Connection: Upgrade\r\n" "WebSocket-Origin: %s\r\n" "WebSocket-Location: %s\r\n\r\n" % (environ.get('HTTP_ORIGIN'), location)) elif self.protocol_version == 76: handshake_reply = ("HTTP/1.1 101 Web Socket Protocol Handshake\r\n" "Upgrade: WebSocket\r\n" "Connection: Upgrade\r\n" "Sec-WebSocket-Origin: %s\r\n" "Sec-WebSocket-Protocol: %s\r\n" "Sec-WebSocket-Location: %s\r\n" "\r\n%s" % (environ.get('HTTP_ORIGIN'), environ.get('HTTP_SEC_WEBSOCKET_PROTOCOL', 'default'), location, response)) else: #pragma NO COVER raise ValueError("Unknown WebSocket protocol version.") r = sock.sendall(handshake_reply) self.handler(ws) # Make sure we send the closing frame ws._send_closing_frame(True) # use this undocumented feature of eventlet.wsgi to ensure that it # doesn't barf on the fact that we didn't call start_response return [""]