kopia lustrzana https://github.com/cirospaciari/socketify.py
one lib is enough
rodzic
45a29a276b
commit
5a778bd245
|
@ -10,14 +10,13 @@ shared:
|
||||||
|
|
||||||
$(MAKE) clean
|
$(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 && $(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 && $(CXX) -std=c++17 -flto -fPIC -O3 -c src/crypto/*.cpp
|
||||||
cd ../uWebSockets/uSockets && $(AR) rvs uSockets.a *.o
|
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
|
# build CAPI + libsocketify
|
||||||
$(CXX) -shared -o $(UWS_LIBRARY_NAME).so $(UWS_LIBRARY_NAME).o ../uWebSockets/uSockets/uSockets.a -fPIC -lz -luv -lssl -lcrypto
|
$(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
|
||||||
$(CC) -c -O3 -luv -flto -fPIC -I ./src ./src/$(LIBRARY_NAME).c
|
|
||||||
$(CC) -shared -o $(LIBRARY_NAME).so $(LIBRARY_NAME).o -luv
|
|
||||||
|
|
||||||
rm -f *.o
|
rm -f *.o
|
|
@ -1,10 +1,12 @@
|
||||||
#include "uv.h"
|
#include "uv.h"
|
||||||
#include "libsocketify.h"
|
#include "libsocketify.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include "libuwebsockets.h"
|
||||||
|
#include "libuwebsockets.cpp" //include symbols
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
void socketify_generic_prepare_callback(uv_prepare_t *prepare){
|
void socketify_generic_prepare_callback(uv_prepare_t *prepare){
|
||||||
socketify_loop* loop = (socketify_loop*)uv_handle_get_data((uv_handle_t*)prepare);
|
socketify_loop* loop = (socketify_loop*)uv_handle_get_data((uv_handle_t*)prepare);
|
||||||
loop->on_prepare_handler(loop->on_prepare_data);
|
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 * 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->uv_loop = NULL;
|
||||||
loop->on_prepare_handler = NULL;
|
loop->on_prepare_handler = NULL;
|
||||||
loop->uv_prepare_ptr = 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)){
|
if(uv_loop_init(uv_loop)){
|
||||||
free(uv_loop);
|
free(uv_loop);
|
||||||
return 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){
|
bool socketify_on_prepare(socketify_loop* loop, socketify_prepare_handler handler, void* user_data){
|
||||||
if (loop->uv_prepare_ptr != NULL) return false;
|
if (loop->uv_prepare_ptr != NULL) return false;
|
||||||
if(handler == NULL) return false;
|
if(handler == NULL) return false;
|
||||||
uv_prepare_t* prepare = malloc(sizeof(uv_prepare_t));
|
uv_prepare_t* prepare = (uv_prepare_t*)malloc(sizeof(uv_prepare_t));
|
||||||
if(uv_prepare_init(loop->uv_loop, prepare)){
|
if(uv_prepare_init((uv_loop_t*)loop->uv_loop, prepare)){
|
||||||
free(prepare);
|
free(prepare);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -66,7 +68,7 @@ bool socketify_on_prepare(socketify_loop* loop, socketify_prepare_handler handle
|
||||||
|
|
||||||
bool socketify_prepare_unbind(socketify_loop* loop){
|
bool socketify_prepare_unbind(socketify_loop* loop){
|
||||||
if(loop->uv_prepare_ptr == NULL) return false;
|
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);
|
free(loop->uv_prepare_ptr);
|
||||||
loop->uv_prepare_ptr = NULL;
|
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){
|
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){
|
void socketify_loop_stop(socketify_loop* loop){
|
||||||
if(uv_loop_alive(loop->uv_loop)){
|
if(uv_loop_alive((uv_loop_t*)loop->uv_loop)){
|
||||||
uv_stop(loop->uv_loop);
|
uv_stop((uv_loop_t*)loop->uv_loop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void socketify_destroy_loop(socketify_loop* loop){
|
void socketify_destroy_loop(socketify_loop* loop){
|
||||||
socketify_loop_stop(loop);
|
socketify_loop_stop(loop);
|
||||||
|
|
||||||
uv_loop_close(loop->uv_loop);
|
uv_loop_close((uv_loop_t*)loop->uv_loop);
|
||||||
free(loop->uv_loop);
|
free(loop->uv_loop);
|
||||||
if(loop->uv_prepare_ptr){
|
if(loop->uv_prepare_ptr){
|
||||||
free(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){
|
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_t* uv_timer = (uv_timer_t* ) malloc(sizeof(uv_timer_t));
|
||||||
// uv_timer_init(loop->uv_loop, uv_timer);
|
|
||||||
if(uv_timer_init(loop->uv_loop, uv_timer)){
|
if(uv_timer_init((uv_loop_t*)loop->uv_loop, uv_timer)){
|
||||||
free(uv_timer);
|
free(uv_timer);
|
||||||
return NULL;
|
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->uv_timer_ptr = uv_timer;
|
||||||
timer->user_data = user_data;
|
timer->user_data = user_data;
|
||||||
timer->handler = handler;
|
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){
|
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
|
//stops and destroy timer info
|
||||||
void socketify_timer_destroy(socketify_timer* timer){
|
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->uv_timer_ptr);
|
||||||
free(timer);
|
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){
|
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));
|
uv_check_t* uv_timer = (uv_check_t*)malloc(sizeof(uv_check_t));
|
||||||
if(uv_check_init(loop->uv_loop, uv_timer)){
|
if(uv_check_init((uv_loop_t*)loop->uv_loop, uv_timer)){
|
||||||
free(uv_timer);
|
free(uv_timer);
|
||||||
return NULL;
|
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->uv_timer_ptr = uv_timer;
|
||||||
timer->user_data = user_data;
|
timer->user_data = user_data;
|
||||||
timer->handler = handler;
|
timer->handler = handler;
|
||||||
|
@ -149,7 +151,8 @@ socketify_timer* socketify_create_check(socketify_loop* loop, socketify_timer_ha
|
||||||
|
|
||||||
//stops and destroy timer info
|
//stops and destroy timer info
|
||||||
void socketify_check_destroy(socketify_timer* timer){
|
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->uv_timer_ptr);
|
||||||
free(timer);
|
free(timer);
|
||||||
}
|
}
|
||||||
|
}
|
|
@ -4,6 +4,11 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
#include "libuwebsockets.h"
|
||||||
typedef void (*socketify_prepare_handler)(void* user_data);
|
typedef void (*socketify_prepare_handler)(void* user_data);
|
||||||
typedef void (*socketify_timer_handler)(void* user_data);
|
typedef void (*socketify_timer_handler)(void* user_data);
|
||||||
|
|
||||||
|
@ -45,3 +50,6 @@ 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);
|
socketify_timer* socketify_create_check(socketify_loop* loop, socketify_timer_handler handler, void* user_data);
|
||||||
void socketify_check_destroy(socketify_timer* timer);
|
void socketify_check_destroy(socketify_timer* timer);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -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);
|
socketify_timer* socketify_create_check(socketify_loop* loop, socketify_timer_handler handler, void* user_data);
|
||||||
void socketify_check_destroy(socketify_timer* timer);
|
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)
|
lib = ffi.dlopen(library_path)
|
||||||
|
|
||||||
|
|
|
@ -217,6 +217,8 @@ bool uws_req_get_yield(uws_req_t *res);
|
||||||
void uws_req_set_field(uws_req_t *res, bool yield);
|
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_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_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_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_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);
|
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)
|
lib = ffi.dlopen(library_path)
|
||||||
@ffi.callback("void(const char *, size_t, const char *, size_t, void *)")
|
@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")
|
return ffi.unpack(buffer_address, length).decode("utf-8")
|
||||||
except Exception: #invalid utf-8
|
except Exception: #invalid utf-8
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def get_method(self):
|
def get_method(self):
|
||||||
buffer = ffi.new("char**")
|
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]
|
buffer_address = ffi.addressof(buffer, 0)[0]
|
||||||
if buffer_address == ffi.NULL:
|
if buffer_address == ffi.NULL:
|
||||||
return None
|
return None
|
||||||
|
@ -383,6 +388,7 @@ class AppRequest:
|
||||||
return ffi.unpack(buffer_address, length).decode("utf-8")
|
return ffi.unpack(buffer_address, length).decode("utf-8")
|
||||||
except Exception: #invalid utf-8
|
except Exception: #invalid utf-8
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def for_each_header(self, handler):
|
def for_each_header(self, handler):
|
||||||
self._for_each_header_handler = handler
|
self._for_each_header_handler = handler
|
||||||
lib.uws_req_for_each_header(self.req, uws_req_for_each_header_handler, self._ptr)
|
lib.uws_req_for_each_header(self.req, uws_req_for_each_header_handler, self._ptr)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit d38dbd88348d42292f5c2c4ab7daf9b5aa1bb657
|
Subproject commit b5f0a8a07a89ea13b08785d7a65c33036bc53cda
|
10
src/tests.py
10
src/tests.py
|
@ -68,7 +68,9 @@
|
||||||
# void uws_filter(int ssl, uws_app_t *app, uws_filter_handler handler, void *user_data);
|
# 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
|
# 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 os
|
||||||
import multiprocessing
|
import multiprocessing
|
||||||
import asyncio
|
import asyncio
|
||||||
|
@ -80,11 +82,8 @@ mimetypes.init()
|
||||||
async def home(res, req):
|
async def home(res, req):
|
||||||
print("full", req.get_full_url())
|
print("full", req.get_full_url())
|
||||||
print("normal", req.get_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")
|
res.end("Test")
|
||||||
|
|
||||||
def run_app():
|
def run_app():
|
||||||
|
@ -99,6 +98,7 @@ def create_fork():
|
||||||
if not n > 0:
|
if not n > 0:
|
||||||
run_app()
|
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
|
# # fork limiting the cpu count - 1
|
||||||
# for i in range(1, multiprocessing.cpu_count()):
|
# for i in range(1, multiprocessing.cpu_count()):
|
||||||
# create_fork()
|
# create_fork()
|
||||||
|
|
Ładowanie…
Reference in New Issue