From 5a778bd245f5c9153219334e87c2ffd87766b682 Mon Sep 17 00:00:00 2001 From: Ciro Date: Tue, 1 Nov 2022 09:30:46 -0300 Subject: [PATCH] one lib is enough --- src/socketify/native/Makefile | 9 ++-- .../src/{libsocketify.c => libsocketify.cpp} | 45 ++++++++++--------- src/socketify/native/src/libsocketify.h | 8 ++++ src/socketify/native/uv.py | 2 +- src/socketify/socketify.py | 10 ++++- src/socketify/uWebSockets | 2 +- src/tests.py | 10 ++--- 7 files changed, 51 insertions(+), 35 deletions(-) rename src/socketify/native/src/{libsocketify.c => libsocketify.cpp} (73%) diff --git a/src/socketify/native/Makefile b/src/socketify/native/Makefile index 8db0dff..055e4b6 100644 --- a/src/socketify/native/Makefile +++ b/src/socketify/native/Makefile @@ -10,14 +10,13 @@ shared: $(MAKE) clean + # build uWebSockets cd ../uWebSockets/uSockets && $(CC) -pthread -DLIBUS_USE_OPENSSL -DLIBUS_USE_LIBUV -std=c11 -Isrc -flto -fPIC -O3 -c src/*.c src/eventing/*.c src/crypto/*.c cd ../uWebSockets/uSockets && $(CXX) -std=c++17 -flto -fPIC -O3 -c src/crypto/*.cpp cd ../uWebSockets/uSockets && $(AR) rvs uSockets.a *.o - $(CXX) -c -O3 -std=c++17 -lz -luv -flto -fPIC -I ../uWebSockets/src -I ../uWebSockets/uSockets/src ../uWebSockets/capi/$(UWS_LIBRARY_NAME).cpp - $(CXX) -shared -o $(UWS_LIBRARY_NAME).so $(UWS_LIBRARY_NAME).o ../uWebSockets/uSockets/uSockets.a -fPIC -lz -luv -lssl -lcrypto - - $(CC) -c -O3 -luv -flto -fPIC -I ./src ./src/$(LIBRARY_NAME).c - $(CC) -shared -o $(LIBRARY_NAME).so $(LIBRARY_NAME).o -luv + # build CAPI + libsocketify + $(CXX) -c -O1 -std=c++17 -lz -luv -flto -fPIC -I ./src -I ../uWebSockets/src -I ../uWebSockets/uSockets/src -I ../uWebSockets/capi ./src/$(LIBRARY_NAME).cpp + $(CXX) -shared -o ../$(LIBRARY_NAME).so $(LIBRARY_NAME).o ../uWebSockets/uSockets/uSockets.a -fPIC -lz -luv -lssl -lcrypto rm -f *.o \ No newline at end of file diff --git a/src/socketify/native/src/libsocketify.c b/src/socketify/native/src/libsocketify.cpp similarity index 73% rename from src/socketify/native/src/libsocketify.c rename to src/socketify/native/src/libsocketify.cpp index 1238612..7784de2 100644 --- a/src/socketify/native/src/libsocketify.c +++ b/src/socketify/native/src/libsocketify.cpp @@ -1,10 +1,12 @@ #include "uv.h" #include "libsocketify.h" - #include #include +#include "libuwebsockets.h" +#include "libuwebsockets.cpp" //include symbols - +extern "C" +{ void socketify_generic_prepare_callback(uv_prepare_t *prepare){ socketify_loop* loop = (socketify_loop*)uv_handle_get_data((uv_handle_t*)prepare); loop->on_prepare_handler(loop->on_prepare_data); @@ -26,12 +28,12 @@ void* socketify_get_native_loop(socketify_loop* loop){ } socketify_loop * socketify_create_loop(){ - socketify_loop* loop = malloc(sizeof(uv_prepare_t)); + socketify_loop* loop = (socketify_loop*)malloc(sizeof(uv_prepare_t)); loop->uv_loop = NULL; loop->on_prepare_handler = NULL; loop->uv_prepare_ptr = NULL; - uv_loop_t* uv_loop = malloc(sizeof(uv_loop_t)); + uv_loop_t* uv_loop = (uv_loop_t*)malloc(sizeof(uv_loop_t)); if(uv_loop_init(uv_loop)){ free(uv_loop); return loop; @@ -47,8 +49,8 @@ bool socketify_constructor_failed(socketify_loop* loop){ bool socketify_on_prepare(socketify_loop* loop, socketify_prepare_handler handler, void* user_data){ if (loop->uv_prepare_ptr != NULL) return false; if(handler == NULL) return false; - uv_prepare_t* prepare = malloc(sizeof(uv_prepare_t)); - if(uv_prepare_init(loop->uv_loop, prepare)){ + uv_prepare_t* prepare = (uv_prepare_t*)malloc(sizeof(uv_prepare_t)); + if(uv_prepare_init((uv_loop_t*)loop->uv_loop, prepare)){ free(prepare); return false; } @@ -66,7 +68,7 @@ bool socketify_on_prepare(socketify_loop* loop, socketify_prepare_handler handle bool socketify_prepare_unbind(socketify_loop* loop){ if(loop->uv_prepare_ptr == NULL) return false; - uv_prepare_stop(loop->uv_prepare_ptr); + uv_prepare_stop((uv_prepare_t *)loop->uv_prepare_ptr); free(loop->uv_prepare_ptr); loop->uv_prepare_ptr = NULL; @@ -74,19 +76,19 @@ bool socketify_prepare_unbind(socketify_loop* loop){ } int socketify_loop_run(socketify_loop* loop, socketify_run_mode mode){ - return uv_run(loop->uv_loop, (uv_run_mode)mode); + return uv_run((uv_loop_t*)loop->uv_loop, (uv_run_mode)mode); } void socketify_loop_stop(socketify_loop* loop){ - if(uv_loop_alive(loop->uv_loop)){ - uv_stop(loop->uv_loop); + if(uv_loop_alive((uv_loop_t*)loop->uv_loop)){ + uv_stop((uv_loop_t*)loop->uv_loop); } } void socketify_destroy_loop(socketify_loop* loop){ socketify_loop_stop(loop); - uv_loop_close(loop->uv_loop); + uv_loop_close((uv_loop_t*)loop->uv_loop); free(loop->uv_loop); if(loop->uv_prepare_ptr){ free(loop->uv_prepare_ptr); @@ -96,14 +98,14 @@ void socketify_destroy_loop(socketify_loop* loop){ socketify_timer* socketify_create_timer(socketify_loop* loop, uint64_t timeout, uint64_t repeat, socketify_timer_handler handler, void* user_data){ - uv_timer_t* uv_timer = malloc(sizeof(uv_timer_t)); - // uv_timer_init(loop->uv_loop, uv_timer); - if(uv_timer_init(loop->uv_loop, uv_timer)){ + uv_timer_t* uv_timer = (uv_timer_t* ) malloc(sizeof(uv_timer_t)); + + if(uv_timer_init((uv_loop_t*)loop->uv_loop, uv_timer)){ free(uv_timer); return NULL; } - socketify_timer* timer = malloc(sizeof(socketify_timer)); + socketify_timer* timer = (socketify_timer*)malloc(sizeof(socketify_timer)); timer->uv_timer_ptr = uv_timer; timer->user_data = user_data; timer->handler = handler; @@ -115,13 +117,13 @@ socketify_timer* socketify_create_timer(socketify_loop* loop, uint64_t timeout, } void socketify_timer_set_repeat(socketify_timer* timer, uint64_t repeat){ - uv_timer_set_repeat( timer->uv_timer_ptr, repeat); + uv_timer_set_repeat((uv_timer_t *) timer->uv_timer_ptr, repeat); } //stops and destroy timer info void socketify_timer_destroy(socketify_timer* timer){ - uv_timer_stop(timer->uv_timer_ptr); + uv_timer_stop((uv_timer_t *)timer->uv_timer_ptr); free(timer->uv_timer_ptr); free(timer); } @@ -130,13 +132,13 @@ void socketify_timer_destroy(socketify_timer* timer){ socketify_timer* socketify_create_check(socketify_loop* loop, socketify_timer_handler handler, void* user_data){ - uv_check_t* uv_timer = malloc(sizeof(uv_check_t)); - if(uv_check_init(loop->uv_loop, uv_timer)){ + uv_check_t* uv_timer = (uv_check_t*)malloc(sizeof(uv_check_t)); + if(uv_check_init((uv_loop_t*)loop->uv_loop, uv_timer)){ free(uv_timer); return NULL; } - socketify_timer* timer = malloc(sizeof(socketify_timer)); + socketify_timer* timer = (socketify_timer*)malloc(sizeof(socketify_timer)); timer->uv_timer_ptr = uv_timer; timer->user_data = user_data; timer->handler = handler; @@ -149,7 +151,8 @@ socketify_timer* socketify_create_check(socketify_loop* loop, socketify_timer_ha //stops and destroy timer info void socketify_check_destroy(socketify_timer* timer){ - uv_check_stop(timer->uv_timer_ptr); + uv_check_stop((uv_check_t *)timer->uv_timer_ptr); free(timer->uv_timer_ptr); free(timer); +} } \ No newline at end of file diff --git a/src/socketify/native/src/libsocketify.h b/src/socketify/native/src/libsocketify.h index 38ccd15..28b9880 100644 --- a/src/socketify/native/src/libsocketify.h +++ b/src/socketify/native/src/libsocketify.h @@ -4,6 +4,11 @@ #include +#ifdef __cplusplus +extern "C" +{ +#endif +#include "libuwebsockets.h" typedef void (*socketify_prepare_handler)(void* user_data); typedef void (*socketify_timer_handler)(void* user_data); @@ -44,4 +49,7 @@ void socketify_timer_set_repeat(socketify_timer* timer, uint64_t repeat); socketify_timer* socketify_create_check(socketify_loop* loop, socketify_timer_handler handler, void* user_data); void socketify_check_destroy(socketify_timer* timer); +#endif +#ifdef __cplusplus +} #endif \ No newline at end of file diff --git a/src/socketify/native/uv.py b/src/socketify/native/uv.py index 7b8f29c..08b4f70 100644 --- a/src/socketify/native/uv.py +++ b/src/socketify/native/uv.py @@ -54,7 +54,7 @@ void socketify_timer_set_repeat(socketify_timer* timer, uint64_t repeat); socketify_timer* socketify_create_check(socketify_loop* loop, socketify_timer_handler handler, void* user_data); void socketify_check_destroy(socketify_timer* timer); """) -library_path = os.path.join(os.path.dirname(__file__), "libsocketify.so") +library_path = os.path.realpath(os.path.join(os.path.dirname(__file__), "..", "libsocketify.so")) lib = ffi.dlopen(library_path) diff --git a/src/socketify/socketify.py b/src/socketify/socketify.py index 6a783d5..01e6e41 100644 --- a/src/socketify/socketify.py +++ b/src/socketify/socketify.py @@ -217,6 +217,8 @@ bool uws_req_get_yield(uws_req_t *res); void uws_req_set_field(uws_req_t *res, bool yield); size_t uws_req_get_url(uws_req_t *res, const char **dest); size_t uws_req_get_method(uws_req_t *res, const char **dest); +size_t uws_req_get_case_sensitive_method(uws_req_t *res, const char **dest); + size_t uws_req_get_header(uws_req_t *res, const char *lower_case_header, size_t lower_case_header_length, const char **dest); size_t uws_req_get_query(uws_req_t *res, const char *key, size_t key_length, const char **dest); size_t uws_req_get_parameter(uws_req_t *res, unsigned short index, const char **dest); @@ -225,7 +227,7 @@ void uws_req_for_each_header(uws_req_t *res, uws_get_headers_server_handler hand """) -library_path = os.path.join(os.path.dirname(__file__), "native", "libuwebsockets.so") +library_path = os.path.join(os.path.dirname(__file__), "libsocketify.so") lib = ffi.dlopen(library_path) @ffi.callback("void(const char *, size_t, const char *, size_t, void *)") @@ -372,9 +374,12 @@ class AppRequest: return ffi.unpack(buffer_address, length).decode("utf-8") except Exception: #invalid utf-8 return None + + def get_method(self): buffer = ffi.new("char**") - length = lib.uws_req_get_method(self.req, buffer) + #will use uws_req_get_case_sensitive_method until version v21 and switch back to uws_req_get_method for 0 impacts on behavior + length = lib.uws_req_get_case_sensitive_method(self.req, buffer) buffer_address = ffi.addressof(buffer, 0)[0] if buffer_address == ffi.NULL: return None @@ -383,6 +388,7 @@ class AppRequest: return ffi.unpack(buffer_address, length).decode("utf-8") except Exception: #invalid utf-8 return None + def for_each_header(self, handler): self._for_each_header_handler = handler lib.uws_req_for_each_header(self.req, uws_req_for_each_header_handler, self._ptr) diff --git a/src/socketify/uWebSockets b/src/socketify/uWebSockets index d38dbd8..b5f0a8a 160000 --- a/src/socketify/uWebSockets +++ b/src/socketify/uWebSockets @@ -1 +1 @@ -Subproject commit d38dbd88348d42292f5c2c4ab7daf9b5aa1bb657 +Subproject commit b5f0a8a07a89ea13b08785d7a65c33036bc53cda diff --git a/src/tests.py b/src/tests.py index 9a5a5e4..99c2697 100644 --- a/src/tests.py +++ b/src/tests.py @@ -68,7 +68,9 @@ # void uws_filter(int ssl, uws_app_t *app, uws_filter_handler handler, void *user_data); # https://github.com/uNetworking/uWebSockets.js/blob/master/examples/VideoStreamer.js -from socketify import App +# from socketify import App +from socketify import App, AppOptions + # import os import multiprocessing import asyncio @@ -80,11 +82,8 @@ mimetypes.init() async def home(res, req): print("full", req.get_full_url()) print("normal", req.get_url()) + print("method", req.get_method()) - req.for_each_header(lambda key,value: print("Header %s: %s" % (key, value))) - - - print("All headers", req.get_headers()) res.end("Test") def run_app(): @@ -99,6 +98,7 @@ def create_fork(): if not n > 0: run_app() +#openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -passout pass:1234 -keyout ./misc/key.pem -out ./misc/cert.pem # # fork limiting the cpu count - 1 # for i in range(1, multiprocessing.cpu_count()): # create_fork()