Source code

Revision control

Copy as Markdown

Other Tools

# mypy: allow-untyped-defs
import json
import sys
import traceback
import logging
from urllib.parse import parse_qsl
global logger
logger = logging.getLogger("wave-api-handler")
class ApiHandler:
def __init__(self, web_root):
self._web_root = web_root
def set_headers(self, response, headers):
if not isinstance(response.headers, list):
response.headers = []
for header in headers:
response.headers.append(header)
def send_json(self, data, response, status=None):
if status is None:
status = 200
json_string = json.dumps(data, indent=4)
response.content = json_string
self.set_headers(response, [("Content-Type", "application/json")])
response.status = status
def send_file(self, blob, file_name, response):
self.set_headers(response,
[("Content-Disposition",
"attachment;filename=" + file_name)])
response.content = blob
def send_zip(self, data, file_name, response):
response.headers = [("Content-Type", "application/x-compressed")]
self.send_file(data, file_name, response)
def parse_uri(self, request):
path = request.url_parts.path
if self._web_root is not None:
path = path[len(self._web_root):]
uri_parts = list(filter(None, path.split("/")))
return uri_parts
def parse_query_parameters(self, request):
return dict(parse_qsl(request.url_parts.query))
def handle_exception(self, message):
info = sys.exc_info()
traceback.print_tb(info[2])
logger.error(f"{message}: {info[0].__name__}: {info[1].args[0]}")
def create_hal_list(self, items, uris, index, count, total):
hal_list = {}
links = {}
if uris is not None:
for relation in uris:
if relation == "self":
continue
uri = uris[relation]
templated = "{" in uri
links[relation] = {"href": uri, "templated": templated}
if "self" in uris:
self_uri = uris["self"]
self_uri += f"?index={index}&count={count}"
links["self"] = {"href": self_uri}
first_uri = uris["self"]
first_uri += f"?index={0}&count={count}"
links["first"] = {"href": first_uri}
last_uri = uris["self"]
last_uri += f"?index={total - (total % count)}&count={count}"
links["last"] = {"href": last_uri}
if index + count <= total:
next_index = index + count
next_uri = uris["self"]
next_uri += f"?index={next_index}&count={count}"
links["next"] = {"href": next_uri}
if index != 0:
previous_index = index - count
if previous_index < 0:
previous_index = 0
previous_uri = uris["self"]
previous_uri += f"?index={previous_index}&count={count}"
links["previous"] = {"href": previous_uri}
hal_list["_links"] = links
hal_list["items"] = items
return hal_list