optimize send a little bit

pull/106/head
Ciro 2023-02-06 12:11:05 -03:00
rodzic f04a5fd642
commit a84dba6eab
8 zmienionych plików z 803 dodań i 552 usunięć

Wyświetl plik

@ -4,10 +4,12 @@ import multiprocessing
import asyncio
def run_app():
app = App(request_response_factory_max_items=200_000)
async def home(res, req):
res.end("Hello, World!")
router = app.router()
@router.get("/")
def home(res, req):
res.send(b"Hello, World!")
app.get("/", home)
app.listen(
8000,
lambda config: print(

Wyświetl plik

@ -61,7 +61,7 @@ class AppResponse:
def get_proxied_remote_address_bytes(self):
def get_proxied_remote_address(self):
def cork_send(self, message: any, content_type: str = b'text/plain', status : str | bytes | int = b'200 OK', headers=None, end_connection=False):
def send(self, message: any, content_type: str = b'text/plain', status : str | bytes | int = b'200 OK', headers=None, end_connection=False):
def send(self, message: any = b"", content_type: str = b'text/plain', status : str | bytes | int = b'200 OK', headers=None, end_connection=False):
def end(self, message, end_connection=False):
def pause(self):
def resume(self):

Wyświetl plik

@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "socketify"
version = "0.0.12"
version = "0.0.13"
authors = [
{ name="Ciro Spaciari", email="ciro.spaciari@gmail.com" },
]

Wyświetl plik

@ -58,7 +58,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
setuptools.setup(
name="socketify",
version="0.0.12",
version="0.0.13",
platforms=["any"],
author="Ciro Spaciari",
author_email="ciro.spaciari@gmail.com",

Wyświetl plik

@ -385,6 +385,12 @@ void socketify_ws_cork_send(int ssl, uws_websocket_t *ws, const char* data, size
void socketify_ws_cork_send_with_options(int ssl, uws_websocket_t *ws, const char* data, size_t length, uws_opcode_t opcode, bool compress, bool close_connection);
void socketify_res_send_int_code(int ssl, uws_res_t *res, const char* content_data, size_t content_data_size, int code, const char *content_type, size_t content_type_size, bool close_connection);
void socketify_res_send(int ssl, uws_res_t *res, const char *content_data, size_t content_data_size, const char *status_code, size_t status_code_size, const char *content_type, size_t content_type_size, bool close_connection);
void socketify_res_cork_send_int_code(int ssl, uws_res_t *res, const char* content_data, size_t content_data_size, int code, const char *content_type, size_t content_type_size, bool close_connection);
void socketify_res_cork_send(int ssl, uws_res_t *res, const char *content_data, size_t content_data_size, const char *status_code, size_t status_code_size, const char *content_type, size_t content_type_size, bool close_connection);
"""
)

Wyświetl plik

@ -138,6 +138,10 @@ DLL_EXPORT socksocketify_asgi_ws_app_info* socketify_add_asgi_ws_handler(int ssl
DLL_EXPORT void socketify_destroy_asgi_ws_app_info(socksocketify_asgi_ws_app_info* app);
DLL_EXPORT void socketify_ws_cork_send(int ssl, uws_websocket_t *ws, const char* data, size_t length, uws_opcode_t opcode);
DLL_EXPORT void socketify_ws_cork_send_with_options(int ssl, uws_websocket_t *ws, const char* data, size_t length, uws_opcode_t opcode, bool compress, bool fin);
DLL_EXPORT void socketify_res_send_int_code(int ssl, uws_res_t *res, const char* content_data, size_t content_data_size, int code, const char *content_type, size_t content_type_size, bool close_connection);
DLL_EXPORT void socketify_res_send(int ssl, uws_res_t *res, const char *content_data, size_t content_data_size, const char *status_code, size_t status_code_size, const char *content_type, size_t content_type_size, bool close_connection);
DLL_EXPORT void socketify_res_cork_send_int_code(int ssl, uws_res_t *res, const char* content_data, size_t content_data_size, int code, const char *content_type, size_t content_type_size, bool close_connection);
DLL_EXPORT void socketify_res_cork_send(int ssl, uws_res_t *res, const char *content_data, size_t content_data_size, const char *status_code, size_t status_code_size, const char *content_type, size_t content_type_size, bool close_connection);
#endif
#ifdef __cplusplus
}

Wyświetl plik

@ -1733,6 +1733,7 @@ class AppResponse:
headers=None,
end_connection: bool = False,
):
# TODO: use socketify_res_cork_send_int_code and socketify_res_cork_send after optimize headers
self.cork(
lambda res: res.send(message, content_type, status, headers, end_connection)
)
@ -1740,42 +1741,107 @@ class AppResponse:
def send(
self,
message: any,
message: any = b"",
content_type: Union[str, bytes] = b"text/plain",
status: Union[str, bytes, int] = b"200 OK",
headers=None,
headers = None,
end_connection: bool = False,
):
if self.aborted:
return self
self.write_status(status)
# TODO: optimize headers
if headers is not None:
for name, value in headers:
self.write_header(name, value)
try:
# TODO: optimize Set-Cookie
if self._write_jar is not None:
self.write_header("Set-Cookie", self._write_jar.output(header=""))
self._write_jar = None
if isinstance(message, str):
data = message.encode("utf-8")
self.write_header(b"Content-Type", content_type)
elif isinstance(message, bytes):
self.write_header(b"Content-Type", content_type)
data = message
elif message is None:
self.write_header(b"Content-Type", content_type)
self.end_without_body(end_connection)
if isinstance(status, int):
lib.socketify_res_send_int_code(
self.app.SSL,
self.res,
ffi.NULL,
0,
status,
content_type,
len(content_type),
1 if end_connection else 0,
)
elif isinstance(status, str):
status = status.encode("utf-8")
lib.socketify_res_send(
self.app.SSL,
self.res,
ffi.NULL,
0,
status,
len(status),
content_type,
len(content_type),
1 if end_connection else 0,
)
else:
lib.socketify_res_send(
self.app.SSL,
self.res,
ffi.NULL,
0,
status,
len(status),
content_type,
len(content_type),
1 if end_connection else 0,
)
return self
else:
data = self.app._json_serializer.dumps(message).encode("utf-8")
# ignores content_type should always be json here
self.write_header(b"Content-Type", b"application/json")
content_type = b"application/json"
if isinstance(status, int):
lib.socketify_res_send_int_code(
self.app.SSL,
self.res,
data,
len(data),
status,
content_type,
len(content_type),
1 if end_connection else 0,
)
elif isinstance(status, str):
status = status.encode("utf-8")
lib.socketify_res_send(
self.app.SSL,
self.res,
ffi.NULL,
0,
status,
len(status),
content_type,
len(content_type),
1 if end_connection else 0,
)
else:
lib.socketify_res_send(
self.app.SSL,
self.res,
data,
len(data),
status,
len(status),
content_type,
len(content_type),
1 if end_connection else 0,
)
lib.uws_res_end(
self.app.SSL, self.res, data, len(data), 1 if end_connection else 0
)
finally:
return self
@ -2506,7 +2572,6 @@ class App:
self._native_options.append(cert_file_name)
socket_options.cert_file_name = cert_file_name
passphrase = (
ffi.NULL
if options.passphrase is None