Support timeout parameter in client and CLI

This commit is contained in:
Gina Häußge 2017-04-12 15:40:54 +02:00
parent 251a1ea4b5
commit c00b46ef5c
2 changed files with 45 additions and 34 deletions

View file

@ -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)

View file

@ -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