diff --git a/moonraker/app.py b/moonraker/app.py index f55a38a..54a5256 100644 --- a/moonraker/app.py +++ b/moonraker/app.py @@ -259,12 +259,12 @@ class RemoteRequestHandler(AuthorizedRequestHandler): args = {} if self.request.query: args = self.query_parser(self.request) - request = self.server.make_request( - self.remote_callback, method, args) - result = await request.wait() - if isinstance(result, ServerError): + try: + result = await self.server.make_request( + self.remote_callback, method, args) + except ServerError as e: raise tornado.web.HTTPError( - result.status_code, str(result)) + e.status_code, str(e)) from e self.finish({'result': result}) class LocalRequestHandler(AuthorizedRequestHandler): @@ -301,7 +301,7 @@ class LocalRequestHandler(AuthorizedRequestHandler): result = await self.callback(self.request.path, method, args) except ServerError as e: raise tornado.web.HTTPError( - e.status_code, str(e)) + e.status_code, str(e)) from e self.finish({'result': result}) diff --git a/moonraker/moonraker.py b/moonraker/moonraker.py index f9c24bd..4b29fe3 100644 --- a/moonraker/moonraker.py +++ b/moonraker/moonraker.py @@ -217,51 +217,53 @@ class Server: self.init_cb.stop() async def _request_endpoints(self): - request = self.make_request("list_endpoints", "GET", {}) - result = await request.wait() - if not isinstance(result, ServerError): - endpoints = result.get('hooks', {}) - static_paths = result.get('static_paths', {}) - for ep in endpoints: - self.moonraker_app.register_remote_handler(ep) - mutable_paths = {sp['resource_id']: sp['file_path'] - for sp in static_paths} - file_manager = self.lookup_plugin('file_manager') - file_manager.update_mutable_paths(mutable_paths) + try: + result = await self.make_request("list_endpoints", "GET", {}) + except ServerError: + return + endpoints = result.get('hooks', {}) + static_paths = result.get('static_paths', {}) + for ep in endpoints: + self.moonraker_app.register_remote_handler(ep) + mutable_paths = {sp['resource_id']: sp['file_path'] + for sp in static_paths} + file_manager = self.lookup_plugin('file_manager') + file_manager.update_mutable_paths(mutable_paths) async def _check_available_objects(self): - request = self.make_request("objects/list", "GET", {}) - result = await request.wait() - if not isinstance(result, ServerError): - missing_objs = [] - for obj in ["virtual_sdcard", "display_status", "pause_resume"]: - if obj not in result: - missing_objs.append(obj) - if missing_objs: - err_str = ", ".join([f"[{o}]" for o in missing_objs]) - logging.info( - f"\nWarning, unable to detect the following printer " - f"objects:\n{err_str}\nPlease add the the above sections " - f"to printer.cfg for full Moonraker functionality.") - else: + try: + result = await self.make_request("objects/list", "GET", {}) + except ServerError as e: logging.info( - f"{result}\nUnable to retreive Klipper Object List") + f"{e}\nUnable to retreive Klipper Object List") + return + missing_objs = [] + for obj in ["virtual_sdcard", "display_status", "pause_resume"]: + if obj not in result: + missing_objs.append(obj) + if missing_objs: + err_str = ", ".join([f"[{o}]" for o in missing_objs]) + logging.info( + f"\nWarning, unable to detect the following printer " + f"objects:\n{err_str}\nPlease add the the above sections " + f"to printer.cfg for full Moonraker functionality.") async def _check_ready(self): - request = self.make_request("info", "GET", {}) - result = await request.wait() - if not isinstance(result, ServerError): - is_ready = result.get("is_ready", False) - if is_ready: - self._set_klippy_ready() - else: - msg = result.get("message", "Klippy Not Ready") - logging.info("\n" + msg) - else: + try: + result = await self.make_request("info", "GET", {}) + except ServerError as e: logging.info( - f"{result}\nKlippy info request error. This indicates that\n" + f"{e}\nKlippy info request error. This indicates that\n" f"Klippy may have experienced an error during startup.\n" f"Please check klippy.log for more information") + return + is_ready = result.get("is_ready", False) + if is_ready: + self._set_klippy_ready() + else: + msg = result.get("message", "Klippy Not Ready") + logging.info("\n" + msg) + def _handle_klippy_response(self, request_id, response): req = self.pending_requests.pop(request_id, None) @@ -288,12 +290,13 @@ class Server: def _process_status_update(self, status): self.send_event("server:status_update", status) - def make_request(self, path, method, args): + async def make_request(self, path, method, args): base_request = BaseRequest(path, method, args) self.pending_requests[base_request.id] = base_request self.ioloop.spawn_callback( self.send_klippy_request, base_request) - return base_request + result = await base_request.wait() + return result async def _kill_server(self): # XXX - Currently this function is not used. @@ -345,6 +348,8 @@ class BaseRequest: self._event.clear() continue break + if isinstance(self.response, ServerError): + raise self.response return self.response def notify(self, response): diff --git a/moonraker/plugins/file_manager.py b/moonraker/plugins/file_manager.py index 753ece7..59e3e1e 100644 --- a/moonraker/plugins/file_manager.py +++ b/moonraker/plugins/file_manager.py @@ -167,11 +167,8 @@ class FileManager: async def _handle_operation_check(self, requested_path): # Get virtual_sdcard status - request = self.server.make_request( + result = await self.server.make_request( "objects/status", 'GET', {'print_stats': []}) - result = await request.wait() - if isinstance(result, self.server.error): - raise result pstats = result.get('print_stats', {}) loaded_file = pstats.get('filename', "") state = pstats.get('state', "") diff --git a/moonraker/plugins/gcode_apis.py b/moonraker/plugins/gcode_apis.py index 4e5ecc0..274f97b 100644 --- a/moonraker/plugins/gcode_apis.py +++ b/moonraker/plugins/gcode_apis.py @@ -32,11 +32,8 @@ class GCodeAPIs: async def _send_gcode(self, script): args = {'script': script} - request = self.server.make_request( + result = await self.server.make_request( GCODE_ENDPOINT, 'POST', args) - result = await request.wait() - if isinstance(result, self.server.error): - raise result return result async def gcode_pause(self, path, method, args): diff --git a/moonraker/plugins/paneldue.py b/moonraker/plugins/paneldue.py index 80794c8..53265ec 100644 --- a/moonraker/plugins/paneldue.py +++ b/moonraker/plugins/paneldue.py @@ -196,10 +196,10 @@ class PanelDue: } async def _klippy_request(self, command, method='GET', args={}): - request = self.server.make_request(command, method, args) - result = await request.wait() - if isinstance(result, self.server.error): - raise PanelDueError(str(result)) + try: + result = await self.server.make_request(command, method, args) + except self.server.error as e: + raise PanelDueError(str(e)) from e return result async def handle_klippy_state(self, state): diff --git a/moonraker/plugins/temperature_store.py b/moonraker/plugins/temperature_store.py index 46e1347..e40be71 100644 --- a/moonraker/plugins/temperature_store.py +++ b/moonraker/plugins/temperature_store.py @@ -36,22 +36,22 @@ class TemperatureStore: return # Fetch sensors - request = self.server.make_request( - "objects/status", 'GET', {'heaters': []}) - result = await request.wait() - if isinstance(result, self.server.error): - logging.info(f"Error Configuring Sensors: {result}") + try: + result = await self.server.make_request( + "objects/status", 'GET', {'heaters': []}) + except self.server.error as e: + logging.info(f"Error Configuring Sensors: {e}") return sensors = result.get("heaters", {}).get("available_sensors", []) if sensors: # Add Subscription sub = {s: [] for s in sensors} - request = self.server.make_request( - "objects/subscription", 'POST', sub) - result = await request.wait() - if isinstance(result, self.server.error): - logging.info(f"Error subscribing to sensors: {result}") + try: + result = await self.server.make_request( + "objects/subscription", 'POST', sub) + except self.server.error as e: + logging.info(f"Error subscribing to sensors: {e}") return logging.info(f"Configuring available sensors: {sensors}") new_store = {} diff --git a/moonraker/websockets.py b/moonraker/websockets.py index 9938050..a48e7cf 100644 --- a/moonraker/websockets.py +++ b/moonraker/websockets.py @@ -72,11 +72,12 @@ class JsonRPC: result = await method(*args, **kwargs) except TypeError as e: return self.build_error(-32603, "Invalid params", req_id) + except ServerError as e: + return self.build_error(e.status_code, str(e), req_id) except Exception as e: return self.build_error(-31000, str(e), req_id) - if isinstance(result, ServerError): - return self.build_error(result.status_code, str(result), req_id) - elif req_id is None: + + if req_id is None: return None else: return self.build_result(result, req_id) @@ -142,9 +143,8 @@ class WebsocketManager: def _generate_callback(self, endpoint, request_method): async def func(**kwargs): - request = self.server.make_request( + result = await self.server.make_request( endpoint, request_method, kwargs) - result = await request.wait() return result return func