new native optimizations for ASGI

pull/39/head
Ciro 2022-12-04 15:56:55 -03:00
rodzic c781dc8c07
commit cdc388d671
2 zmienionych plików z 94 dodań i 5 usunięć

Wyświetl plik

@ -145,15 +145,23 @@ socketify_asgi_data socketify_asgi_request(int ssl, uws_req_t *req, uws_res_t *r
result.query_string_size = query_string_size;
result.method_size = method_size;
result.remote_address_size = remote_address_size;
result.has_content = false;
uWS::HttpRequest *uwsReq = (uWS::HttpRequest *)req;
result.header_list = NULL;
socketify_header* last = NULL;
for (auto header : *uwsReq)
{
socketify_header* current = (socketify_header*)malloc(sizeof(socketify_header));
current->name = header.first.data();
current->name_size = header.first.length();
auto name = header.first;
auto value = header.second;
current->name = name.data();
current->name_size = name.length();
if(name.compare("content-length") == 0 || name.compare("transfer-encoding") == 0){
result.has_content = true;
}
current->value = header.second.data();
current->value_size = header.second.length();
current->next = NULL;
@ -268,6 +276,8 @@ void socketify_asgi_http_handler(uws_res_t *response, uws_req_t *request, void *
socketify_destroy_headers(data.header_list);
}
void socketify_res_cork_write(int ssl, uws_res_t *res, const char* data, size_t length){
if (ssl)
{
@ -301,6 +311,69 @@ void socketify_res_cork_end(int ssl, uws_res_t *res, const char* data, size_t le
});
}
}
void socketify_ws_cork_send(int ssl, uws_websocket_t *ws, const char* data, size_t length, uws_opcode_t opcode){
if (ssl)
{
uWS::WebSocket<true, true, void *> *uws = (uWS::WebSocket<true, true, void *> *)ws;
uws->cork([&](){
uws->send(std::string_view(data, length), (uWS::OpCode)(unsigned char) opcode);
});
}
else
{
uWS::WebSocket<false, true, void *> *uws = (uWS::WebSocket<false, true, void *> *)ws;
uws->cork([&](){
uws->send(std::string_view(data, length), (uWS::OpCode)(unsigned char) opcode);
});
}
}
socksocketify_asgi_ws_app_info* socketify_add_asgi_ws_handler(int ssl, uws_app_t* app, uws_socket_behavior_t behavior, socketify_asgi_ws_method_handler handler, void* user_data){
socksocketify_asgi_ws_app_info* info = (socksocketify_asgi_ws_app_info*)malloc(sizeof(socksocketify_asgi_ws_app_info));
info->ssl = ssl;
info->app = app;
info->handler = handler;
info->user_data = user_data;
info->behavior = behavior;
const char* pattern = "/*";
uws_socket_behavior_t ws_behavior;
memcpy(&ws_behavior, &behavior, sizeof(behavior));
ws_behavior.upgrade = [](uws_res_t *response, uws_req_t *request, uws_socket_context_t *context, void* user_data){
socksocketify_asgi_ws_app_info* info = ((socksocketify_asgi_ws_app_info*)user_data);
socketify_asgi_ws_data data = socketify_asgi_ws_request(info->ssl, request, response);
bool* aborted = (bool*)malloc(sizeof(aborted));
*aborted = false;
uws_res_on_aborted(info->ssl, response, [](uws_res_t *res, void *opcional_data){
bool* aborted = (bool*)opcional_data;
*aborted = true;
}, aborted);
info->handler(info->ssl, response, data, context, info->user_data, aborted);
socketify_destroy_headers(data.header_list);
};
ws_behavior.open = [](uws_websocket_t *ws, void* user_data){
socksocketify_asgi_ws_app_info* info = ((socksocketify_asgi_ws_app_info*)user_data);
auto socket_data = uws_ws_get_user_data(info->ssl, ws);
info->behavior.open(ws, socket_data);
};
ws_behavior.message = [](uws_websocket_t* ws, const char* message, size_t length, uws_opcode_t opcode, void* user_data){
socksocketify_asgi_ws_app_info* info = ((socksocketify_asgi_ws_app_info*)user_data);
auto socket_data = uws_ws_get_user_data(info->ssl, ws);
info->behavior.message(ws, message, length, opcode, socket_data);
};
ws_behavior.close = [](uws_websocket_t* ws, int code, const char* message, size_t length, void* user_data){
socksocketify_asgi_ws_app_info* info = ((socksocketify_asgi_ws_app_info*)user_data);
auto socket_data = uws_ws_get_user_data(info->ssl, ws);
info->behavior.close(ws,code, message, length, socket_data);
};
uws_ws(ssl, app, pattern, ws_behavior, info);
return info;
}
socksocketify_asgi_app_info* socketify_add_asgi_http_handler(int ssl, uws_app_t* app, socketify_asgi_method_handler handler, void* user_data){
socksocketify_asgi_app_info* info = (socksocketify_asgi_app_info*)malloc(sizeof(socksocketify_asgi_app_info));
@ -317,6 +390,9 @@ socksocketify_asgi_app_info* socketify_add_asgi_http_handler(int ssl, uws_app_t*
void socketify_destroy_asgi_app_info(socksocketify_asgi_app_info* app){
free(app);
}
void socketify_destroy_asgi_ws_app_info(socksocketify_asgi_ws_app_info* app){
free(app);
}
void socketify_generic_prepare_callback(uv_prepare_t *prepare){
socketify_loop* loop = (socketify_loop*)uv_handle_get_data((uv_handle_t*)prepare);
@ -373,8 +449,6 @@ bool socketify_on_prepare(socketify_loop* loop, socketify_prepare_handler handle
uv_prepare_start(prepare, socketify_generic_prepare_callback);
return true;
// uv_unref((uv_handle_t *) loop->uv_pre);
// loop->uv_pre->data = loop;
}
bool socketify_prepare_unbind(socketify_loop* loop){

Wyświetl plik

@ -58,6 +58,8 @@ DLL_EXPORT typedef struct {
size_t remote_address_size;
socketify_header* header_list;
bool has_content;
} socketify_asgi_data;
DLL_EXPORT typedef struct {
@ -85,6 +87,7 @@ DLL_EXPORT typedef struct {
} socketify_asgi_ws_data;
DLL_EXPORT typedef void (*socketify_asgi_method_handler)(int ssl, uws_res_t *response, socketify_asgi_data request, void *user_data, bool* aborted);
DLL_EXPORT typedef void (*socketify_asgi_ws_method_handler)(int ssl, uws_res_t *response, socketify_asgi_ws_data request, uws_socket_context_t* socket, void *user_data, bool* aborted);
DLL_EXPORT typedef struct {
int ssl;
uws_app_t* app;
@ -92,6 +95,14 @@ DLL_EXPORT typedef struct {
void * user_data;
} socksocketify_asgi_app_info;
DLL_EXPORT typedef struct {
int ssl;
uws_app_t* app;
socketify_asgi_ws_method_handler handler;
uws_socket_behavior_t behavior;
void * user_data;
} socksocketify_asgi_ws_app_info;
DLL_EXPORT socketify_loop * socketify_create_loop();
DLL_EXPORT bool socketify_constructor_failed(socketify_loop* loop);
@ -122,6 +133,10 @@ DLL_EXPORT void socketify_destroy_asgi_app_info(socksocketify_asgi_app_info* app
DLL_EXPORT void socketify_res_cork_write(int ssl, uws_res_t *response, const char* data, size_t length);
DLL_EXPORT void socketify_res_cork_end(int ssl, uws_res_t *response, const char* data, size_t length, bool close_connection);
DLL_EXPORT socksocketify_asgi_ws_app_info* socketify_add_asgi_ws_handler(int ssl, uws_app_t* app, uws_socket_behavior_t behavior, socketify_asgi_ws_method_handler handler, void* user_data);
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);
#endif
#ifdef __cplusplus
}