diff options
Diffstat (limited to 'src/deps')
-rw-r--r-- | src/deps/_libusockets.h | 2 | ||||
-rw-r--r-- | src/deps/libuwsockets.cpp | 37 | ||||
-rw-r--r-- | src/deps/uws.zig | 15 |
3 files changed, 51 insertions, 3 deletions
diff --git a/src/deps/_libusockets.h b/src/deps/_libusockets.h index 3b8c61f74..e8a510392 100644 --- a/src/deps/_libusockets.h +++ b/src/deps/_libusockets.h @@ -295,6 +295,8 @@ void *uws_res_get_native_handle(int ssl, uws_res_t *res); void uws_res_uncork(int ssl, uws_res_t *res); void uws_res_set_write_offset(int ssl, uws_res_t *res, size_t off); void us_socket_mark_needs_more_not_ssl(uws_res_t *res); +void uws_req_clone_headers(uws_req_t *req_, void *ctx); + #ifdef __cplusplus } #endif diff --git a/src/deps/libuwsockets.cpp b/src/deps/libuwsockets.cpp index 39e0e27fc..1bc370b17 100644 --- a/src/deps/libuwsockets.cpp +++ b/src/deps/libuwsockets.cpp @@ -897,7 +897,7 @@ void uws_req_set_field(uws_req_t *res, bool yield) { size_t uws_req_get_url(uws_req_t *res, const char **dest) { uWS::HttpRequest *uwsReq = (uWS::HttpRequest *)res; - std::string_view value = uwsReq->getUrl(); + std::string_view value = uwsReq->getFullUrl(); *dest = value.data(); return value.length(); } @@ -1005,12 +1005,43 @@ void uws_res_write_headers(int ssl, uws_res_t *res, const StringPointer *names, } } +extern "C" void Headers__preallocate(void *ctx, size_t len, + size_t header_count); +extern "C" void Headers__appendHeaderNormalized(void *ctx, const char *name, + size_t name_length, + const char *value, + size_t value_length); + +void uws_req_clone_headers(uws_req_t *req_, void *ctx) { + + size_t buffer_len = 0; + size_t header_count = 0; + + uWS::HttpRequest *req = (uWS::HttpRequest *)req_; + uWS::HttpRequest iterator = *req; + + for (const auto &header : iterator) { + buffer_len += header.first.length() + header.second.length(); + header_count++; + } + + Headers__preallocate(ctx, buffer_len, header_count); + + for (const auto &header : iterator) { + Headers__appendHeaderNormalized(ctx, header.first.data(), + header.first.length(), header.second.data(), + header.second.length()); + } +} + void uws_res_uncork(int ssl, uws_res_t *res) { // if (ssl) { - // uWS::HttpResponse<true> *uwsRes = (uWS::HttpResponse<true> *)res; + // uWS::HttpResponse<true> *uwsRes = + // (uWS::HttpResponse<true> *)res; // uwsRes->uncork(); // } else { - // uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)res; + // uWS::HttpResponse<false> *uwsRes = + // (uWS::HttpResponse<false> *)res; // uwsRes->uncork(); // } } diff --git a/src/deps/uws.zig b/src/deps/uws.zig index a9753406e..2f590606c 100644 --- a/src/deps/uws.zig +++ b/src/deps/uws.zig @@ -170,6 +170,21 @@ pub const Request = opaque { var ptr: [*]const u8 = undefined; return ptr[0..req.uws_req_get_parameter(@intCast(c_ushort, index), &ptr)]; } + + pub fn cloneHeaders( + req: *Request, + ctx: *anyopaque, + ) void { + uws_req_clone_headers(req, ctx); + } + + extern fn uws_req_clone_headers( + req_: *Request, + ctx: *anyopaque, + //preallocate: fn (ctx: ?*anyopaque, len: usize, header_count: usize) callconv(.C) void, + //append: fn (ctx: ?*anyopaque, name: [*]const u8, name_length: usize, value: [*]const u8, value_length: usize) callconv(.C) void, + ) void; + extern fn uws_req_is_ancient(res: *Request) bool; extern fn uws_req_get_yield(res: *Request) bool; extern fn uws_req_set_field(res: *Request, yield: bool) void; |