diff options
author | 2022-04-12 03:45:58 -0700 | |
---|---|---|
committer | 2022-04-12 03:46:21 -0700 | |
commit | 743ad44c0a012545989d68eb956a6c0befa277e2 (patch) | |
tree | 468fce02957975b9e1b1cd20913fc0f155f9bb13 /src/deps/libuwsockets.cpp | |
parent | 9db701ab41cb1195f0ec506455840ea79be07aee (diff) | |
download | bun-743ad44c0a012545989d68eb956a6c0befa277e2.tar.gz bun-743ad44c0a012545989d68eb956a6c0befa277e2.tar.zst bun-743ad44c0a012545989d68eb956a6c0befa277e2.zip |
Make sendfile more reliable
Diffstat (limited to 'src/deps/libuwsockets.cpp')
-rw-r--r-- | src/deps/libuwsockets.cpp | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/src/deps/libuwsockets.cpp b/src/deps/libuwsockets.cpp index 7eba32d44..f854cafdb 100644 --- a/src/deps/libuwsockets.cpp +++ b/src/deps/libuwsockets.cpp @@ -793,11 +793,17 @@ void uws_res_write_header_int(int ssl, uws_res_t *res, const char *key, void uws_res_end_without_body(int ssl, uws_res_t *res) { if (ssl) { uWS::HttpResponse<true> *uwsRes = (uWS::HttpResponse<true> *)res; - uwsRes->endWithoutBody(0); + uwsRes->getHttpResponseData()->state |= + uWS::HttpResponseData<true>::HTTP_END_CALLED; + uwsRes->markDone(uwsRes->getHttpResponseData()); + us_socket_timeout(true, (us_socket_t *)uwsRes, uWS::HTTP_TIMEOUT_S); } else { uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)res; - uwsRes->endWithoutBody(0); + uwsRes->getHttpResponseData()->state |= + uWS::HttpResponseData<false>::HTTP_END_CALLED; + uwsRes->markDone(uwsRes->getHttpResponseData()); + us_socket_timeout(false, (us_socket_t *)uwsRes, uWS::HTTP_TIMEOUT_S); } } @@ -1002,15 +1008,13 @@ void uws_res_write_headers(int ssl, uws_res_t *res, const StringPointer *names, } void uws_res_uncork(int ssl, uws_res_t *res) { - // if (ssl) { - // uWS::HttpResponse<true> *uwsRes = - // (uWS::HttpResponse<true> *)res; - // uwsRes->uncork(); - // } else { - // uWS::HttpResponse<false> *uwsRes = - // (uWS::HttpResponse<false> *)res; - // uwsRes->uncork(); - // } + if (ssl) { + uWS::HttpResponse<true> *uwsRes = (uWS::HttpResponse<true> *)res; + uwsRes->uncork(); + } else { + uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)res; + uwsRes->uncork(); + } } void us_socket_mark_needs_more_not_ssl(uws_res_t *res) { @@ -1035,12 +1039,31 @@ void uws_res_cork(int ssl, uws_res_t *res, void *ctx, if (ssl) { uWS::HttpResponse<true> *uwsRes = (uWS::HttpResponse<true> *)res; uwsRes->cork([ctx, corker]() { corker(ctx); }); + } else { uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)res; uwsRes->cork([ctx, corker]() { corker(ctx); }); } } +void uws_res_prepare_for_sendfile(int ssl, uws_res_t *res) { + if (ssl) { + uWS::HttpResponse<true> *uwsRes = (uWS::HttpResponse<true> *)res; + auto pair = uwsRes->getSendBuffer(2); + char *ptr = pair.first; + ptr[0] = '\r'; + ptr[1] = '\n'; + uwsRes->uncork(); + } else { + uWS::HttpResponse<false> *uwsRes = (uWS::HttpResponse<false> *)res; + auto pair = uwsRes->getSendBuffer(2); + char *ptr = pair.first; + ptr[0] = '\r'; + ptr[1] = '\n'; + uwsRes->uncork(); + } +} + bool uws_res_try_end(int ssl, uws_res_t *res, const char *bytes, size_t len, size_t total_len) { if (ssl) { |