Bitcoin Core 28.99.0
P2P Digital Currency
|
#include <httpserver.h>
#include <chainparamsbase.h>
#include <common/args.h>
#include <common/messages.h>
#include <compat/compat.h>
#include <logging.h>
#include <netbase.h>
#include <node/interface_ui.h>
#include <rpc/protocol.h>
#include <sync.h>
#include <util/check.h>
#include <util/signalinterrupt.h>
#include <util/strencodings.h>
#include <util/threadnames.h>
#include <util/translation.h>
#include <condition_variable>
#include <cstdio>
#include <cstdlib>
#include <deque>
#include <memory>
#include <optional>
#include <span>
#include <string>
#include <unordered_map>
#include <sys/types.h>
#include <sys/stat.h>
#include <event2/buffer.h>
#include <event2/bufferevent.h>
#include <event2/http.h>
#include <event2/http_struct.h>
#include <event2/keyvalq_struct.h>
#include <event2/thread.h>
#include <event2/util.h>
#include <support/events.h>
Go to the source code of this file.
Classes | |
class | HTTPWorkItem |
HTTP request work item. More... | |
class | WorkQueue< WorkItem > |
Simple work queue for distributing work over multiple threads. More... | |
struct | HTTPPathHandler |
class | HTTPRequestTracker |
Helps keep track of open evhttp_connection s with active evhttp_requests More... | |
Functions | |
static std::vector< HTTPPathHandler > pathHandlers | GUARDED_BY (g_httppathhandlers_mutex) |
static bool | ClientAllowed (const CNetAddr &netaddr) |
Check if a network address is allowed to access the HTTP server. More... | |
static bool | InitHTTPAllowList () |
Initialize ACL list for HTTP server. More... | |
std::string | RequestMethodString (HTTPRequest::RequestMethod m) |
HTTP request method as string - use for logging only. More... | |
static void | http_request_cb (struct evhttp_request *req, void *arg) |
HTTP request callback. More... | |
static void | http_reject_request_cb (struct evhttp_request *req, void *) |
Callback to reject HTTP requests after shutdown. More... | |
static void | ThreadHTTP (struct event_base *base) |
Event dispatcher thread. More... | |
static bool | HTTPBindAddresses (struct evhttp *http) |
Bind HTTP server to specified addresses. More... | |
static void | HTTPWorkQueueRun (WorkQueue< HTTPClosure > *queue, int worker_num) |
Simple wrapper to set thread name and run work queue. More... | |
static void | libevent_log_cb (int severity, const char *msg) |
libevent event log callback More... | |
bool | InitHTTPServer (const util::SignalInterrupt &interrupt) |
Initialize HTTP server. More... | |
void | UpdateHTTPServerLogging (bool enable) |
Change logging level for libevent. More... | |
void | StartHTTPServer () |
Start HTTP server. More... | |
void | InterruptHTTPServer () |
Interrupt HTTP server threads. More... | |
void | StopHTTPServer () |
Stop HTTP server. More... | |
struct event_base * | EventBase () |
Return evhttp event base. More... | |
static void | httpevent_callback_fn (evutil_socket_t, short, void *data) |
std::optional< std::string > | GetQueryParameterFromUri (const char *uri, const std::string &key) |
Get the query parameter value from request uri for a specified key, or std::nullopt if the key is not found. More... | |
void | RegisterHTTPHandler (const std::string &prefix, bool exactMatch, const HTTPRequestHandler &handler) |
Register handler for prefix. More... | |
void | UnregisterHTTPHandler (const std::string &prefix, bool exactMatch) |
Unregister handler for prefix. More... | |
Variables | |
static const size_t | MAX_HEADERS_SIZE = 8192 |
Maximum size of http request (request line + headers) More... | |
static struct event_base * | eventBase = nullptr |
HTTP module state. More... | |
static struct evhttp * | eventHTTP = nullptr |
HTTP server. More... | |
static std::vector< CSubNet > | rpc_allow_subnets |
List of subnets to allow RPC connections from. More... | |
static std::unique_ptr< WorkQueue< HTTPClosure > > | g_work_queue {nullptr} |
Work queue for handling longer requests off the event loop thread. More... | |
static GlobalMutex | g_httppathhandlers_mutex |
Handlers for (sub)paths. More... | |
static std::vector< evhttp_bound_socket * > | boundSockets |
Bound listening sockets. More... | |
static HTTPRequestTracker | g_requests |
Track active requests. More... | |
static std::thread | g_thread_http |
static std::vector< std::thread > | g_thread_http_workers |
|
static |
Check if a network address is allowed to access the HTTP server.
Definition at line 210 of file httpserver.cpp.
struct event_base * EventBase | ( | ) |
Return evhttp event base.
This can be used by submodules to queue timers or custom events.
Definition at line 559 of file httpserver.cpp.
std::optional< std::string > GetQueryParameterFromUri | ( | const char * | uri, |
const std::string & | key | ||
) |
Get the query parameter value from request uri for a specified key, or std::nullopt if the key is not found.
If the query string contains duplicate keys, the first value is returned. Many web frameworks would instead parse this as an array of values, but this is not (yet) implemented as it is currently not needed in any of the endpoints.
Helper function for HTTPRequest::GetQueryParameter.
[in] | uri | is the entire request uri |
[in] | key | represents the query parameter of which the value is returned |
Definition at line 726 of file httpserver.cpp.
|
static |
|
static |
Callback to reject HTTP requests after shutdown.
Definition at line 342 of file httpserver.cpp.
|
static |
HTTP request callback.
Definition at line 262 of file httpserver.cpp.
|
static |
Bind HTTP server to specified addresses.
Definition at line 359 of file httpserver.cpp.
|
static |
|
static |
Simple wrapper to set thread name and run work queue.
Definition at line 410 of file httpserver.cpp.
|
static |
Initialize ACL list for HTTP server.
Definition at line 221 of file httpserver.cpp.
bool InitHTTPServer | ( | const util::SignalInterrupt & | interrupt | ) |
Initialize HTTP server.
Call this before RegisterHTTPHandler or EventBase().
Definition at line 437 of file httpserver.cpp.
void InterruptHTTPServer | ( | ) |
Interrupt HTTP server threads.
Definition at line 506 of file httpserver.cpp.
|
static |
libevent event log callback
Definition at line 417 of file httpserver.cpp.
void RegisterHTTPHandler | ( | const std::string & | prefix, |
bool | exactMatch, | ||
const HTTPRequestHandler & | handler | ||
) |
Register handler for prefix.
If multiple handlers match a prefix, the first-registered one will be invoked.
Definition at line 753 of file httpserver.cpp.
std::string RequestMethodString | ( | HTTPRequest::RequestMethod | m | ) |
HTTP request method as string - use for logging only.
Definition at line 244 of file httpserver.cpp.
void StartHTTPServer | ( | ) |
Start HTTP server.
This is separate from InitHTTPServer to give users race-condition-free time to register their handlers between InitHTTPServer and StartHTTPServer.
Definition at line 495 of file httpserver.cpp.
void StopHTTPServer | ( | ) |
Stop HTTP server.
Definition at line 518 of file httpserver.cpp.
|
static |
Event dispatcher thread.
Definition at line 349 of file httpserver.cpp.
void UnregisterHTTPHandler | ( | const std::string & | prefix, |
bool | exactMatch | ||
) |
Unregister handler for prefix.
Definition at line 760 of file httpserver.cpp.
void UpdateHTTPServerLogging | ( | bool | enable | ) |
Change logging level for libevent.
Definition at line 484 of file httpserver.cpp.
|
static |
Bound listening sockets.
Definition at line 152 of file httpserver.cpp.
|
static |
|
static |
HTTP server.
Definition at line 143 of file httpserver.cpp.
|
static |
Handlers for (sub)paths.
Definition at line 149 of file httpserver.cpp.
|
static |
Track active requests.
Definition at line 207 of file httpserver.cpp.
|
static |
Definition at line 492 of file httpserver.cpp.
|
static |
Definition at line 493 of file httpserver.cpp.
|
static |
Work queue for handling longer requests off the event loop thread.
Definition at line 147 of file httpserver.cpp.
|
static |
Maximum size of http request (request line + headers)
Definition at line 48 of file httpserver.cpp.
|
static |
List of subnets to allow RPC connections from.
Definition at line 145 of file httpserver.cpp.