[CAPI] add DLL_EXPORT for windows, void* user_data in websockets methods and size_t in methods/handler without it (#1513)

* add DLL_EXPORT for windows

* add user_data and size_t in pending methods

* added get_remote_address and get_proxied_remote_address to res

* fixed mixing lenght in some std:string_view, added subscriptin event, fixed ssl_ciphers
This commit is contained in:
Ciro Spaciari
2023-01-06 10:42:29 +01:00
committed by GitHub
parent 8cf7e73862
commit 4821d090fe
4 changed files with 264 additions and 175 deletions
+4 -4
View File
@@ -8,20 +8,20 @@ default:
capi: capi:
$(MAKE) clean $(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 && $(CXX) -std=c++17 -flto -fPIC -O3 -c src/crypto/*.cpp
cd ../uSockets && $(AR) rvs uSockets.a *.o 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 $(AR) rvs $(LIBRARY_NAME).a $(LIBRARY_NAME).o ../uSockets/uSockets.a
shared: shared:
$(MAKE) clean $(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 && $(CXX) -std=c++17 -flto -fPIC -O3 -c src/crypto/*.cpp
cd ../uSockets && $(AR) rvs uSockets.a *.o 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 $(CXX) -shared -o $(LIBRARY_NAME).so $(LIBRARY_NAME).o ../uSockets/uSockets.a -fPIC -lz -luv -lssl -lcrypto
misc: 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 mkdir -p ../misc && openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -passout pass:1234 -keyout ../misc/key.pem -out ../misc/cert.pem
+140 -63
View File
@@ -38,6 +38,8 @@ extern "C"
sco.key_file_name = options.key_file_name; sco.key_file_name = options.key_file_name;
sco.passphrase = options.passphrase; sco.passphrase = options.passphrase;
sco.ssl_prefer_low_memory_usage = options.ssl_prefer_low_memory_usage; 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); return (uws_app_t *)new uWS::SSLApp(sco);
} }
@@ -350,59 +352,59 @@ extern "C"
} }
/* callback, path to unix domain socket */ /* 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) if (ssl)
{ {
uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; uWS::SSLApp *uwsApp = (uWS::SSLApp *)app;
uwsApp->listen([handler, domain, user_data](struct us_listen_socket_t *listen_socket) uwsApp->listen([handler, domain, domain_length, user_data](struct us_listen_socket_t *listen_socket)
{ handler((struct us_listen_socket_t *)listen_socket, domain, 0, user_data); }, { handler((struct us_listen_socket_t *)listen_socket, domain, domain_length, 0, user_data); },
domain); std::string(domain, domain_length));
} }
else else
{ {
uWS::App *uwsApp = (uWS::App *)app; uWS::App *uwsApp = (uWS::App *)app;
uwsApp->listen([handler, domain, user_data](struct us_listen_socket_t *listen_socket) uwsApp->listen([handler, domain, domain_length, user_data](struct us_listen_socket_t *listen_socket)
{ handler((struct us_listen_socket_t *)listen_socket, domain, 0, user_data); }, { handler((struct us_listen_socket_t *)listen_socket, domain, domain_length, 0, user_data); },
domain); std::string(domain, domain_length));
} }
} }
/* callback, path to unix domain socket */ /* 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) if (ssl)
{ {
uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; uWS::SSLApp *uwsApp = (uWS::SSLApp *)app;
uwsApp->listen( uwsApp->listen(
options, [handler, domain, options, user_data](struct us_listen_socket_t *listen_socket) options, [handler, domain, domain_length, options, user_data](struct us_listen_socket_t *listen_socket)
{ handler((struct us_listen_socket_t *)listen_socket, domain, options, user_data); }, { handler((struct us_listen_socket_t *)listen_socket, domain, domain_length, options, user_data); },
domain); std::string(domain, domain_length));
} }
else else
{ {
uWS::App *uwsApp = (uWS::App *)app; uWS::App *uwsApp = (uWS::App *)app;
uwsApp->listen( uwsApp->listen(
options, [handler, domain, options, user_data](struct us_listen_socket_t *listen_socket) options, [handler, domain, domain_length, options, user_data](struct us_listen_socket_t *listen_socket)
{ handler((struct us_listen_socket_t *)listen_socket, domain, options, user_data); }, { handler((struct us_listen_socket_t *)listen_socket, domain, domain_length, options, user_data); },
domain); 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) if (ssl)
{ {
uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; uWS::SSLApp *uwsApp = (uWS::SSLApp *)app;
uwsApp->domain(server_name); uwsApp->domain(std::string(server_name, server_name_length));
} }
else else
{ {
uWS::App *uwsApp = (uWS::App *)app; 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) void uws_app_destroy(int ssl, uws_app_t *app)
@@ -465,33 +467,33 @@ extern "C"
uWS::App *uwsApp = (uWS::App *)app; uWS::App *uwsApp = (uWS::App *)app;
return uwsApp->getNativeHandle(); 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) if (ssl)
{ {
uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; uWS::SSLApp *uwsApp = (uWS::SSLApp *)app;
uwsApp->removeServerName(hostname_pattern); uwsApp->removeServerName(std::string(hostname_pattern, hostname_pattern_length));
} }
else else
{ {
uWS::App *uwsApp = (uWS::App *)app; 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) if (ssl)
{ {
uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; uWS::SSLApp *uwsApp = (uWS::SSLApp *)app;
uwsApp->addServerName(hostname_pattern); uwsApp->addServerName(std::string(hostname_pattern, hostname_pattern_length));
} }
else else
{ {
uWS::App *uwsApp = (uWS::App *)app; 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; uWS::SocketContextOptions sco;
sco.ca_file_name = options.ca_file_name; sco.ca_file_name = options.ca_file_name;
@@ -504,12 +506,12 @@ extern "C"
if (ssl) if (ssl)
{ {
uWS::SSLApp *uwsApp = (uWS::SSLApp *)app; uWS::SSLApp *uwsApp = (uWS::SSLApp *)app;
uwsApp->addServerName(hostname_pattern, sco); uwsApp->addServerName(std::string(hostname_pattern, hostname_pattern_length), sco);
} }
else else
{ {
uWS::App *uwsApp = (uWS::App *)app; 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; uWS::SSLApp *uwsApp = (uWS::SSLApp *)app;
uwsApp->missingServerName([handler, user_data](auto hostname) uwsApp->missingServerName([handler, user_data](auto hostname)
{ handler(hostname, user_data); }); { handler(hostname, strlen(hostname), user_data); });
} }
else else
{ {
uWS::App *uwsApp = (uWS::App *)app; uWS::App *uwsApp = (uWS::App *)app;
uwsApp->missingServerName([handler, user_data](auto hostname) 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) 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) if (ssl)
{ {
@@ -561,39 +563,44 @@ extern "C"
}; };
if (behavior.upgrade) 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) 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) 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) 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) 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) 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) 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; uWS::SSLApp *uwsApp = (uWS::SSLApp *)app;
@@ -613,39 +620,44 @@ extern "C"
}; };
if (behavior.upgrade) 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) 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) 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) 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) 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) 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) 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; uWS::App *uwsApp = (uWS::App *)app;
uwsApp->ws<void *>(pattern, std::move(generic_handler)); uwsApp->ws<void *>(pattern, std::move(generic_handler));
@@ -693,10 +705,10 @@ extern "C"
if (ssl) if (ssl)
{ {
uWS::WebSocket<true, true, void *> *uws = (uWS::WebSocket<true, true, void *> *)ws; uWS::WebSocket<true, true, void *> *uws = (uWS::WebSocket<true, true, void *> *)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<false, true, void *> *uws = (uWS::WebSocket<false, true, void *> *)ws; uWS::WebSocket<false, true, void *> *uws = (uWS::WebSocket<false, true, void *> *)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) 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) if (ssl)
{ {
uWS::WebSocket<true, true, void *> *uws = (uWS::WebSocket<true, true, void *> *)ws; uWS::WebSocket<true, true, void *> *uws = (uWS::WebSocket<true, true, void *> *)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<false, true, void *> *uws = (uWS::WebSocket<false, true, void *> *)ws; uWS::WebSocket<false, true, void *> *uws = (uWS::WebSocket<false, true, void *> *)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) 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(); return uws->getBufferedAmount();
} }
size_t uws_ws_get_remote_address(int ssl, uws_websocket_t *ws, const char **dest) size_t uws_ws_get_remote_address(int ssl, uws_websocket_t *ws, const char **dest)
{ {
if (ssl) 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<true> *uwsRes = (uWS::HttpResponse<true> *)res;
std::string_view value = uwsRes->getRemoteAddress();
*dest = value.data();
return value.length();
}
uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)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<true> *uwsRes = (uWS::HttpResponse<true> *)res;
std::string_view value = uwsRes->getRemoteAddressAsText();
*dest = value.data();
return value.length();
}
uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)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<true> *uwsRes = (uWS::HttpResponse<true> *)res;
std::string_view value = uwsRes->getProxiedRemoteAddress();
*dest = value.data();
return value.length();
}
uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)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<true> *uwsRes = (uWS::HttpResponse<true> *)res;
std::string_view value = uwsRes->getProxiedRemoteAddressAsText();
*dest = value.data();
return value.length();
}
uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)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) 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) if (ssl)
@@ -1041,10 +1118,10 @@ extern "C"
if (ssl) if (ssl)
{ {
uWS::HttpResponse<true> *uwsRes = (uWS::HttpResponse<true> *)res; uWS::HttpResponse<true> *uwsRes = (uWS::HttpResponse<true> *)res;
return uwsRes->write(std::string_view(data)); return uwsRes->write(std::string_view(data, length));
} }
uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)res; uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)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) uintmax_t uws_res_get_write_offset(int ssl, uws_res_t *res)
{ {
+119 -107
View File
@@ -31,9 +31,14 @@
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#endif
#ifdef _WIN32
# define DLL_EXPORT __declspec( dllexport )
#else
# define DLL_EXPORT
#endif #endif
typedef enum DLL_EXPORT typedef enum
{ {
/* These are not actual compression options */ /* These are not actual compression options */
_COMPRESSOR_MASK = 0x00FF, _COMPRESSOR_MASK = 0x00FF,
@@ -66,7 +71,7 @@ extern "C"
DEDICATED_COMPRESSOR = 15 << 4 | 8 DEDICATED_COMPRESSOR = 15 << 4 | 8
} uws_compress_options_t; } uws_compress_options_t;
typedef enum DLL_EXPORT typedef enum
{ {
CONTINUATION = 0, CONTINUATION = 0,
TEXT = 1, TEXT = 1,
@@ -76,14 +81,14 @@ extern "C"
PONG = 10 PONG = 10
} uws_opcode_t; } uws_opcode_t;
typedef enum DLL_EXPORT typedef enum
{ {
BACKPRESSURE, BACKPRESSURE,
SUCCESS, SUCCESS,
DROPPED DROPPED
} uws_sendstatus_t; } uws_sendstatus_t;
typedef struct DLL_EXPORT typedef struct
{ {
int port; int port;
@@ -91,29 +96,30 @@ extern "C"
int options; int options;
} uws_app_listen_config_t; } uws_app_listen_config_t;
typedef struct { DLL_EXPORT typedef struct {
bool ok; bool ok;
bool has_responded; bool has_responded;
} uws_try_end_result_t; } uws_try_end_result_t;
struct uws_app_s; DLL_EXPORT struct uws_app_s;
struct uws_req_s; DLL_EXPORT struct uws_req_s;
struct uws_res_s; DLL_EXPORT struct uws_res_s;
struct uws_websocket_s; DLL_EXPORT struct uws_websocket_s;
struct uws_header_iterator_s; DLL_EXPORT struct uws_header_iterator_s;
typedef struct uws_app_s uws_app_t; DLL_EXPORT typedef struct uws_app_s uws_app_t;
typedef struct uws_req_s uws_req_t; DLL_EXPORT typedef struct uws_req_s uws_req_t;
typedef struct uws_res_s uws_res_t; DLL_EXPORT typedef struct uws_res_s uws_res_t;
typedef struct uws_socket_context_s uws_socket_context_t; DLL_EXPORT typedef struct uws_socket_context_s uws_socket_context_t;
typedef struct uws_websocket_s uws_websocket_t; DLL_EXPORT typedef struct uws_websocket_s uws_websocket_t;
typedef void (*uws_websocket_handler)(uws_websocket_t *ws); DLL_EXPORT typedef void (*uws_websocket_handler)(uws_websocket_t *ws, void* user_data);
typedef void (*uws_websocket_message_handler)(uws_websocket_t *ws, const char *message, size_t length, uws_opcode_t opcode); 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);
typedef void (*uws_websocket_ping_pong_handler)(uws_websocket_t *ws, const char *message, size_t length); DLL_EXPORT typedef void (*uws_websocket_ping_pong_handler)(uws_websocket_t *ws, const char *message, size_t length, void* user_data);
typedef void (*uws_websocket_close_handler)(uws_websocket_t *ws, int code, const char *message, size_t length); DLL_EXPORT typedef void (*uws_websocket_close_handler)(uws_websocket_t *ws, int code, const char *message, size_t length, void* user_data);
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_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; uws_compress_options_t compression;
/* Maximum message size we can receive */ /* Maximum message size we can receive */
@@ -136,108 +142,114 @@ extern "C"
uws_websocket_ping_pong_handler ping; uws_websocket_ping_pong_handler ping;
uws_websocket_ping_pong_handler pong; uws_websocket_ping_pong_handler pong;
uws_websocket_close_handler close; uws_websocket_close_handler close;
uws_websocket_subscription_handler subscription;
} uws_socket_behavior_t; } 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); DLL_EXPORT 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); 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);
typedef void (*uws_method_handler)(uws_res_t *response, uws_req_t *request, void *user_data); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT typedef void (*uws_missing_server_handler)(const char *hostname, size_t hostname_length, 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_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 //Basic HTTP
uws_app_t *uws_create_app(int ssl, struct us_socket_context_options_t options); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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 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); DLL_EXPORT void uws_app_listen(int ssl, uws_app_t *app, int port, uws_listen_handler handler, void *user_data);
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);
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);
void uws_app_listen_domain(int ssl, uws_app_t *app, const char *domain, 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);
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_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); DLL_EXPORT 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); DLL_EXPORT 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); 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);
void *uws_get_native_handle(int ssl, uws_app_t *app); DLL_EXPORT 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); DLL_EXPORT void uws_remove_server_name(int ssl, uws_app_t *app, const char *hostname_pattern, size_t hostname_pattern_length);
void uws_add_server_name(int ssl, uws_app_t *app, const char *hostname_pattern); DLL_EXPORT void uws_add_server_name(int ssl, uws_app_t *app, const char *hostname_pattern, size_t 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); 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);
void uws_missing_server_name(int ssl, uws_app_t *app, uws_missing_server_handler handler, void *user_data); DLL_EXPORT 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 void uws_filter(int ssl, uws_app_t *app, uws_filter_handler handler, void *user_data);
//WebSocket //WebSocket
void uws_ws(int ssl, uws_app_t *app, const char *pattern, uws_socket_behavior_t behavior); DLL_EXPORT void uws_ws(int ssl, uws_app_t *app, const char *pattern, uws_socket_behavior_t behavior, void* user_data);
void *uws_ws_get_user_data(int ssl, uws_websocket_t *ws); DLL_EXPORT void *uws_ws_get_user_data(int ssl, uws_websocket_t *ws);
void uws_ws_close(int ssl, uws_websocket_t *ws); DLL_EXPORT 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); DLL_EXPORT 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); 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);
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_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); DLL_EXPORT 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); 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);
uws_sendstatus_t uws_ws_send_last_fragment(int ssl, uws_websocket_t *ws, const char *message, size_t length, 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);
void uws_ws_end(int ssl, uws_websocket_t *ws, int code, const char *message, size_t length); DLL_EXPORT 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_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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); 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);
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(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); 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);
unsigned int uws_ws_get_buffered_amount(int ssl, uws_websocket_t *ws); DLL_EXPORT 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); DLL_EXPORT 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 size_t uws_ws_get_remote_address_as_text(int ssl, uws_websocket_t *ws, const char **dest);
//Response //Response
void uws_res_end(int ssl, uws_res_t *res, const char *data, size_t length, bool close_connection); DLL_EXPORT 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); 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);
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_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); DLL_EXPORT void uws_res_pause(int ssl, uws_res_t *res);
void uws_res_resume(int ssl, uws_res_t *res); DLL_EXPORT void uws_res_resume(int ssl, uws_res_t *res);
void uws_res_write_continue(int ssl, uws_res_t *res); DLL_EXPORT 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); DLL_EXPORT 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_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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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); 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);
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_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); 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);
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 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);
void *uws_res_get_native_handle(int ssl, uws_res_t *res); 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 //Request
bool uws_req_is_ancient(uws_req_t *res); DLL_EXPORT bool uws_req_is_ancient(uws_req_t *res);
bool uws_req_get_yield(uws_req_t *res); DLL_EXPORT bool uws_req_get_yield(uws_req_t *res);
void uws_req_set_field(uws_req_t *res, bool yield); DLL_EXPORT void uws_req_set_field(uws_req_t *res, bool yield);
size_t uws_req_get_url(uws_req_t *res, const char **dest); DLL_EXPORT 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); DLL_EXPORT 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); DLL_EXPORT 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 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); 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);
void uws_req_for_each_header(uws_req_t *res, uws_get_headers_server_handler handler, void *user_data); DLL_EXPORT 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); DLL_EXPORT 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_parameter(uws_req_t *res, unsigned short index, const char **dest);
struct us_loop_t *uws_get_loop(); DLL_EXPORT 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_with_native(void* existing_native_loop);
#ifdef __cplusplus #ifdef __cplusplus
} }