forked from s3lph/matemat
Merge branch 'webserver-impl' into pagelet-return-api
This commit is contained in:
commit
7c078f2c63
3 changed files with 23 additions and 9 deletions
|
@ -1,5 +1,5 @@
|
|||
|
||||
from typing import Any, Callable, Dict, Tuple, Union
|
||||
from typing import Any, Callable, Dict, Tuple, Type, Union
|
||||
|
||||
import traceback
|
||||
|
||||
|
@ -89,6 +89,23 @@ def pagelet(path: str):
|
|||
return http_handler
|
||||
|
||||
|
||||
class MatematHTTPServer(HTTPServer):
|
||||
"""
|
||||
A http.server.HTTPServer subclass that acts as a container for data that must be persistent between requests.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
server_address: Any,
|
||||
handler: Type[BaseHTTPRequestHandler],
|
||||
webroot: str,
|
||||
bind_and_activate: bool = True) -> None:
|
||||
super().__init__(server_address, handler, bind_and_activate)
|
||||
# Resolve webroot directory
|
||||
self.webroot = os.path.abspath(webroot)
|
||||
# Set up session vars dict
|
||||
self.session_vars: Dict[str, Tuple[datetime, Dict[str, Any]]] = dict()
|
||||
|
||||
|
||||
class MatematWebserver(object):
|
||||
"""
|
||||
Then main webserver class, internally uses Python's http.server.
|
||||
|
@ -120,11 +137,7 @@ class MatematWebserver(object):
|
|||
# Rewrite IPv4 address to IPv6-mapped form
|
||||
listen = f'::ffff:{listen}'
|
||||
# Create the http server
|
||||
self._httpd = HTTPServer((listen, port), HttpHandler)
|
||||
# Set up session vars dict
|
||||
self._httpd.session_vars: Dict[str, Tuple[datetime, Dict[str, Any]]] = dict()
|
||||
# Resolve webroot directory
|
||||
self._httpd.webroot = os.path.abspath(webroot)
|
||||
self._httpd = MatematHTTPServer((listen, port), HttpHandler, webroot)
|
||||
|
||||
def start(self) -> None:
|
||||
"""
|
||||
|
@ -143,6 +156,7 @@ class HttpHandler(BaseHTTPRequestHandler):
|
|||
|
||||
def __init__(self, request: bytes, client_address: Tuple[str, int], server: HTTPServer) -> None:
|
||||
super().__init__(request, client_address, server)
|
||||
self.server: MatematHTTPServer
|
||||
|
||||
@property
|
||||
def server_version(self) -> str:
|
||||
|
|
|
@ -50,7 +50,7 @@ class RequestArguments(object):
|
|||
"""
|
||||
return _View.of(self.__container[key])
|
||||
|
||||
def __iter__(self) -> Iterator['RequestArguments']:
|
||||
def __iter__(self) -> Iterator['RequestArgument']:
|
||||
"""
|
||||
Returns an iterator over the values in this instance. Values are represented as immutable views.
|
||||
|
||||
|
|
|
@ -97,7 +97,7 @@ def parse_args(request: str, postbody: Optional[bytes] = None, enctype: str = 't
|
|||
tokens = urllib.parse.urlparse(request)
|
||||
# Parse the GET arguments
|
||||
if len(tokens.query) == 0:
|
||||
getargs = dict()
|
||||
getargs: Dict[str, List[str]] = dict()
|
||||
else:
|
||||
getargs = urllib.parse.parse_qs(tokens.query, strict_parsing=True, keep_blank_values=True, errors='strict')
|
||||
|
||||
|
@ -112,7 +112,7 @@ def parse_args(request: str, postbody: Optional[bytes] = None, enctype: str = 't
|
|||
# Parse the POST body
|
||||
pb: str = postbody.decode('utf-8')
|
||||
if len(pb) == 0:
|
||||
postargs = dict()
|
||||
postargs: Dict[str, List[str]] = dict()
|
||||
else:
|
||||
postargs = urllib.parse.parse_qs(pb, strict_parsing=True, keep_blank_values=True, errors='strict')
|
||||
# Write all POST values into the dict, overriding potential duplicates from GET
|
||||
|
|
Loading…
Reference in a new issue