moonraker: klippy requests no longer take a "request method"

Klippy rpc methods now accept either GET or POST, the method will be executed.

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Arksine 2020-08-13 18:15:17 -04:00
parent 5b6d4371c8
commit 43b057c40c
7 changed files with 28 additions and 42 deletions

View File

@ -156,7 +156,6 @@ class MoonrakerApp:
params = {}
params['server'] = self.server
params['auth'] = self.auth
params['methods'] = api_def.request_methods
params['arg_parser'] = api_def.parser
params['remote_callback'] = api_def.endpoint
self.mutable_router.add_handler(
@ -236,32 +235,24 @@ class MoonrakerApp:
# ***** Dynamic Handlers*****
class RemoteRequestHandler(AuthorizedRequestHandler):
def initialize(self, remote_callback, server, auth,
methods, arg_parser):
def initialize(self, remote_callback, server, auth, arg_parser):
super(RemoteRequestHandler, self).initialize(server, auth)
self.remote_callback = remote_callback
self.methods = methods
self.query_parser = arg_parser
async def get(self):
if 'GET' in self.methods:
await self._process_http_request('GET')
else:
raise tornado.web.HTTPError(405)
await self._process_http_request()
async def post(self):
if 'POST' in self.methods:
await self._process_http_request('POST')
else:
raise tornado.web.HTTPError(405)
await self._process_http_request()
async def _process_http_request(self, method):
async def _process_http_request(self):
args = {}
if self.request.query:
args = self.query_parser(self.request)
try:
result = await self.server.make_request(
self.remote_callback, method, args)
self.remote_callback, args)
except ServerError as e:
raise tornado.web.HTTPError(
e.status_code, str(e)) from e

View File

@ -217,7 +217,7 @@ class Server:
async def _request_endpoints(self):
try:
result = await self.make_request("list_endpoints", "GET", {})
result = await self.make_request("list_endpoints", {})
except ServerError:
return
endpoints = result.get('hooks', {})
@ -231,7 +231,7 @@ class Server:
async def _check_available_objects(self):
try:
result = await self.make_request("objects/list", "GET", {})
result = await self.make_request("objects/list", {})
except ServerError as e:
logging.info(
f"{e}\nUnable to retreive Klipper Object List")
@ -249,7 +249,7 @@ class Server:
async def _check_ready(self):
try:
result = await self.make_request("info", "GET", {})
result = await self.make_request("info", {})
except ServerError as e:
logging.info(
f"{e}\nKlippy info request error. This indicates that\n"
@ -289,8 +289,8 @@ class Server:
def _process_status_update(self, status):
self.send_event("server:status_update", status)
async def make_request(self, path, method, args):
base_request = BaseRequest(path, method, args)
async def make_request(self, rpc_method, params):
base_request = BaseRequest(rpc_method, params)
self.pending_requests[base_request.id] = base_request
self.ioloop.spawn_callback(
self.send_klippy_request, base_request)
@ -325,11 +325,10 @@ class Server:
# Basic WebRequest class, easily converted to dict for json encoding
class BaseRequest:
def __init__(self, path, method, args):
def __init__(self, rpc_method, params):
self.id = id(self)
self.path = path
self.method = method
self.args = args
self.rpc_method = rpc_method
self.params = params
self._event = Event()
self.response = None
@ -343,7 +342,7 @@ class BaseRequest:
except TimeoutError:
pending_time = time.time() - start_time
logging.info(
f"Request '{self.method} {self.path}' pending:"
f"Request '{self.rpc_method}' pending: "
f"{pending_time:.2f} seconds")
self._event.clear()
continue
@ -357,8 +356,8 @@ class BaseRequest:
self._event.set()
def to_dict(self):
return {'id': self.id, 'path': self.path,
'method': self.method, 'args': self.args}
return {'id': self.id, 'method': self.rpc_method,
'params': self.params}
def main():
# Parse start arguments

View File

@ -168,7 +168,7 @@ class FileManager:
async def _handle_operation_check(self, requested_path):
# Get virtual_sdcard status
result = await self.server.make_request(
"objects/status", 'GET', {'print_stats': []})
"objects/status", {'print_stats': []})
pstats = result.get('print_stats', {})
loaded_file = pstats.get('filename', "")
state = pstats.get('state', "")

View File

@ -32,8 +32,7 @@ class GCodeAPIs:
async def _send_gcode(self, script):
args = {'script': script}
result = await self.server.make_request(
GCODE_ENDPOINT, 'POST', args)
result = await self.server.make_request(GCODE_ENDPOINT, args)
return result
async def gcode_pause(self, path, method, args):

View File

@ -208,9 +208,9 @@ class PanelDue:
'M999': lambda args: "FIRMWARE_RESTART"
}
async def _klippy_request(self, command, method='GET', args={}):
async def _klippy_request(self, command, args={}):
try:
result = await self.server.make_request(command, method, args)
result = await self.server.make_request(command, args)
except self.server.error as e:
script = args.get('script', "")
if script in ["RESTART", "FIRMWARE_RESTART"] and \
@ -276,8 +276,7 @@ class PanelDue:
self.heaters.append(cfg)
sub_args[cfg] = []
try:
await self._klippy_request(
"objects/subscription", method='POST', args=sub_args)
await self._klippy_request("objects/subscription", args=sub_args)
except PanelDueError:
logging.exception("Unable to complete subscription request")
self.is_shutdown = False
@ -303,7 +302,7 @@ class PanelDue:
async def process_line(self, line):
# If we find M112 in the line then skip verification
if "M112" in line.upper():
await self._klippy_request("emergency_stop", method='POST')
await self._klippy_request("emergency_stop")
return
# Get line number
@ -373,8 +372,7 @@ class PanelDue:
try:
args = {'script': script}
await self._klippy_request(
"gcode/script", method='POST', args=args)
await self._klippy_request("gcode/script", args=args)
except PanelDueError:
msg = f"Error executing script {script}"
self.handle_gcode_response("!! " + msg)

View File

@ -38,7 +38,7 @@ class TemperatureStore:
# Fetch sensors
try:
result = await self.server.make_request(
"objects/status", 'GET', {'heaters': []})
"objects/status", {'heaters': []})
except self.server.error as e:
logging.info(f"Error Configuring Sensors: {e}")
return
@ -49,7 +49,7 @@ class TemperatureStore:
sub = {s: [] for s in sensors}
try:
result = await self.server.make_request(
"objects/subscription", 'POST', sub)
"objects/subscription", sub)
except self.server.error as e:
logging.info(f"Error subscribing to sensors: {e}")
return

View File

@ -134,17 +134,16 @@ class WebsocketManager:
api_def.endpoint, r_method, callback)
else:
# Callback is a remote method
rpc_cb = self._generate_callback(api_def.endpoint, r_method)
rpc_cb = self._generate_callback(api_def.endpoint)
self.rpc.register_method(cmd, rpc_cb)
def remove_handler(self, ws_method):
for prefix in ["get", "post", "delete"]:
self.rpc.remove_method(prefix + "_" + ws_method)
def _generate_callback(self, endpoint, request_method):
def _generate_callback(self, endpoint):
async def func(**kwargs):
result = await self.server.make_request(
endpoint, request_method, kwargs)
result = await self.server.make_request(endpoint, kwargs)
return result
return func