From ea2f9694d5044bb33fd44a3d7a79fd53af8d6a5d Mon Sep 17 00:00:00 2001 From: simon987 Date: Sun, 10 Mar 2019 10:00:36 -0400 Subject: [PATCH] Minimum viable --- .gitignore/.gitignore => .gitignore | 0 __init__.py | 0 api.py | 77 +++++++++++++++++++++++++++++ requirements.txt | 2 + 4 files changed, 79 insertions(+) rename .gitignore/.gitignore => .gitignore (100%) create mode 100644 __init__.py create mode 100644 api.py create mode 100644 requirements.txt diff --git a/.gitignore/.gitignore b/.gitignore similarity index 100% rename from .gitignore/.gitignore rename to .gitignore diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api.py b/api.py new file mode 100644 index 0000000..c203a70 --- /dev/null +++ b/api.py @@ -0,0 +1,77 @@ +import hashlib +import hmac +import json +from email.utils import formatdate +from typing import BinaryIO + +import requests +import websocket + +MAX_HTTP_RETRIES = 3 +API_TIMEOUT = 10 + + +class WsBucketApi: + + def __init__(self, url: str, secret: str = None): + self._url = url + self._secret = secret.encode("utf8") + + def allocate(self, token: str, max_size: int, file_name: str): + return self._http_post("/slot", { + "token": token, + "max_size": max_size, + "file_name": file_name, + }) + + def read(self, token: str): + return self._http_get("/slot", token) + + def upload(self, token: str, stream: BinaryIO, max_size: int): + ws = websocket.WebSocket() + ws.connect("ws://" + self._url + "/upload", header={ + "X-Upload-Token": token, + }) + + ws.send_binary(stream.read()[:max_size]) + + def _http_post(self, endpoint, body): + + body = json.dumps(body) + + ts = formatdate(timeval=None, localtime=False, usegmt=True) + signature = hmac.new(key=self._secret, msg=(body + ts).encode("utf8"), + digestmod=hashlib.sha256).hexdigest() + headers = { + "Timestamp": ts, + "X-Signature": signature + } + + retries = 0 + while retries < MAX_HTTP_RETRIES: + try: + response = requests.post("http://" + self._url + endpoint, timeout=API_TIMEOUT, + headers=headers, data=body.encode("utf8")) + return response + except Exception as e: + print(str(type(e)) + str(e)) + retries += 1 + pass + return None + + def _http_get(self, endpoint, token): + headers = { + "X-Upload-Token": token, + } + + retries = 0 + while retries < MAX_HTTP_RETRIES: + try: + response = requests.get("http://" + self._url + endpoint, timeout=API_TIMEOUT, + headers=headers) + return response + except Exception as e: + print(str(type(e)) + str(e)) + retries += 1 + pass + return None diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..53d1afd --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +websocket-client +requests \ No newline at end of file