Changeset View
Changeset View
Standalone View
Standalone View
src/httpserver.cpp
Show First 20 Lines • Show All 411 Lines • ▼ Show 20 Lines | if (!http) { | ||||
LogPrintf("couldn't create evhttp. Exiting.\n"); | LogPrintf("couldn't create evhttp. Exiting.\n"); | ||||
event_base_free(base); | event_base_free(base); | ||||
return false; | return false; | ||||
} | } | ||||
evhttp_set_timeout( | evhttp_set_timeout( | ||||
http, gArgs.GetArg("-rpcservertimeout", DEFAULT_HTTP_SERVER_TIMEOUT)); | http, gArgs.GetArg("-rpcservertimeout", DEFAULT_HTTP_SERVER_TIMEOUT)); | ||||
evhttp_set_max_headers_size(http, MAX_HEADERS_SIZE); | evhttp_set_max_headers_size(http, MAX_HEADERS_SIZE); | ||||
evhttp_set_max_body_size( | evhttp_set_max_body_size(http, MIN_SUPPORTED_BODY_SIZE + | ||||
http, MIN_SUPPORTED_BODY_SIZE + 2 * config.GetMaxBlockSize()); | 2 * config.GetMaxBlockSize()); | ||||
evhttp_set_gencb(http, http_request_cb, &config); | evhttp_set_gencb(http, http_request_cb, &config); | ||||
// Only POST and OPTIONS are supported, but we return HTTP 405 for the | // Only POST and OPTIONS are supported, but we return HTTP 405 for the | ||||
// others | // others | ||||
evhttp_set_allowed_methods(http, | evhttp_set_allowed_methods( | ||||
EVHTTP_REQ_GET | EVHTTP_REQ_POST | | http, EVHTTP_REQ_GET | EVHTTP_REQ_POST | EVHTTP_REQ_HEAD | | ||||
EVHTTP_REQ_HEAD | EVHTTP_REQ_PUT | | EVHTTP_REQ_PUT | EVHTTP_REQ_DELETE | EVHTTP_REQ_OPTIONS); | ||||
EVHTTP_REQ_DELETE | EVHTTP_REQ_OPTIONS); | |||||
if (!HTTPBindAddresses(http)) { | if (!HTTPBindAddresses(http)) { | ||||
LogPrintf("Unable to bind any endpoint for RPC server\n"); | LogPrintf("Unable to bind any endpoint for RPC server\n"); | ||||
evhttp_free(http); | evhttp_free(http); | ||||
event_base_free(base); | event_base_free(base); | ||||
return false; | return false; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 161 Lines • ▼ Show 20 Lines | |||||
* done from worker threads. | * done from worker threads. | ||||
*/ | */ | ||||
void HTTPRequest::WriteReply(int nStatus, const std::string &strReply) { | void HTTPRequest::WriteReply(int nStatus, const std::string &strReply) { | ||||
assert(!replySent && req); | assert(!replySent && req); | ||||
// Send event to main http thread to send reply message | // Send event to main http thread to send reply message | ||||
struct evbuffer *evb = evhttp_request_get_output_buffer(req); | struct evbuffer *evb = evhttp_request_get_output_buffer(req); | ||||
assert(evb); | assert(evb); | ||||
evbuffer_add(evb, strReply.data(), strReply.size()); | evbuffer_add(evb, strReply.data(), strReply.size()); | ||||
HTTPEvent *ev = | HTTPEvent *ev = new HTTPEvent(eventBase, true, | ||||
new HTTPEvent(eventBase, true, std::bind(evhttp_send_reply, req, | std::bind(evhttp_send_reply, req, nStatus, | ||||
nStatus, (const char *)nullptr, | (const char *)nullptr, | ||||
(struct evbuffer *)nullptr)); | (struct evbuffer *)nullptr)); | ||||
ev->trigger(nullptr); | ev->trigger(nullptr); | ||||
replySent = true; | replySent = true; | ||||
// transferred back to main thread. | // transferred back to main thread. | ||||
req = nullptr; | req = nullptr; | ||||
} | } | ||||
CService HTTPRequest::GetPeer() { | CService HTTPRequest::GetPeer() { | ||||
evhttp_connection *con = evhttp_request_get_connection(req); | evhttp_connection *con = evhttp_request_get_connection(req); | ||||
▲ Show 20 Lines • Show All 51 Lines • Show Last 20 Lines |