diff --git a/src/octoprint/cli/client.py b/src/octoprint/cli/client.py index 070806ad..97fcce65 100644 --- a/src/octoprint/cli/client.py +++ b/src/octoprint/cli/client.py @@ -79,30 +79,33 @@ def log_response(response, status_code=True, body=True, headers=False): @client.command("get") @click.argument("path") +@click.option("--timeout", type=float, default=None) @click.pass_context -def get(ctx, path): +def get(ctx, path, timeout): """Performs a GET request against the specified server path.""" - r = ctx.obj.client.get(path) + r = ctx.obj.client.get(path, timeout=timeout) log_response(r) @client.command("post_json") @click.argument("path") @click.argument("data", type=JsonStringParamType()) +@click.option("--timeout", type=float, default=None) @click.pass_context -def post_json(ctx, path, data): +def post_json(ctx, path, data, timeout): """POSTs JSON data to the specified server path.""" - r = ctx.obj.client.post_json(path, data) + r = ctx.obj.client.post_json(path, data, timeout=timeout) log_response(r) @client.command("patch_json") @click.argument("path") @click.argument("data", type=JsonStringParamType()) +@click.option("--timeout", type=float, default=None, help="Request timeout in seconds") @click.pass_context -def patch_json(ctx, path, data): +def patch_json(ctx, path, data, timeout): """PATCHes JSON data to the specified server path.""" - r = ctx.obj.client.patch(path, data, encoding="json") + r = ctx.obj.client.patch(path, data, encoding="json", timeout=timeout) log_response(r) @@ -111,9 +114,10 @@ def patch_json(ctx, path, data): @click.argument("file_path", type=click.Path(exists=True, dir_okay=False, resolve_path=True)) @click.option("--json", is_flag=True) @click.option("--yaml", is_flag=True) +@click.option("--timeout", type=float, default=None, help="Request timeout in seconds") @click.pass_context -def post_from_file(ctx, path, file_path, json_flag, yaml_flag): - """POSTs JSON data to the specified server path.""" +def post_from_file(ctx, path, file_path, json_flag, yaml_flag, timeout): + """POSTs JSON data to the specified server path, taking the data from the specified file.""" if json_flag or yaml_flag: if json_flag: with open(file_path, "rb") as fp: @@ -123,12 +127,12 @@ def post_from_file(ctx, path, file_path, json_flag, yaml_flag): with open(file_path, "rb") as fp: data = yaml.safe_load(fp) - r = ctx.obj.client.post_json(path, data) + r = ctx.obj.client.post_json(path, data, timeout=timeout) else: with open(file_path, "rb") as fp: data = fp.read() - r = ctx.obj.client.post(path, data) + r = ctx.obj.client.post(path, data, timeout=timeout) log_response(r) @@ -140,14 +144,15 @@ def post_from_file(ctx, path, file_path, json_flag, yaml_flag): @click.option("--int", "-i", "int_params", multiple=True, nargs=2, type=click.Tuple([unicode, int])) @click.option("--float", "-f", "float_params", multiple=True, nargs=2, type=click.Tuple([unicode, float])) @click.option("--bool", "-b", "bool_params", multiple=True, nargs=2, type=click.Tuple([unicode, bool])) +@click.option("--timeout", type=float, default=None, help="Request timeout in seconds") @click.pass_context -def command(ctx, path, command, str_params, int_params, float_params, bool_params): +def command(ctx, path, command, str_params, int_params, float_params, bool_params, timeout): """Sends a JSON command to the specified server path.""" data = dict() params = str_params + int_params + float_params + bool_params for param in params: data[param[0]] = param[1] - r = ctx.obj.client.post_command(path, command, additional=data) + r = ctx.obj.client.post_command(path, command, additional=data, timeout=timeout) log_response(r, body=False) @@ -157,23 +162,26 @@ def command(ctx, path, command, str_params, int_params, float_params, bool_param @click.option("--parameter", "-P", "params", multiple=True, nargs=2, type=click.Tuple([unicode, unicode])) @click.option("--file-name", type=click.STRING) @click.option("--content-type", type=click.STRING) +@click.option("--timeout", type=float, default=None, help="Request timeout in seconds") @click.pass_context -def upload(ctx, path, file_path, params, file_name, content_type): +def upload(ctx, path, file_path, params, file_name, content_type, timeout): """Uploads the specified file to the specified server path.""" data = dict() for param in params: data[param[0]] = param[1] - r = ctx.obj.client.upload(path, file_path, additional=data, file_name=file_name, content_type=content_type) + r = ctx.obj.client.upload(path, file_path, + additional=data, file_name=file_name, content_type=content_type, timeout=timeout) log_response(r) @client.command("delete") @click.argument("path") +@click.option("--timeout", type=float, default=None, help="Request timeout in seconds") @click.pass_context -def delete(ctx, path): +def delete(ctx, path, timeout): """Sends a DELETE request to the specified server path.""" - r = ctx.obj.client.delete(path) + r = ctx.obj.client.delete(path, timeout=timeout) log_response(r) diff --git a/src/octoprint_client/__init__.py b/src/octoprint_client/__init__.py index 9f08eae2..33afec86 100644 --- a/src/octoprint_client/__init__.py +++ b/src/octoprint_client/__init__.py @@ -223,7 +223,10 @@ class Client(object): url = self.baseurl + "/" + path return requests.Request(method=method, url=url, params=params, headers={"X-Api-Key": self.apikey}).prepare() - def request(self, method, path, data=None, files=None, encoding=None, params=None): + def request(self, method, path, data=None, files=None, encoding=None, params=None, timeout=None): + if timeout is None: + timeout = 30 + s = requests.Session() request = self.prepare_request(method, path, params=params) if data or files: @@ -231,25 +234,25 @@ class Client(object): request.prepare_body(None, None, json=data) else: request.prepare_body(data, files=files) - response = s.send(request, timeout=10) + response = s.send(request, timeout=timeout) return response - def get(self, path, params=None): - return self.request("GET", path, params=params) + def get(self, path, params=None, timeout=None): + return self.request("GET", path, params=params, timeout=timeout) - def post(self, path, data, encoding=None, params=None): - return self.request("POST", path, data=data, encoding=encoding, params=params) + def post(self, path, data, encoding=None, params=None, timeout=None): + return self.request("POST", path, data=data, encoding=encoding, params=params, timeout=timeout) - def post_json(self, path, data, params=None): - return self.post(path, data, encoding="json", params=params) + def post_json(self, path, data, params=None, timeout=None): + return self.post(path, data, encoding="json", params=params, timeout=timeout) - def post_command(self, path, command, additional=None): + def post_command(self, path, command, additional=None, timeout=None): data = dict(command=command) if additional: data.update(additional) - return self.post_json(path, data, params=data) + return self.post_json(path, data, params=data, timeout=timeout) - def upload(self, path, file_path, additional=None, file_name=None, content_type=None, params=None): + def upload(self, path, file_path, additional=None, file_name=None, content_type=None, params=None, timeout=None): import os if not os.path.isfile(file_path): @@ -264,18 +267,18 @@ class Client(object): else: files = dict(file=(file_name, fp)) - response = self.request("POST", path, data=additional, files=files, params=params) + response = self.request("POST", path, data=additional, files=files, params=params, timeout=timeout) return response - def delete(self, path, params=None): - return self.request("DELETE", path, params=params) + def delete(self, path, params=None, timeout=None): + return self.request("DELETE", path, params=params, timeout=timeout) - def patch(self, path, data, encoding=None, params=None): - return self.request("PATCH", path, data=data, encoding=encoding, params=params) + def patch(self, path, data, encoding=None, params=None, timeout=None): + return self.request("PATCH", path, data=data, encoding=encoding, params=params, timeout=timeout) - def put(self, path, data, encoding=None, params=None): - return self.request("PUT", path, data=data, encoding=encoding, params=params) + def put(self, path, data, encoding=None, params=None, timeout=None): + return self.request("PUT", path, data=data, encoding=encoding, params=params, timeout=timeout) def create_socket(self, **kwargs): import uuid