diff --git a/src/base/net/http/HttpContext.cpp b/src/base/net/http/HttpContext.cpp index e0a1e83c..65331d3a 100644 --- a/src/base/net/http/HttpContext.cpp +++ b/src/base/net/http/HttpContext.cpp @@ -29,6 +29,7 @@ #include "3rdparty/http-parser/http_parser.h" +#include "base/kernel/interfaces/IHttpListener.h" #include "base/net/http/HttpContext.h" @@ -78,6 +79,10 @@ xmrig::HttpContext *xmrig::HttpContext::get(uint64_t id) void xmrig::HttpContext::attach(http_parser_settings *settings) { + if (settings->on_message_complete != nullptr) { + return; + } + settings->on_message_begin = nullptr; settings->on_status = nullptr; settings->on_chunk_header = nullptr; @@ -109,6 +114,14 @@ void xmrig::HttpContext::attach(http_parser_settings *settings) return 0; }; + + settings->on_message_complete = [](http_parser *parser) -> int + { + const HttpContext *ctx = reinterpret_cast(parser->data); + ctx->listener->onHttpRequest(*ctx); + + return 0; + }; } diff --git a/src/base/net/http/HttpServer.cpp b/src/base/net/http/HttpServer.cpp index 245451c2..4addee3b 100644 --- a/src/base/net/http/HttpServer.cpp +++ b/src/base/net/http/HttpServer.cpp @@ -35,48 +35,32 @@ #include "base/net/http/HttpServer.h" +namespace xmrig { + +static http_parser_settings http_settings; + +} // namespace xmrig + + xmrig::HttpServer::HttpServer(IHttpListener *listener) : m_listener(listener) { - m_settings = new http_parser_settings(); - - HttpContext::attach(m_settings); - m_settings->on_message_complete = HttpServer::onComplete; + HttpContext::attach(&http_settings); } xmrig::HttpServer::~HttpServer() { - delete m_settings; + memset(&http_settings, 0, sizeof (http_settings)); } void xmrig::HttpServer::onConnection(uv_stream_t *stream, uint16_t) { - static std::function onConnect; - static std::function onRead; + HttpContext *ctx = new HttpContext(HTTP_REQUEST, m_listener); + uv_accept(stream, ctx->stream()); - HttpContext *context = new HttpContext(HTTP_REQUEST, m_listener); - uv_accept(stream, context->stream()); - - onRead = [&](uv_stream_t *tcp, ssize_t nread, const uv_buf_t *buf) { - HttpContext* context = static_cast(tcp->data); - - if (nread >= 0) { - const size_t size = static_cast(nread); - const size_t parsed = http_parser_execute(context->parser, m_settings, buf->base, size); - - if (parsed < size) { - uv_close(context->handle(), HttpContext::close); - } - } else { - uv_close(context->handle(), HttpContext::close); - } - - delete [] buf->base; - }; - - uv_read_start(context->stream(), + uv_read_start(ctx->stream(), [](uv_handle_t *, size_t suggested_size, uv_buf_t *buf) { buf->base = new char[suggested_size]; @@ -89,18 +73,19 @@ void xmrig::HttpServer::onConnection(uv_stream_t *stream, uint16_t) }, [](uv_stream_t *tcp, ssize_t nread, const uv_buf_t *buf) { - onRead(tcp, nread, buf); + HttpContext *ctx = static_cast(tcp->data); + + if (nread >= 0) { + const size_t size = static_cast(nread); + const size_t parsed = http_parser_execute(ctx->parser, &http_settings, buf->base, size); + + if (parsed < size) { + uv_close(ctx->handle(), HttpContext::close); + } + } else { + uv_close(ctx->handle(), HttpContext::close); + } + + delete [] buf->base; }); } - - -int xmrig::HttpServer::onComplete(http_parser *parser) -{ - HttpContext *context = reinterpret_cast(parser->data); - HttpResponse res(context->id()); - - context->listener->onHttpRequest(*context); - - return 0; -} - diff --git a/src/base/net/http/HttpServer.h b/src/base/net/http/HttpServer.h index 651be467..45f3843d 100644 --- a/src/base/net/http/HttpServer.h +++ b/src/base/net/http/HttpServer.h @@ -51,9 +51,6 @@ protected: void onConnection(uv_stream_t *stream, uint16_t port) override; private: - static int onComplete(http_parser *parser); - - http_parser_settings *m_settings; IHttpListener *m_listener; };