mirror of
https://github.com/xmrig/xmrig.git
synced 2024-11-18 10:01:06 +00:00
Use static http_parser_settings.
This commit is contained in:
parent
c9f9e6787c
commit
106e149324
3 changed files with 39 additions and 44 deletions
|
@ -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<const HttpContext*>(parser->data);
|
||||
ctx->listener->onHttpRequest(*ctx);
|
||||
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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<void(uv_stream_t *socket, int status)> onConnect;
|
||||
static std::function<void(uv_stream_t *tcp, ssize_t nread, const uv_buf_t *buf)> 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<HttpContext*>(tcp->data);
|
||||
|
||||
if (nread >= 0) {
|
||||
const size_t size = static_cast<size_t>(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<HttpContext*>(tcp->data);
|
||||
|
||||
if (nread >= 0) {
|
||||
const size_t size = static_cast<size_t>(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<HttpContext*>(parser->data);
|
||||
HttpResponse res(context->id());
|
||||
|
||||
context->listener->onHttpRequest(*context);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue