@ -15,9 +15,9 @@
# include <netbase.h>
# include <node/interface_ui.h>
# include <rpc/protocol.h> // For HTTP status codes
# include <shutdown.h>
# include <sync.h>
# include <util/check.h>
# include <util/signalinterrupt.h>
# include <util/strencodings.h>
# include <util/threadnames.h>
# include <util/translation.h>
@ -284,7 +284,7 @@ static void http_request_cb(struct evhttp_request* req, void* arg)
}
}
}
std : : unique_ptr < HTTPRequest > hreq ( new HTTPRequest ( req ) ) ;
auto hreq { std : : make_unique < HTTPRequest > ( req , * static_cast < const util : : SignalInterrupt * > ( arg ) ) } ;
// Early address-based allow check
if ( ! ClientAllowed ( hreq - > GetPeer ( ) ) ) {
@ -425,7 +425,7 @@ static void libevent_log_cb(int severity, const char *msg)
LogPrintLevel ( BCLog : : LIBEVENT , level , " %s \n " , msg ) ;
}
bool InitHTTPServer ( )
bool InitHTTPServer ( const util : : SignalInterrupt & interrupt )
{
if ( ! InitHTTPAllowList ( ) )
return false ;
@ -454,7 +454,7 @@ bool InitHTTPServer()
evhttp_set_timeout ( http , gArgs . GetIntArg ( " -rpcservertimeout " , DEFAULT_HTTP_SERVER_TIMEOUT ) ) ;
evhttp_set_max_headers_size ( http , MAX_HEADERS_SIZE ) ;
evhttp_set_max_body_size ( http , MAX_SIZE ) ;
evhttp_set_gencb ( http , http_request_cb , nullptr ) ;
evhttp_set_gencb ( http , http_request_cb , ( void * ) & interrupt ) ;
if ( ! HTTPBindAddresses ( http ) ) {
LogPrintf ( " Unable to bind any endpoint for RPC server \n " ) ;
@ -579,7 +579,8 @@ void HTTPEvent::trigger(struct timeval* tv)
else
evtimer_add ( ev , tv ) ; // trigger after timeval passed
}
HTTPRequest : : HTTPRequest ( struct evhttp_request * _req , bool _replySent ) : req ( _req ) , replySent ( _replySent )
HTTPRequest : : HTTPRequest ( struct evhttp_request * _req , const util : : SignalInterrupt & interrupt , bool _replySent )
: req ( _req ) , m_interrupt ( interrupt ) , replySent ( _replySent )
{
}
@ -639,7 +640,7 @@ void HTTPRequest::WriteHeader(const std::string& hdr, const std::string& value)
void HTTPRequest : : WriteReply ( int nStatus , const std : : string & strReply )
{
assert ( ! replySent & & req ) ;
if ( ShutdownRequested( ) ) {
if ( m_interrupt ) {
WriteHeader ( " Connection " , " close " ) ;
}
// Send event to main http thread to send reply message