def __init__(self, *args, **kwargs): global conn_id HTTPConnection.__init__(self, *args, **kwargs) self.sendq = Queue() self.control_frames = deque() self.cf_lock = Lock() self.sending = None self.send_buf = None self.frag_decoder = UTF8Decoder() self.ws_close_received = self.ws_close_sent = False conn_id += 1 self.websocket_connection_id = conn_id self.stop_reading = False
def finalize_headers(self, inheaders): upgrade = inheaders.get('Upgrade', '') key = inheaders.get('Sec-WebSocket-Key', None) conn = { x.strip().lower() for x in inheaders.get('Connection', '').split(',') } if key is None or upgrade.lower( ) != 'websocket' or 'upgrade' not in conn: return HTTPConnection.finalize_headers(self, inheaders) ver = inheaders.get('Sec-WebSocket-Version', 'Unknown') try: ver_ok = int(ver) >= 13 except Exception: ver_ok = False if not ver_ok: return self.simple_response( httplib.BAD_REQUEST, 'Unsupported WebSocket protocol version: %s' % ver) if self.method != 'GET': return self.simple_response( httplib.BAD_REQUEST, 'Invalid WebSocket method: %s' % self.method) response = HANDSHAKE_STR % standard_b64encode( sha1(key + GUID_STR).digest()) self.optimize_for_sending_packet() self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) self.set_state(WRITE, self.upgrade_connection_to_ws, ReadOnlyFileBuffer(response.encode('ascii')), inheaders)
def close(self): if self.in_websocket_mode: try: self.websocket_handler.handle_websocket_close(self.websocket_connection_id) except Exception: self.log.exception('Error in WebSocket close handler') # Try to write a close frame, just once try: if self.send_buf is None and not self.ws_close_sent: self.websocket_close(SHUTTING_DOWN, 'Shutting down') with self.cf_lock: self.write(self.control_frames.pop()) except Exception: pass Connection.close(self) else: HTTPConnection.close(self)
def finalize_headers(self, inheaders): upgrade = inheaders.get('Upgrade', '') key = inheaders.get('Sec-WebSocket-Key', None) conn = {x.strip().lower() for x in inheaders.get('Connection', '').split(',')} if key is None or upgrade.lower() != 'websocket' or 'upgrade' not in conn: return HTTPConnection.finalize_headers(self, inheaders) ver = inheaders.get('Sec-WebSocket-Version', 'Unknown') try: ver_ok = int(ver) >= 13 except Exception: ver_ok = False if not ver_ok: return self.simple_response(httplib.BAD_REQUEST, 'Unsupported WebSocket protocol version: %s' % ver) if self.method != 'GET': return self.simple_response(httplib.BAD_REQUEST, 'Invalid WebSocket method: %s' % self.method) response = HANDSHAKE_STR % standard_b64encode(sha1(key + GUID_STR).digest()) self.optimize_for_sending_packet() self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) self.set_state(WRITE, self.upgrade_connection_to_ws, ReadOnlyFileBuffer(response.encode('ascii')), inheaders)