diff --git a/capi/Makefile b/capi/Makefile index fc935ad..583eceb 100644 --- a/capi/Makefile +++ b/capi/Makefile @@ -8,20 +8,20 @@ default: capi: $(MAKE) clean - cd ../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 ../uSockets && $(CC) -pthread -DUWS_WITH_PROXY -DLIBUS_USE_OPENSSL -DLIBUS_USE_LIBUV -std=c11 -Isrc -flto -fPIC -O3 -c src/*.c src/eventing/*.c src/crypto/*.c cd ../uSockets && $(CXX) -std=c++17 -flto -fPIC -O3 -c src/crypto/*.cpp cd ../uSockets && $(AR) rvs uSockets.a *.o - $(CXX) -c -O3 -std=c++17 -lz -luv -flto -fPIC -I ../src -I ../uSockets/src $(LIBRARY_NAME).cpp + $(CXX) -DUWS_WITH_PROXY -c -O3 -std=c++17 -lz -luv -flto -fPIC -I ../src -I ../uSockets/src $(LIBRARY_NAME).cpp $(AR) rvs $(LIBRARY_NAME).a $(LIBRARY_NAME).o ../uSockets/uSockets.a shared: $(MAKE) clean - cd ../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 ../uSockets && $(CC) -pthread -DUWS_WITH_PROXY -DLIBUS_USE_OPENSSL -DLIBUS_USE_LIBUV -std=c11 -Isrc -flto -fPIC -O3 -c src/*.c src/eventing/*.c src/crypto/*.c cd ../uSockets && $(CXX) -std=c++17 -flto -fPIC -O3 -c src/crypto/*.cpp cd ../uSockets && $(AR) rvs uSockets.a *.o - $(CXX) -c -O3 -std=c++17 -lz -luv -flto -fPIC -I ../src -I ../uSockets/src $(LIBRARY_NAME).cpp + $(CXX) -DUWS_WITH_PROXY -c -O3 -std=c++17 -lz -luv -flto -fPIC -I ../src -I ../uSockets/src $(LIBRARY_NAME).cpp $(CXX) -shared -o $(LIBRARY_NAME).so $(LIBRARY_NAME).o ../uSockets/uSockets.a -fPIC -lz -luv -lssl -lcrypto misc: mkdir -p ../misc && openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -passout pass:1234 -keyout ../misc/key.pem -out ../misc/cert.pem diff --git a/capi/libuwebsockets.cpp b/capi/libuwebsockets.cpp index 265f531..f5cb2f8 100644 --- a/capi/libuwebsockets.cpp +++ b/capi/libuwebsockets.cpp @@ -38,6 +38,8 @@ extern "C" sco.key_file_name = options.key_file_name; sco.passphrase = options.passphrase; sco.ssl_prefer_low_memory_usage = options.ssl_prefer_low_memory_usage; + sco.ssl_ciphers = options.ssl_ciphers; + return (uws_app_t *)new uWS::SSLApp(sco); } @@ -350,59 +352,59 @@ extern "C" } /* callback, path to unix domain socket */ - void uws_app_listen_domain(int ssl, uws_app_t *app, const char *domain, uws_listen_domain_handler handler, void *user_data) + void uws_app_listen_domain(int ssl, uws_app_t *app, const char *domain, size_t domain_length, uws_listen_domain_handler handler, void *user_data) { if (ssl) { uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; - uwsApp->listen([handler, domain, user_data](struct us_listen_socket_t *listen_socket) - { handler((struct us_listen_socket_t *)listen_socket, domain, 0, user_data); }, - domain); + uwsApp->listen([handler, domain, domain_length, user_data](struct us_listen_socket_t *listen_socket) + { handler((struct us_listen_socket_t *)listen_socket, domain, domain_length, 0, user_data); }, + std::string(domain, domain_length)); } else { uWS::App *uwsApp = (uWS::App *)app; - uwsApp->listen([handler, domain, user_data](struct us_listen_socket_t *listen_socket) - { handler((struct us_listen_socket_t *)listen_socket, domain, 0, user_data); }, - domain); + uwsApp->listen([handler, domain, domain_length, user_data](struct us_listen_socket_t *listen_socket) + { handler((struct us_listen_socket_t *)listen_socket, domain, domain_length, 0, user_data); }, + std::string(domain, domain_length)); } } /* callback, path to unix domain socket */ - void uws_app_listen_domain_with_options(int ssl, uws_app_t *app, const char *domain, int options, uws_listen_domain_handler handler, void *user_data) + void uws_app_listen_domain_with_options(int ssl, uws_app_t *app, const char *domain, size_t domain_length, int options, uws_listen_domain_handler handler, void *user_data) { if (ssl) { uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; uwsApp->listen( - options, [handler, domain, options, user_data](struct us_listen_socket_t *listen_socket) - { handler((struct us_listen_socket_t *)listen_socket, domain, options, user_data); }, - domain); + options, [handler, domain, domain_length, options, user_data](struct us_listen_socket_t *listen_socket) + { handler((struct us_listen_socket_t *)listen_socket, domain, domain_length, options, user_data); }, + std::string(domain, domain_length)); } else { uWS::App *uwsApp = (uWS::App *)app; uwsApp->listen( - options, [handler, domain, options, user_data](struct us_listen_socket_t *listen_socket) - { handler((struct us_listen_socket_t *)listen_socket, domain, options, user_data); }, - domain); + options, [handler, domain, domain_length, options, user_data](struct us_listen_socket_t *listen_socket) + { handler((struct us_listen_socket_t *)listen_socket, domain, domain_length, options, user_data); }, + std::string(domain, domain_length)); } } - void uws_app_domain(int ssl, uws_app_t *app, const char *server_name) + void uws_app_domain(int ssl, uws_app_t *app, const char *server_name, size_t server_name_length) { if (ssl) { uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; - uwsApp->domain(server_name); + uwsApp->domain(std::string(server_name, server_name_length)); } else { uWS::App *uwsApp = (uWS::App *)app; - uwsApp->domain(server_name); + uwsApp->domain(std::string(server_name, server_name_length)); } } void uws_app_destroy(int ssl, uws_app_t *app) @@ -465,33 +467,33 @@ extern "C" uWS::App *uwsApp = (uWS::App *)app; return uwsApp->getNativeHandle(); } - void uws_remove_server_name(int ssl, uws_app_t *app, const char *hostname_pattern) + void uws_remove_server_name(int ssl, uws_app_t *app, const char *hostname_pattern, size_t hostname_pattern_length) { if (ssl) { uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; - uwsApp->removeServerName(hostname_pattern); + uwsApp->removeServerName(std::string(hostname_pattern, hostname_pattern_length)); } else { uWS::App *uwsApp = (uWS::App *)app; - uwsApp->removeServerName(hostname_pattern); + uwsApp->removeServerName(std::string(hostname_pattern, hostname_pattern_length)); } } - void uws_add_server_name(int ssl, uws_app_t *app, const char *hostname_pattern) + void uws_add_server_name(int ssl, uws_app_t *app, const char *hostname_pattern, size_t hostname_pattern_length) { if (ssl) { uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; - uwsApp->addServerName(hostname_pattern); + uwsApp->addServerName(std::string(hostname_pattern, hostname_pattern_length)); } else { uWS::App *uwsApp = (uWS::App *)app; - uwsApp->addServerName(hostname_pattern); + uwsApp->addServerName(std::string(hostname_pattern, hostname_pattern_length)); } } - void uws_add_server_name_with_options(int ssl, uws_app_t *app, const char *hostname_pattern, struct us_socket_context_options_t options) + void uws_add_server_name_with_options(int ssl, uws_app_t *app, const char *hostname_pattern, size_t hostname_pattern_length, struct us_socket_context_options_t options) { uWS::SocketContextOptions sco; sco.ca_file_name = options.ca_file_name; @@ -504,12 +506,12 @@ extern "C" if (ssl) { uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; - uwsApp->addServerName(hostname_pattern, sco); + uwsApp->addServerName(std::string(hostname_pattern, hostname_pattern_length), sco); } else { uWS::App *uwsApp = (uWS::App *)app; - uwsApp->addServerName(hostname_pattern, sco); + uwsApp->addServerName(std::string(hostname_pattern, hostname_pattern_length), sco); } } @@ -519,13 +521,13 @@ extern "C" { uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; uwsApp->missingServerName([handler, user_data](auto hostname) - { handler(hostname, user_data); }); + { handler(hostname, strlen(hostname), user_data); }); } else { uWS::App *uwsApp = (uWS::App *)app; uwsApp->missingServerName([handler, user_data](auto hostname) - { handler(hostname, user_data); }); + { handler(hostname, strlen(hostname), user_data); }); } } void uws_filter(int ssl, uws_app_t *app, uws_filter_handler handler, void *user_data) @@ -545,7 +547,7 @@ extern "C" } } - void uws_ws(int ssl, uws_app_t *app, const char *pattern, uws_socket_behavior_t behavior) + void uws_ws(int ssl, uws_app_t *app, const char *pattern, uws_socket_behavior_t behavior, void* user_data) { if (ssl) { @@ -561,39 +563,44 @@ extern "C" }; if (behavior.upgrade) - generic_handler.upgrade = [behavior](auto *res, auto *req, auto *context) + generic_handler.upgrade = [behavior, user_data](auto *res, auto *req, auto *context) { - behavior.upgrade((uws_res_t *)res, (uws_req_t *)req, (uws_socket_context_t *)context); + behavior.upgrade((uws_res_t *)res, (uws_req_t *)req, (uws_socket_context_t *)context, user_data); }; if (behavior.open) - generic_handler.open = [behavior](auto *ws) + generic_handler.open = [behavior, user_data](auto *ws) { - behavior.open((uws_websocket_t *)ws); + behavior.open((uws_websocket_t *)ws, user_data); }; if (behavior.message) - generic_handler.message = [behavior](auto *ws, auto message, auto opcode) + generic_handler.message = [behavior, user_data](auto *ws, auto message, auto opcode) { - behavior.message((uws_websocket_t *)ws, message.data(), message.length(), (uws_opcode_t)opcode); + behavior.message((uws_websocket_t *)ws, message.data(), message.length(), (uws_opcode_t)opcode, user_data); }; if (behavior.drain) - generic_handler.drain = [behavior](auto *ws) + generic_handler.drain = [behavior, user_data](auto *ws) { - behavior.drain((uws_websocket_t *)ws); + behavior.drain((uws_websocket_t *)ws, user_data); }; if (behavior.ping) - generic_handler.ping = [behavior](auto *ws, auto message) + generic_handler.ping = [behavior, user_data](auto *ws, auto message) { - behavior.ping((uws_websocket_t *)ws, message.data(), message.length()); + behavior.ping((uws_websocket_t *)ws, message.data(), message.length(), user_data); }; if (behavior.pong) - generic_handler.pong = [behavior](auto *ws, auto message) + generic_handler.pong = [behavior, user_data](auto *ws, auto message) { - behavior.pong((uws_websocket_t *)ws, message.data(), message.length()); + behavior.pong((uws_websocket_t *)ws, message.data(), message.length(), user_data); }; if (behavior.close) - generic_handler.close = [behavior](auto *ws, int code, auto message) + generic_handler.close = [behavior, user_data](auto *ws, int code, auto message) { - behavior.close((uws_websocket_t *)ws, code, message.data(), message.length()); + behavior.close((uws_websocket_t *)ws, code, message.data(), message.length(), user_data); + }; + if (behavior.subscription) + generic_handler.subscription = [behavior, user_data](auto *ws, auto topic, int subscribers, int old_subscribers){ + behavior.subscription((uws_websocket_t *)ws, topic.data(), topic.length(), subscribers, old_subscribers, user_data); + }; uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; @@ -613,39 +620,44 @@ extern "C" }; if (behavior.upgrade) - generic_handler.upgrade = [behavior](auto *res, auto *req, auto *context) + generic_handler.upgrade = [behavior, user_data](auto *res, auto *req, auto *context) { - behavior.upgrade((uws_res_t *)res, (uws_req_t *)req, (uws_socket_context_t *)context); + behavior.upgrade((uws_res_t *)res, (uws_req_t *)req, (uws_socket_context_t *)context, user_data); }; if (behavior.open) - generic_handler.open = [behavior](auto *ws) + generic_handler.open = [behavior, user_data](auto *ws) { - behavior.open((uws_websocket_t *)ws); + behavior.open((uws_websocket_t *)ws, user_data); }; if (behavior.message) - generic_handler.message = [behavior](auto *ws, auto message, auto opcode) + generic_handler.message = [behavior, user_data](auto *ws, auto message, auto opcode) { - behavior.message((uws_websocket_t *)ws, message.data(), message.length(), (uws_opcode_t)opcode); + behavior.message((uws_websocket_t *)ws, message.data(), message.length(), (uws_opcode_t)opcode, user_data); }; if (behavior.drain) - generic_handler.drain = [behavior](auto *ws) + generic_handler.drain = [behavior, user_data](auto *ws) { - behavior.drain((uws_websocket_t *)ws); + behavior.drain((uws_websocket_t *)ws, user_data); }; if (behavior.ping) - generic_handler.ping = [behavior](auto *ws, auto message) + generic_handler.ping = [behavior, user_data](auto *ws, auto message) { - behavior.ping((uws_websocket_t *)ws, message.data(), message.length()); + behavior.ping((uws_websocket_t *)ws, message.data(), message.length(), user_data); }; if (behavior.pong) - generic_handler.pong = [behavior](auto *ws, auto message) + generic_handler.pong = [behavior, user_data](auto *ws, auto message) { - behavior.pong((uws_websocket_t *)ws, message.data(), message.length()); + behavior.pong((uws_websocket_t *)ws, message.data(), message.length(), user_data); }; if (behavior.close) - generic_handler.close = [behavior](auto *ws, int code, auto message) + generic_handler.close = [behavior, user_data](auto *ws, int code, auto message) { - behavior.close((uws_websocket_t *)ws, code, message.data(), message.length()); + behavior.close((uws_websocket_t *)ws, code, message.data(), message.length(), user_data); + }; + if (behavior.subscription) + generic_handler.subscription = [behavior, user_data](auto *ws, auto topic, int subscribers, int old_subscribers){ + behavior.subscription((uws_websocket_t *)ws, topic.data(), topic.length(), subscribers, old_subscribers, user_data); + }; uWS::App *uwsApp = (uWS::App *)app; uwsApp->ws(pattern, std::move(generic_handler)); @@ -693,10 +705,10 @@ extern "C" if (ssl) { uWS::WebSocket *uws = (uWS::WebSocket *)ws; - return (uws_sendstatus_t)uws->send(std::string_view(message), (uWS::OpCode)(unsigned char)opcode, compress, fin); + return (uws_sendstatus_t)uws->send(std::string_view(message, length), (uWS::OpCode)(unsigned char)opcode, compress, fin); } uWS::WebSocket *uws = (uWS::WebSocket *)ws; - return (uws_sendstatus_t)uws->send(std::string_view(message), (uWS::OpCode)(unsigned char)opcode, compress, fin); + return (uws_sendstatus_t)uws->send(std::string_view(message, length), (uWS::OpCode)(unsigned char)opcode, compress, fin); } uws_sendstatus_t uws_ws_send_fragment(int ssl, uws_websocket_t *ws, const char *message, size_t length, bool compress) @@ -714,10 +726,10 @@ extern "C" if (ssl) { uWS::WebSocket *uws = (uWS::WebSocket *)ws; - return (uws_sendstatus_t)uws->sendFirstFragment(std::string_view(message), uWS::OpCode::BINARY, compress); + return (uws_sendstatus_t)uws->sendFirstFragment(std::string_view(message, length), uWS::OpCode::BINARY, compress); } uWS::WebSocket *uws = (uWS::WebSocket *)ws; - return (uws_sendstatus_t)uws->sendFirstFragment(std::string_view(message), uWS::OpCode::BINARY, compress); + return (uws_sendstatus_t)uws->sendFirstFragment(std::string_view(message, length), uWS::OpCode::BINARY, compress); } uws_sendstatus_t uws_ws_send_first_fragment_with_opcode(int ssl, uws_websocket_t *ws, const char *message, size_t length, uws_opcode_t opcode, bool compress) { @@ -851,6 +863,7 @@ extern "C" return uws->getBufferedAmount(); } + size_t uws_ws_get_remote_address(int ssl, uws_websocket_t *ws, const char **dest) { if (ssl) @@ -898,6 +911,70 @@ extern "C" } } + size_t uws_res_get_remote_address(int ssl, uws_res_t *res, const char **dest) + { + if (ssl) + { + uWS::HttpResponse *uwsRes = (uWS::HttpResponse *)res; + std::string_view value = uwsRes->getRemoteAddress(); + *dest = value.data(); + return value.length(); + } + uWS::HttpResponse *uwsRes = (uWS::HttpResponse *)res; + + std::string_view value = uwsRes->getRemoteAddress(); + *dest = value.data(); + return value.length(); + } + + size_t uws_res_get_remote_address_as_text(int ssl, uws_res_t *res, const char **dest) + { + if (ssl) + { + uWS::HttpResponse *uwsRes = (uWS::HttpResponse *)res; + std::string_view value = uwsRes->getRemoteAddressAsText(); + *dest = value.data(); + return value.length(); + } + uWS::HttpResponse *uwsRes = (uWS::HttpResponse *)res; + + std::string_view value = uwsRes->getRemoteAddressAsText(); + *dest = value.data(); + return value.length(); + } +#ifdef UWS_WITH_PROXY + size_t uws_res_get_proxied_remote_address(int ssl, uws_res_t *res, const char **dest) + { + if (ssl) + { + uWS::HttpResponse *uwsRes = (uWS::HttpResponse *)res; + std::string_view value = uwsRes->getProxiedRemoteAddress(); + *dest = value.data(); + return value.length(); + } + uWS::HttpResponse *uwsRes = (uWS::HttpResponse *)res; + + std::string_view value = uwsRes->getProxiedRemoteAddress(); + *dest = value.data(); + return value.length(); + } + + size_t uws_res_get_proxied_remote_address_as_text(int ssl, uws_res_t *res, const char **dest) + { + if (ssl) + { + uWS::HttpResponse *uwsRes = (uWS::HttpResponse *)res; + std::string_view value = uwsRes->getProxiedRemoteAddressAsText(); + *dest = value.data(); + return value.length(); + } + uWS::HttpResponse *uwsRes = (uWS::HttpResponse *)res; + + std::string_view value = uwsRes->getProxiedRemoteAddressAsText(); + *dest = value.data(); + return value.length(); + } +#endif uws_try_end_result_t uws_res_try_end(int ssl, uws_res_t *res, const char *data, size_t length, uintmax_t total_size, bool close_connection) { if (ssl) @@ -1041,10 +1118,10 @@ extern "C" if (ssl) { uWS::HttpResponse *uwsRes = (uWS::HttpResponse *)res; - return uwsRes->write(std::string_view(data)); + return uwsRes->write(std::string_view(data, length)); } uWS::HttpResponse *uwsRes = (uWS::HttpResponse *)res; - return uwsRes->write(std::string_view(data)); + return uwsRes->write(std::string_view(data, length)); } uintmax_t uws_res_get_write_offset(int ssl, uws_res_t *res) { diff --git a/capi/libuwebsockets.h b/capi/libuwebsockets.h index 75d3e6b..fdc18be 100644 --- a/capi/libuwebsockets.h +++ b/capi/libuwebsockets.h @@ -31,9 +31,14 @@ #ifdef __cplusplus extern "C" { +#endif +#ifdef _WIN32 +# define DLL_EXPORT __declspec( dllexport ) +#else +# define DLL_EXPORT #endif - typedef enum + DLL_EXPORT typedef enum { /* These are not actual compression options */ _COMPRESSOR_MASK = 0x00FF, @@ -66,7 +71,7 @@ extern "C" DEDICATED_COMPRESSOR = 15 << 4 | 8 } uws_compress_options_t; - typedef enum + DLL_EXPORT typedef enum { CONTINUATION = 0, TEXT = 1, @@ -76,14 +81,14 @@ extern "C" PONG = 10 } uws_opcode_t; - typedef enum + DLL_EXPORT typedef enum { BACKPRESSURE, SUCCESS, DROPPED } uws_sendstatus_t; - typedef struct + DLL_EXPORT typedef struct { int port; @@ -91,29 +96,30 @@ extern "C" int options; } uws_app_listen_config_t; - typedef struct { + DLL_EXPORT typedef struct { bool ok; bool has_responded; } uws_try_end_result_t; - struct uws_app_s; - struct uws_req_s; - struct uws_res_s; - struct uws_websocket_s; - struct uws_header_iterator_s; - typedef struct uws_app_s uws_app_t; - typedef struct uws_req_s uws_req_t; - typedef struct uws_res_s uws_res_t; - typedef struct uws_socket_context_s uws_socket_context_t; - typedef struct uws_websocket_s uws_websocket_t; + DLL_EXPORT struct uws_app_s; + DLL_EXPORT struct uws_req_s; + DLL_EXPORT struct uws_res_s; + DLL_EXPORT struct uws_websocket_s; + DLL_EXPORT struct uws_header_iterator_s; + DLL_EXPORT typedef struct uws_app_s uws_app_t; + DLL_EXPORT typedef struct uws_req_s uws_req_t; + DLL_EXPORT typedef struct uws_res_s uws_res_t; + DLL_EXPORT typedef struct uws_socket_context_s uws_socket_context_t; + DLL_EXPORT typedef struct uws_websocket_s uws_websocket_t; - typedef void (*uws_websocket_handler)(uws_websocket_t *ws); - typedef void (*uws_websocket_message_handler)(uws_websocket_t *ws, const char *message, size_t length, uws_opcode_t opcode); - typedef void (*uws_websocket_ping_pong_handler)(uws_websocket_t *ws, const char *message, size_t length); - typedef void (*uws_websocket_close_handler)(uws_websocket_t *ws, int code, const char *message, size_t length); - typedef void (*uws_websocket_upgrade_handler)(uws_res_t *response, uws_req_t *request, uws_socket_context_t *context); + DLL_EXPORT typedef void (*uws_websocket_handler)(uws_websocket_t *ws, void* user_data); + DLL_EXPORT typedef void (*uws_websocket_message_handler)(uws_websocket_t *ws, const char *message, size_t length, uws_opcode_t opcode, void* user_data); + DLL_EXPORT typedef void (*uws_websocket_ping_pong_handler)(uws_websocket_t *ws, const char *message, size_t length, void* user_data); + DLL_EXPORT typedef void (*uws_websocket_close_handler)(uws_websocket_t *ws, int code, const char *message, size_t length, void* user_data); + DLL_EXPORT typedef void (*uws_websocket_upgrade_handler)(uws_res_t *response, uws_req_t *request, uws_socket_context_t *context, void* user_data); + DLL_EXPORT typedef void (*uws_websocket_subscription_handler)(uws_websocket_t *ws, const char *topic_name, size_t topic_name_length, int new_number_of_subscriber, int old_number_of_subscriber, void* user_data); - typedef struct + DLL_EXPORT typedef struct { uws_compress_options_t compression; /* Maximum message size we can receive */ @@ -136,108 +142,114 @@ extern "C" uws_websocket_ping_pong_handler ping; uws_websocket_ping_pong_handler pong; uws_websocket_close_handler close; + uws_websocket_subscription_handler subscription; } uws_socket_behavior_t; - typedef void (*uws_listen_handler)(struct us_listen_socket_t *listen_socket, uws_app_listen_config_t config, void *user_data); - typedef void (*uws_listen_domain_handler)(struct us_listen_socket_t *listen_socket, const char* domain, int options, void *user_data); - typedef void (*uws_method_handler)(uws_res_t *response, uws_req_t *request, void *user_data); - typedef void (*uws_filter_handler)(uws_res_t *response, int, void *user_data); - typedef void (*uws_missing_server_handler)(const char *hostname, void *user_data); - typedef void (*uws_get_headers_server_handler)(const char *header_name, size_t header_name_size, const char *header_value, size_t header_value_size, void *user_data); + DLL_EXPORT typedef void (*uws_listen_handler)(struct us_listen_socket_t *listen_socket, uws_app_listen_config_t config, void *user_data); + DLL_EXPORT typedef void (*uws_listen_domain_handler)(struct us_listen_socket_t *listen_socket, const char* domain, size_t domain_length, int options, void *user_data); + DLL_EXPORT typedef void (*uws_method_handler)(uws_res_t *response, uws_req_t *request, void *user_data); + DLL_EXPORT typedef void (*uws_filter_handler)(uws_res_t *response, int, void *user_data); + DLL_EXPORT typedef void (*uws_missing_server_handler)(const char *hostname, size_t hostname_length, void *user_data); + DLL_EXPORT typedef void (*uws_get_headers_server_handler)(const char *header_name, size_t header_name_size, const char *header_value, size_t header_value_size, void *user_data); //Basic HTTP - uws_app_t *uws_create_app(int ssl, struct us_socket_context_options_t options); - void uws_app_destroy(int ssl, uws_app_t *app); - void uws_app_get(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); - void uws_app_post(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); - void uws_app_options(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); - void uws_app_delete(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); - void uws_app_patch(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); - void uws_app_put(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); - void uws_app_head(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); - void uws_app_connect(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); - void uws_app_trace(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); - void uws_app_any(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); + DLL_EXPORT uws_app_t *uws_create_app(int ssl, struct us_socket_context_options_t options); + DLL_EXPORT void uws_app_destroy(int ssl, uws_app_t *app); + DLL_EXPORT void uws_app_get(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); + DLL_EXPORT void uws_app_post(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); + DLL_EXPORT void uws_app_options(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); + DLL_EXPORT void uws_app_delete(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); + DLL_EXPORT void uws_app_patch(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); + DLL_EXPORT void uws_app_put(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); + DLL_EXPORT void uws_app_head(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); + DLL_EXPORT void uws_app_connect(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); + DLL_EXPORT void uws_app_trace(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); + DLL_EXPORT void uws_app_any(int ssl, uws_app_t *app, const char *pattern, uws_method_handler handler, void *user_data); - void uws_app_run(int ssl, uws_app_t *); + DLL_EXPORT void uws_app_run(int ssl, uws_app_t *); - void uws_app_domain(int ssl, uws_app_t *app, const char* server_name); - void uws_app_listen(int ssl, uws_app_t *app, int port, uws_listen_handler handler, void *user_data); - void uws_app_listen_with_config(int ssl, uws_app_t *app, uws_app_listen_config_t config, uws_listen_handler handler, void *user_data); - void uws_app_listen_domain(int ssl, uws_app_t *app, const char *domain, uws_listen_domain_handler handler, void *user_data); - void uws_app_listen_domain_with_options(int ssl, uws_app_t *app, const char *domain, int options, uws_listen_domain_handler handler, void *user_data); + DLL_EXPORT void uws_app_listen(int ssl, uws_app_t *app, int port, uws_listen_handler handler, void *user_data); + DLL_EXPORT void uws_app_listen_with_config(int ssl, uws_app_t *app, uws_app_listen_config_t config, uws_listen_handler handler, void *user_data); + DLL_EXPORT void uws_app_listen_domain(int ssl, uws_app_t *app, const char *domain, size_t domain_length, uws_listen_domain_handler handler, void *user_data); + DLL_EXPORT void uws_app_listen_domain_with_options(int ssl, uws_app_t *app, const char *domain,size_t domain_length, int options, uws_listen_domain_handler handler, void *user_data); + DLL_EXPORT void uws_app_domain(int ssl, uws_app_t *app, const char* server_name, size_t server_name_length); - bool uws_constructor_failed(int ssl, uws_app_t *app); - unsigned int uws_num_subscribers(int ssl, uws_app_t *app, const char *topic, size_t topic_length); - bool uws_publish(int ssl, uws_app_t *app, const char *topic, size_t topic_length, const char *message, size_t message_length, uws_opcode_t opcode, bool compress); - void *uws_get_native_handle(int ssl, uws_app_t *app); - void uws_remove_server_name(int ssl, uws_app_t *app, const char *hostname_pattern); - void uws_add_server_name(int ssl, uws_app_t *app, const char *hostname_pattern); - void uws_add_server_name_with_options(int ssl, uws_app_t *app, const char *hostname_pattern, struct us_socket_context_options_t options); - void uws_missing_server_name(int ssl, uws_app_t *app, uws_missing_server_handler handler, void *user_data); - void uws_filter(int ssl, uws_app_t *app, uws_filter_handler handler, void *user_data); + DLL_EXPORT bool uws_constructor_failed(int ssl, uws_app_t *app); + DLL_EXPORT unsigned int uws_num_subscribers(int ssl, uws_app_t *app, const char *topic, size_t topic_length); + DLL_EXPORT bool uws_publish(int ssl, uws_app_t *app, const char *topic, size_t topic_length, const char *message, size_t message_length, uws_opcode_t opcode, bool compress); + DLL_EXPORT void *uws_get_native_handle(int ssl, uws_app_t *app); + DLL_EXPORT void uws_remove_server_name(int ssl, uws_app_t *app, const char *hostname_pattern, size_t hostname_pattern_length); + DLL_EXPORT void uws_add_server_name(int ssl, uws_app_t *app, const char *hostname_pattern, size_t hostname_pattern_length); + DLL_EXPORT void uws_add_server_name_with_options(int ssl, uws_app_t *app, const char *hostname_pattern, size_t hostname_pattern_length, struct us_socket_context_options_t options); + DLL_EXPORT void uws_missing_server_name(int ssl, uws_app_t *app, uws_missing_server_handler handler, void *user_data); + DLL_EXPORT void uws_filter(int ssl, uws_app_t *app, uws_filter_handler handler, void *user_data); //WebSocket - void uws_ws(int ssl, uws_app_t *app, const char *pattern, uws_socket_behavior_t behavior); - void *uws_ws_get_user_data(int ssl, uws_websocket_t *ws); - void uws_ws_close(int ssl, uws_websocket_t *ws); - uws_sendstatus_t uws_ws_send(int ssl, uws_websocket_t *ws, const char *message, size_t length, uws_opcode_t opcode); - uws_sendstatus_t uws_ws_send_with_options(int ssl, uws_websocket_t *ws, const char *message, size_t length, uws_opcode_t opcode, bool compress, bool fin); - uws_sendstatus_t uws_ws_send_fragment(int ssl, uws_websocket_t *ws, const char *message, size_t length, bool compress); - uws_sendstatus_t uws_ws_send_first_fragment(int ssl, uws_websocket_t *ws, const char *message, size_t length, bool compress); - uws_sendstatus_t uws_ws_send_first_fragment_with_opcode(int ssl, uws_websocket_t *ws, const char *message, size_t length, uws_opcode_t opcode, bool compress); - uws_sendstatus_t uws_ws_send_last_fragment(int ssl, uws_websocket_t *ws, const char *message, size_t length, bool compress); - void uws_ws_end(int ssl, uws_websocket_t *ws, int code, const char *message, size_t length); - void uws_ws_cork(int ssl, uws_websocket_t *ws, void (*handler)(void *user_data), void *user_data); + DLL_EXPORT void uws_ws(int ssl, uws_app_t *app, const char *pattern, uws_socket_behavior_t behavior, void* user_data); + DLL_EXPORT void *uws_ws_get_user_data(int ssl, uws_websocket_t *ws); + DLL_EXPORT void uws_ws_close(int ssl, uws_websocket_t *ws); + DLL_EXPORT uws_sendstatus_t uws_ws_send(int ssl, uws_websocket_t *ws, const char *message, size_t length, uws_opcode_t opcode); + DLL_EXPORT uws_sendstatus_t uws_ws_send_with_options(int ssl, uws_websocket_t *ws, const char *message, size_t length, uws_opcode_t opcode, bool compress, bool fin); + DLL_EXPORT uws_sendstatus_t uws_ws_send_fragment(int ssl, uws_websocket_t *ws, const char *message, size_t length, bool compress); + DLL_EXPORT uws_sendstatus_t uws_ws_send_first_fragment(int ssl, uws_websocket_t *ws, const char *message, size_t length, bool compress); + DLL_EXPORT uws_sendstatus_t uws_ws_send_first_fragment_with_opcode(int ssl, uws_websocket_t *ws, const char *message, size_t length, uws_opcode_t opcode, bool compress); + DLL_EXPORT uws_sendstatus_t uws_ws_send_last_fragment(int ssl, uws_websocket_t *ws, const char *message, size_t length, bool compress); + DLL_EXPORT void uws_ws_end(int ssl, uws_websocket_t *ws, int code, const char *message, size_t length); + DLL_EXPORT void uws_ws_cork(int ssl, uws_websocket_t *ws, void (*handler)(void *user_data), void *user_data); - bool uws_ws_subscribe(int ssl, uws_websocket_t *ws, const char *topic, size_t length); - bool uws_ws_unsubscribe(int ssl, uws_websocket_t *ws, const char *topic, size_t length); - bool uws_ws_is_subscribed(int ssl, uws_websocket_t *ws, const char *topic, size_t length); - void uws_ws_iterate_topics(int ssl, uws_websocket_t *ws, void (*callback)(const char *topic, size_t length, void *user_data), void *user_data); - bool uws_ws_publish(int ssl, uws_websocket_t *ws, const char *topic, size_t topic_length, const char *message, size_t message_length); - bool uws_ws_publish_with_options(int ssl, uws_websocket_t *ws, const char *topic, size_t topic_length, const char *message, size_t message_length, uws_opcode_t opcode, bool compress); - unsigned int uws_ws_get_buffered_amount(int ssl, uws_websocket_t *ws); - size_t uws_ws_get_remote_address(int ssl, uws_websocket_t *ws, const char **dest); - size_t uws_ws_get_remote_address_as_text(int ssl, uws_websocket_t *ws, const char **dest); + DLL_EXPORT bool uws_ws_subscribe(int ssl, uws_websocket_t *ws, const char *topic, size_t length); + DLL_EXPORT bool uws_ws_unsubscribe(int ssl, uws_websocket_t *ws, const char *topic, size_t length); + DLL_EXPORT bool uws_ws_is_subscribed(int ssl, uws_websocket_t *ws, const char *topic, size_t length); + DLL_EXPORT void uws_ws_iterate_topics(int ssl, uws_websocket_t *ws, void (*callback)(const char *topic, size_t length, void *user_data), void *user_data); + DLL_EXPORT bool uws_ws_publish(int ssl, uws_websocket_t *ws, const char *topic, size_t topic_length, const char *message, size_t message_length); + DLL_EXPORT bool uws_ws_publish_with_options(int ssl, uws_websocket_t *ws, const char *topic, size_t topic_length, const char *message, size_t message_length, uws_opcode_t opcode, bool compress); + DLL_EXPORT unsigned int uws_ws_get_buffered_amount(int ssl, uws_websocket_t *ws); + DLL_EXPORT size_t uws_ws_get_remote_address(int ssl, uws_websocket_t *ws, const char **dest); + DLL_EXPORT size_t uws_ws_get_remote_address_as_text(int ssl, uws_websocket_t *ws, const char **dest); //Response - void uws_res_end(int ssl, uws_res_t *res, const char *data, size_t length, bool close_connection); - uws_try_end_result_t uws_res_try_end(int ssl, uws_res_t *res, const char *data, size_t length, uintmax_t total_size, bool close_connection); - void uws_res_cork(int ssl, uws_res_t *res, void(*callback)(uws_res_t *res, void* user_data) ,void* user_data); - void uws_res_pause(int ssl, uws_res_t *res); - void uws_res_resume(int ssl, uws_res_t *res); - void uws_res_write_continue(int ssl, uws_res_t *res); - void uws_res_write_status(int ssl, uws_res_t *res, const char *status, size_t length); - void uws_res_write_header(int ssl, uws_res_t *res, const char *key, size_t key_length, const char *value, size_t value_length); + DLL_EXPORT void uws_res_end(int ssl, uws_res_t *res, const char *data, size_t length, bool close_connection); + DLL_EXPORT uws_try_end_result_t uws_res_try_end(int ssl, uws_res_t *res, const char *data, size_t length, uintmax_t total_size, bool close_connection); + DLL_EXPORT void uws_res_cork(int ssl, uws_res_t *res, void(*callback)(uws_res_t *res, void* user_data) ,void* user_data); + DLL_EXPORT void uws_res_pause(int ssl, uws_res_t *res); + DLL_EXPORT void uws_res_resume(int ssl, uws_res_t *res); + DLL_EXPORT void uws_res_write_continue(int ssl, uws_res_t *res); + DLL_EXPORT void uws_res_write_status(int ssl, uws_res_t *res, const char *status, size_t length); + DLL_EXPORT void uws_res_write_header(int ssl, uws_res_t *res, const char *key, size_t key_length, const char *value, size_t value_length); - void uws_res_write_header_int(int ssl, uws_res_t *res, const char *key, size_t key_length, uint64_t value); - void uws_res_end_without_body(int ssl, uws_res_t *res, bool close_connection); - bool uws_res_write(int ssl, uws_res_t *res, const char *data, size_t length); - uintmax_t uws_res_get_write_offset(int ssl, uws_res_t *res); - void uws_res_override_write_offset(int ssl, uws_res_t *res, uintmax_t offset); - bool uws_res_has_responded(int ssl, uws_res_t *res); - void uws_res_on_writable(int ssl, uws_res_t *res, bool (*handler)(uws_res_t *res, uintmax_t, void *opcional_data), void *user_data); - void uws_res_on_aborted(int ssl, uws_res_t *res, void (*handler)(uws_res_t *res, void *opcional_data), void *opcional_data); - void uws_res_on_data(int ssl, uws_res_t *res, void (*handler)(uws_res_t *res, const char *chunk, size_t chunk_length, bool is_end, void *opcional_data), void *opcional_data); - void uws_res_upgrade(int ssl, uws_res_t *res, void *data, const char *sec_web_socket_key, size_t sec_web_socket_key_length, const char *sec_web_socket_protocol, size_t sec_web_socket_protocol_length, const char *sec_web_socket_extensions, size_t sec_web_socket_extensions_length, uws_socket_context_t *ws); - - void *uws_res_get_native_handle(int ssl, uws_res_t *res); + DLL_EXPORT void uws_res_write_header_int(int ssl, uws_res_t *res, const char *key, size_t key_length, uint64_t value); + DLL_EXPORT void uws_res_end_without_body(int ssl, uws_res_t *res, bool close_connection); + DLL_EXPORT bool uws_res_write(int ssl, uws_res_t *res, const char *data, size_t length); + DLL_EXPORT uintmax_t uws_res_get_write_offset(int ssl, uws_res_t *res); + DLL_EXPORT void uws_res_override_write_offset(int ssl, uws_res_t *res, uintmax_t offset); + DLL_EXPORT bool uws_res_has_responded(int ssl, uws_res_t *res); + DLL_EXPORT void uws_res_on_writable(int ssl, uws_res_t *res, bool (*handler)(uws_res_t *res, uintmax_t, void *opcional_data), void *user_data); + DLL_EXPORT void uws_res_on_aborted(int ssl, uws_res_t *res, void (*handler)(uws_res_t *res, void *opcional_data), void *opcional_data); + DLL_EXPORT void uws_res_on_data(int ssl, uws_res_t *res, void (*handler)(uws_res_t *res, const char *chunk, size_t chunk_length, bool is_end, void *opcional_data), void *opcional_data); + DLL_EXPORT void uws_res_upgrade(int ssl, uws_res_t *res, void *data, const char *sec_web_socket_key, size_t sec_web_socket_key_length, const char *sec_web_socket_protocol, size_t sec_web_socket_protocol_length, const char *sec_web_socket_extensions, size_t sec_web_socket_extensions_length, uws_socket_context_t *ws); + DLL_EXPORT size_t uws_res_get_remote_address(int ssl, uws_res_t *res, const char **dest); + DLL_EXPORT size_t uws_res_get_remote_address_as_text(int ssl, uws_res_t *res, const char **dest); +#ifdef UWS_WITH_PROXY + DLL_EXPORT size_t uws_res_get_proxied_remote_address(int ssl, uws_res_t *res, const char **dest); + DLL_EXPORT size_t uws_res_get_proxied_remote_address_as_text(int ssl, uws_res_t *res, const char **dest); +#endif + DLL_EXPORT void *uws_res_get_native_handle(int ssl, uws_res_t *res); //Request - bool uws_req_is_ancient(uws_req_t *res); - 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_full_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); + DLL_EXPORT bool uws_req_is_ancient(uws_req_t *res); + DLL_EXPORT bool uws_req_get_yield(uws_req_t *res); + DLL_EXPORT void uws_req_set_field(uws_req_t *res, bool yield); + DLL_EXPORT size_t uws_req_get_url(uws_req_t *res, const char **dest); + DLL_EXPORT size_t uws_req_get_full_url(uws_req_t *res, const char **dest); + DLL_EXPORT size_t uws_req_get_method(uws_req_t *res, const char **dest); + DLL_EXPORT 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); - void uws_req_for_each_header(uws_req_t *res, uws_get_headers_server_handler handler, void *user_data); - 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); + DLL_EXPORT size_t uws_req_get_header(uws_req_t *res, const char *lower_case_header, size_t lower_case_header_length, const char **dest); + DLL_EXPORT void uws_req_for_each_header(uws_req_t *res, uws_get_headers_server_handler handler, void *user_data); + DLL_EXPORT size_t uws_req_get_query(uws_req_t *res, const char *key, size_t key_length, const char **dest); + DLL_EXPORT size_t uws_req_get_parameter(uws_req_t *res, unsigned short index, const char **dest); - struct us_loop_t *uws_get_loop(); - struct us_loop_t *uws_get_loop_with_native(void* existing_native_loop); + DLL_EXPORT struct us_loop_t *uws_get_loop(); + DLL_EXPORT struct us_loop_t *uws_get_loop_with_native(void* existing_native_loop); #ifdef __cplusplus } diff --git a/uSockets b/uSockets index 9511c0c..b950efd 160000 --- a/uSockets +++ b/uSockets @@ -1 +1 @@ -Subproject commit 9511c0c842ce847b1a4704982f0a9afcae0f8007 +Subproject commit b950efd6b10f06dd3ecb5b692e5d415f48474647