# -*- coding: utf-8 -*- """ FileName: app Author: Tao Hao @contact: taohaohust@outlook.com Created time: 2019/5/29 Description: Changelog: """ from httpserver.exceptions import MethodNotAllowed import json from httpserver.response import HTTPResponse from httpserver.router import Router from httpserver.server import Server try: from ujson import dumps as json_dumps except ImportError: json_dumps = json.dumps class Application(object): def __init__(self, url_handler_list): self.router = None self.server = None self.create_router(url_handler_list) def create_router(self, url_handler_list): if self.router: raise Exception("route has exist") self.router = Router() for uri, handler in url_handler_list: if not issubclass(handler, RequestHandler): raise Exception("handler type is error") self.router.add(uri, handler) def run(self, host, port, backlog=128): self.server = Server(self) self.server.run(host, port, backlog) def stop(self): self.server.stop() self.router = None class RequestHandler(object): def __init__(self, request): self.request = request def execute_handler(self, *args, **kwargs): method = self.request.method if method == "HEAD": self.head(*args, **kwargs) elif method == "GET": self.get(*args, **kwargs) elif method == "POST": self.post(*args, **kwargs) elif method == "DELETE": self.delete(*args, **kwargs) elif method == "PATCH": self.patch(*args, **kwargs) elif method == "PUT": self.put(*args, **kwargs) elif method == "OPTIONS": self.options(*args, **kwargs) def head(self, *args, **kwargs): raise MethodNotAllowed("HEAD") def get(self, *args, **kwargs): raise MethodNotAllowed("GET") def post(self, *args, **kwargs): raise MethodNotAllowed("POST") def delete(self, *args, **kwargs): raise MethodNotAllowed("DELETE") def patch(self, *args, **kwargs): raise MethodNotAllowed("PATCH") def put(self, *args, **kwargs): raise MethodNotAllowed("PUT") def options(self, *args, **kwargs): raise MethodNotAllowed("OPTIONS") def write_text(self, text, status=200, headers=None, content_type="text/plain; charset=utf-8"): http_response = HTTPResponse( body=text, status=status, headers=headers, content_type=content_type ) self.request.connection.write_response(http_response) self._cleanup() def write_json(self, body, status=200, headers=None, content_type="application/json", dumps=json_dumps): http_response = HTTPResponse( body=dumps(body), status=status, headers=headers, content_type=content_type ) self.request.connection.write_response(http_response) self._cleanup() def write_raw(self, body, status=200, headers=None, content_type="application/octet-stream"): http_response = HTTPResponse( body_bytes=body, status=status, headers=headers, content_type=content_type ) self.request.connection.write_response(http_response) self._cleanup() def _cleanup(self): self.request = None