merge with main

pull/75/head
Ciro 2022-12-07 12:45:43 -03:00
commit 4f549efbfc
1 zmienionych plików z 42 dodań i 52 usunięć

Wyświetl plik

@ -17,6 +17,8 @@ from .native import ffi, lib
from .loop import Loop from .loop import Loop
from .status_codes import status_codes from .status_codes import status_codes
from .helpers import static_route from .helpers import static_route
from dataclasses import dataclass
from types import NoneType
mimetypes.init() mimetypes.init()
@ -968,7 +970,7 @@ class WebSocketFactory:
def get(self, app, ws): def get(self, app, ws):
if len(self.factory_queue) == 0: if len(self.factory_queue) == 0:
response = WebSocket(ws, app.SSL, app.loop) response = WebSocket(ws, app.SSL, app.loop)
return (response, False) return response, False
instances = self.factory_queue.pop() instances = self.factory_queue.pop()
(websocket, _) = instances (websocket, _) = instances
@ -998,7 +1000,7 @@ class RequestResponseFactory:
if len(self.factory_queue) == 0: if len(self.factory_queue) == 0:
response = AppResponse(res, app.loop, app.SSL, app._template) response = AppResponse(res, app.loop, app.SSL, app._template)
request = AppRequest(req) request = AppRequest(req)
return (response, request, False) return response, request, False
instances = self.factory_queue.pop() instances = self.factory_queue.pop()
(response, request, _) = instances (response, request, _) = instances
@ -1466,7 +1468,7 @@ class AppResponse:
def try_end(self, message, total_size, end_connection=False): def try_end(self, message, total_size, end_connection=False):
try: try:
if self.aborted: if self.aborted:
return (False, True) return False, True
if self._write_jar is not None: if self._write_jar is not None:
self.write_header("Set-Cookie", self._write_jar.output(header="")) self.write_header("Set-Cookie", self._write_jar.output(header=""))
self._write_jar = None self._write_jar = None
@ -1475,7 +1477,7 @@ class AppResponse:
elif isinstance(message, bytes): elif isinstance(message, bytes):
data = message data = message
else: else:
return (False, True) return False, True
result = lib.uws_res_try_end( result = lib.uws_res_try_end(
self.SSL, self.SSL,
self.res, self.res,
@ -1484,9 +1486,9 @@ class AppResponse:
ffi.cast("uintmax_t", total_size), ffi.cast("uintmax_t", total_size),
1 if end_connection else 0, 1 if end_connection else 0,
) )
return (bool(result.ok), bool(result.has_responded)) return bool(result.ok), bool(result.has_responded)
except: except:
return (False, True) return False, True
def cork_end(self, message, end_connection=False): def cork_end(self, message, end_connection=False):
self.cork(lambda res: res.end(message, end_connection)) self.cork(lambda res: res.end(message, end_connection))
@ -1758,11 +1760,6 @@ class App:
if options.key_file_name is None if options.key_file_name is None
else ffi.new("char[]", options.key_file_name.encode("utf-8")) else ffi.new("char[]", options.key_file_name.encode("utf-8"))
) )
socket_options.key_file_name = (
ffi.NULL
if options.key_file_name is None
else ffi.new("char[]", options.key_file_name.encode("utf-8"))
)
socket_options.cert_file_name = ( socket_options.cert_file_name = (
ffi.NULL ffi.NULL
if options.cert_file_name is None if options.cert_file_name is None
@ -2260,7 +2257,7 @@ class App:
def close(self): def close(self):
if hasattr(self, "socket"): if hasattr(self, "socket"):
if not self.socket == ffi.NULL: if self.socket != ffi.NULL:
lib.us_listen_socket_close(self.SSL, self.socket) lib.us_listen_socket_close(self.SSL, self.socket)
self.socket = ffi.NULL self.socket = ffi.NULL
self.loop.stop() self.loop.stop()
@ -2319,50 +2316,43 @@ class App:
@dataclass
class AppListenOptions: class AppListenOptions:
def __init__(self, port=0, host=None, options=0): port: int = 0
if not isinstance(port, int): host: str = None
options: int = 0
def __post_init__(self):
if not isinstance(self.port, int):
raise RuntimeError("port must be an int") raise RuntimeError("port must be an int")
if host is not None and not isinstance(host, str): if not isinstance(self.host, (NoneType, str)):
raise RuntimeError("host must be an String or None") raise RuntimeError("host must be a str if specified")
if not isinstance(options, int): if not isinstance(self.options, int):
raise RuntimeError("options must be an int") raise RuntimeError("options must be an int")
self.port = port
self.host = host
self.options = options
@dataclass
class AppOptions: class AppOptions:
def __init__( key_file_name: str = None,
self, cert_file_name: str = None,
key_file_name=None, passphrase: str = None,
cert_file_name=None, dh_params_file_name: str = None,
passphrase=None, ca_file_name: str = None,
dh_params_file_name=None, ssl_ciphers: str = None,
ca_file_name=None, ssl_prefer_low_memory_usage: int = 0
ssl_ciphers=None,
ssl_prefer_low_memory_usage=0 def __post_init__(self):
): if not isinstance(self.key_file_name, (NoneType, str)):
if key_file_name is not None and not isinstance(key_file_name, str): raise RuntimeError("key_file_name must be a str if specified")
raise RuntimeError("key_file_name must be an String or None") if not isinstance(self.cert_file_name, (NoneType, str)):
if cert_file_name is not None and not isinstance(cert_file_name, str): raise RuntimeError("cert_file_name must be a str if specified")
raise RuntimeError("cert_file_name must be an String or None") if not isinstance(self.passphrase, (NoneType, str)):
if passphrase is not None and not isinstance(passphrase, str): raise RuntimeError("passphrase must be a str if specified")
raise RuntimeError("passphrase must be an String or None") if not isinstance(self.dh_params_file_name, (NoneType, str)):
if dh_params_file_name is not None and not isinstance(dh_params_file_name, str): raise RuntimeError("dh_params_file_name must be a str if specified")
raise RuntimeError("dh_params_file_name must be an String or None") if not isinstance(self.ca_file_name, (NoneType, str)):
if ca_file_name is not None and not isinstance(ca_file_name, str): raise RuntimeError("ca_file_name must be a str if specified")
raise RuntimeError("ca_file_name must be an String or None") if not isinstance(self.ssl_ciphers, (NoneType, str)):
if ssl_ciphers is not None and not isinstance(ssl_ciphers, str): raise RuntimeError("ssl_ciphers must be a str if specified")
raise RuntimeError("ssl_ciphers must be an String or None") if not isinstance(self.ssl_prefer_low_memory_usage, int):
if not isinstance(ssl_prefer_low_memory_usage, int):
raise RuntimeError("ssl_prefer_low_memory_usage must be an int") raise RuntimeError("ssl_prefer_low_memory_usage must be an int")
self.key_file_name = key_file_name
self.cert_file_name = cert_file_name
self.passphrase = passphrase
self.dh_params_file_name = dh_params_file_name
self.ca_file_name = ca_file_name
self.ssl_ciphers = ssl_ciphers
self.ssl_prefer_low_memory_usage = ssl_prefer_low_memory_usage