aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2021-07-22 20:50:16 -0400
committerKevin O'Connor <kevin@koconnor.net>2021-08-22 11:10:19 -0400
commitcf2e941aec5bbe1c992fcfde6bd91db2389e7e94 (patch)
tree9fb43c5b6b5c01d44498013b74be0a7b5b1ef193
parent809f1ccea691bd9c2242808b6bbb41d2404d699f (diff)
downloadkutter-cf2e941aec5bbe1c992fcfde6bd91db2389e7e94.tar.gz
kutter-cf2e941aec5bbe1c992fcfde6bd91db2389e7e94.tar.xz
kutter-cf2e941aec5bbe1c992fcfde6bd91db2389e7e94.zip
webhooks: Add register_mux_endpoint() helper function
Add ability to register an endpoint that invokes a handler based on a parameter in the request. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--klippy/webhooks.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/klippy/webhooks.py b/klippy/webhooks.py
index da951279..de89a283 100644
--- a/klippy/webhooks.py
+++ b/klippy/webhooks.py
@@ -289,6 +289,7 @@ class WebHooks:
self.printer = printer
self._endpoints = {"list_endpoints": self._handle_list_endpoints}
self._remote_methods = {}
+ self._mux_endpoints = {}
self.register_endpoint("info", self._handle_info_request)
self.register_endpoint("emergency_stop", self._handle_estop_request)
self.register_endpoint("register_remote_method",
@@ -300,6 +301,33 @@ class WebHooks:
raise WebRequestError("Path already registered to an endpoint")
self._endpoints[path] = callback
+ def register_mux_endpoint(self, path, key, value, callback):
+ prev = self._mux_endpoints.get(path)
+ if prev is None:
+ self.register_endpoint(path, self._handle_mux)
+ self._mux_endpoints[path] = prev = (key, {})
+ prev_key, prev_values = prev
+ if prev_key != key:
+ raise self.printer.config_error(
+ "mux endpoint %s %s %s may have only one key (%s)"
+ % (path, key, value, prev_key))
+ if value in prev_values:
+ raise self.printer.config_error(
+ "mux endpoint %s %s %s already registered (%s)"
+ % (path, key, value, prev_values))
+ prev_values[value] = callback
+
+ def _handle_mux(self, web_request):
+ key, values = self._mux_endpoints[web_request.get_method()]
+ if None in values:
+ key_param = web_request.get(key, None)
+ else:
+ key_param = web_request.get(key)
+ if key_param not in values:
+ raise web_request.error("The value '%s' is not valid for %s"
+ % (key_param, key))
+ values[key_param](web_request)
+
def _handle_list_endpoints(self, web_request):
web_request.send({'endpoints': list(self._endpoints.keys())})