![]() |
Bitcoin Core
25.99.0
P2P Digital Currency
|
#include <httpserver.h>
#include <chainparamsbase.h>
#include <common/args.h>
#include <compat/compat.h>
#include <logging.h>
#include <netbase.h>
#include <node/interface_ui.h>
#include <rpc/protocol.h>
#include <shutdown.h>
#include <sync.h>
#include <util/strencodings.h>
#include <util/syscall_sandbox.h>
#include <util/threadnames.h>
#include <util/translation.h>
#include <condition_variable>
#include <cstdio>
#include <cstdlib>
#include <deque>
#include <memory>
#include <optional>
#include <string>
#include <unordered_set>
#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 |
Functions | |
static std::vector< HTTPPathHandler > pathHandlers | GUARDED_BY (g_httppathhandlers_mutex) |
static std::unordered_set< evhttp_request * > g_requests | GUARDED_BY (g_requests_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 () |
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 GlobalMutex | g_requests_mutex |
Track active requests. More... | |
static std::condition_variable | g_requests_cv |
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 159 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 504 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 670 of file httpserver.cpp.
|
static |
|
static |
|
static |
Callback to reject HTTP requests after shutdown.
Definition at line 290 of file httpserver.cpp.
|
static |
HTTP request callback.
Definition at line 212 of file httpserver.cpp.
|
static |
Bind HTTP server to specified addresses.
Definition at line 308 of file httpserver.cpp.
|
static |
|
static |
Simple wrapper to set thread name and run work queue.
Definition at line 350 of file httpserver.cpp.
|
static |
Initialize ACL list for HTTP server.
Definition at line 170 of file httpserver.cpp.
bool InitHTTPServer | ( | ) |
Initialize HTTP server.
Call this before RegisterHTTPHandler or EventBase().
Definition at line 378 of file httpserver.cpp.
void InterruptHTTPServer | ( | ) |
Interrupt HTTP server threads.
Definition at line 448 of file httpserver.cpp.
|
static |
libevent event log callback
Definition at line 358 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 697 of file httpserver.cpp.
std::string RequestMethodString | ( | HTTPRequest::RequestMethod | m | ) |
HTTP request method as string - use for logging only.
Definition at line 194 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 436 of file httpserver.cpp.
void StopHTTPServer | ( | ) |
Stop HTTP server.
Definition at line 460 of file httpserver.cpp.
|
static |
Event dispatcher thread.
Definition at line 297 of file httpserver.cpp.
void UnregisterHTTPHandler | ( | const std::string & | prefix, |
bool | exactMatch | ||
) |
Unregister handler for prefix.
Definition at line 704 of file httpserver.cpp.
void UpdateHTTPServerLogging | ( | bool | enable | ) |
Change logging level for libevent.
Definition at line 425 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 |
Definition at line 155 of file httpserver.cpp.
|
static |
Track active requests.
Definition at line 154 of file httpserver.cpp.
|
static |
Definition at line 433 of file httpserver.cpp.
|
static |
Definition at line 434 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.