|
|
|
@ -17,10 +17,9 @@
@@ -17,10 +17,9 @@
|
|
|
|
|
#include <boost/filesystem/operations.hpp> |
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
|
|
#include <event2/event.h> |
|
|
|
|
#include <event2/http.h> |
|
|
|
|
#include <event2/buffer.h> |
|
|
|
|
#include <event2/keyvalq_struct.h> |
|
|
|
|
#include "support/events.h" |
|
|
|
|
|
|
|
|
|
#include <univalue.h> |
|
|
|
|
|
|
|
|
@ -190,23 +189,19 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
@@ -190,23 +189,19 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
|
|
|
|
|
std::string host = GetArg("-rpcconnect", DEFAULT_RPCCONNECT); |
|
|
|
|
int port = GetArg("-rpcport", BaseParams().RPCPort()); |
|
|
|
|
|
|
|
|
|
// Create event base
|
|
|
|
|
struct event_base *base = event_base_new(); // TODO RAII
|
|
|
|
|
if (!base) |
|
|
|
|
throw std::runtime_error("cannot create event_base"); |
|
|
|
|
// Obtain event base
|
|
|
|
|
raii_event_base base = obtain_event_base(); |
|
|
|
|
|
|
|
|
|
// Synchronously look up hostname
|
|
|
|
|
struct evhttp_connection *evcon = evhttp_connection_base_new(base, NULL, host.c_str(), port); // TODO RAII
|
|
|
|
|
if (evcon == NULL) |
|
|
|
|
throw std::runtime_error("create connection failed"); |
|
|
|
|
evhttp_connection_set_timeout(evcon, GetArg("-rpcclienttimeout", DEFAULT_HTTP_CLIENT_TIMEOUT)); |
|
|
|
|
raii_evhttp_connection evcon = obtain_evhttp_connection_base(base.get(), host, port); |
|
|
|
|
evhttp_connection_set_timeout(evcon.get(), GetArg("-rpcclienttimeout", DEFAULT_HTTP_CLIENT_TIMEOUT)); |
|
|
|
|
|
|
|
|
|
HTTPReply response; |
|
|
|
|
struct evhttp_request *req = evhttp_request_new(http_request_done, (void*)&response); // TODO RAII
|
|
|
|
|
raii_evhttp_request req = obtain_evhttp_request(http_request_done, (void*)&response); |
|
|
|
|
if (req == NULL) |
|
|
|
|
throw std::runtime_error("create http request failed"); |
|
|
|
|
#if LIBEVENT_VERSION_NUMBER >= 0x02010300 |
|
|
|
|
evhttp_request_set_error_cb(req, http_error_cb); |
|
|
|
|
evhttp_request_set_error_cb(req.get(), http_error_cb); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// Get credentials
|
|
|
|
@ -223,7 +218,7 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
@@ -223,7 +218,7 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
|
|
|
|
|
strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct evkeyvalq *output_headers = evhttp_request_get_output_headers(req); |
|
|
|
|
struct evkeyvalq* output_headers = evhttp_request_get_output_headers(req.get()); |
|
|
|
|
assert(output_headers); |
|
|
|
|
evhttp_add_header(output_headers, "Host", host.c_str()); |
|
|
|
|
evhttp_add_header(output_headers, "Connection", "close"); |
|
|
|
@ -231,20 +226,17 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
@@ -231,20 +226,17 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
|
|
|
|
|
|
|
|
|
|
// Attach request data
|
|
|
|
|
std::string strRequest = JSONRPCRequestObj(strMethod, params, 1).write() + "\n"; |
|
|
|
|
struct evbuffer * output_buffer = evhttp_request_get_output_buffer(req); |
|
|
|
|
struct evbuffer* output_buffer = evhttp_request_get_output_buffer(req.get()); |
|
|
|
|
assert(output_buffer); |
|
|
|
|
evbuffer_add(output_buffer, strRequest.data(), strRequest.size()); |
|
|
|
|
|
|
|
|
|
int r = evhttp_make_request(evcon, req, EVHTTP_REQ_POST, "/"); |
|
|
|
|
int r = evhttp_make_request(evcon.get(), req.get(), EVHTTP_REQ_POST, "/"); |
|
|
|
|
req.release(); // ownership moved to evcon in above call
|
|
|
|
|
if (r != 0) { |
|
|
|
|
evhttp_connection_free(evcon); |
|
|
|
|
event_base_free(base); |
|
|
|
|
throw CConnectionFailed("send http request failed"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
event_base_dispatch(base); |
|
|
|
|
evhttp_connection_free(evcon); |
|
|
|
|
event_base_free(base); |
|
|
|
|
event_base_dispatch(base.get()); |
|
|
|
|
|
|
|
|
|
if (response.status == 0) |
|
|
|
|
throw CConnectionFailed(strprintf("couldn't connect to server: %s (code %d)\n(make sure server is running and you are connecting to the correct RPC port)", http_errorstring(response.error), response.error)); |
|
|
|
|