def handle_ws(self, resource): request = standalone._StandaloneRequest(self, self.server.using_tls) try: try: handshake.do_handshake( request, self.server.wsdispatcher, allowDraft75=self.server.draft75, strict=self.server.strict_draft75) except handshake.VersionException: e = sys.exc_info()[1] self._logger.info('WS handshake version error: %s', e) self.send_response(common.HTTP_STATUS_BAD_REQUEST) self.send_header(common.SEC_WEBSOCKET_VERSION_HEADER, e.supported_versions) self.end_headers() return False except handshake.HandshakeException: # Handshake for ws(s) failed. e = sys.exc_info()[1] self._logger.info('WS handshake error: %s', e) self.send_error(e.status) return False request._dispatcher = self.server.wsdispatcher self.server.wsdispatcher.receive_data(request, resource) except handshake.AbortedByUserException: e = sys.exc_info()[1] self._logger.info('WS handshake aborted: %s', e) return False
def parse_request(self): """Override BaseHTTPServer.BaseHTTPRequestHandler.parse_request. Return True to continue processing for HTTP(S), False otherwise. See BaseHTTPRequestHandler.handle_one_request method which calls this method to understand how the return value will be handled. """ # We hook parse_request method, but also call the original # CGIHTTPRequestHandler.parse_request since when we return False, # CGIHTTPRequestHandler.handle_one_request continues processing and # it needs variables set by CGIHTTPRequestHandler.parse_request. # # Variables set by this method will be also used by WebSocket request # handling (self.path, self.command, self.requestline, etc. See also # how _StandaloneRequest's members are implemented using these # attributes). if not CGIHTTPServer.CGIHTTPRequestHandler.parse_request(self): return False host, port, resource = http_header_util.parse_uri(self.path) if resource is None: self._logger.info('Invalid URI: %r', self.path) self._logger.info('Fallback to CGIHTTPRequestHandler') return True server_options = self.server.websocket_server_options if host is not None: validation_host = server_options.validation_host if validation_host is not None and host != validation_host: self._logger.info('Invalid host: %r (expected: %r)', host, validation_host) self._logger.info('Fallback to CGIHTTPRequestHandler') return True if port is not None: validation_port = server_options.validation_port if validation_port is not None and port != validation_port: self._logger.info('Invalid port: %r (expected: %r)', port, validation_port) self._logger.info('Fallback to CGIHTTPRequestHandler') return True self.path = resource request = standalone._StandaloneRequest(self, self._options.use_tls) try: # Fallback to default http handler for request paths for which # we don't have request handlers. #TODO fill in path determination for static files and this #if not self._options.dispatcher.get_handler_suite(self.path): self._logger.debug("Path : %r", self.path) if self.path != "/data" and self.path != "/shell": return True except dispatch.DispatchException, e: self._logger.info('%s', e) self.send_error(e.status) return False