17
17
#include < boost/filesystem/operations.hpp>
18
18
#include < stdio.h>
19
19
20
- #include < event2/event.h>
21
- #include < event2/http.h>
22
20
#include < event2/buffer.h>
23
21
#include < event2/keyvalq_struct.h>
22
+ #include " support/events.h"
24
23
25
24
#include < univalue.h>
26
25
@@ -190,23 +189,19 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
190
189
std::string host = GetArg (" -rpcconnect" , DEFAULT_RPCCONNECT);
191
190
int port = GetArg (" -rpcport" , BaseParams ().RPCPort ());
192
191
193
- // Create event base
194
- struct event_base *base = event_base_new (); // TODO RAII
195
- if (!base)
196
- throw std::runtime_error (" cannot create event_base" );
192
+ // Obtain event base
193
+ raii_event_base base = obtain_event_base ();
197
194
198
195
// Synchronously look up hostname
199
- struct evhttp_connection *evcon = evhttp_connection_base_new (base, NULL , host.c_str (), port); // TODO RAII
200
- if (evcon == NULL )
201
- throw std::runtime_error (" create connection failed" );
202
- evhttp_connection_set_timeout (evcon, GetArg (" -rpcclienttimeout" , DEFAULT_HTTP_CLIENT_TIMEOUT));
196
+ raii_evhttp_connection evcon = obtain_evhttp_connection_base (base.get (), host, port);
197
+ evhttp_connection_set_timeout (evcon.get (), GetArg (" -rpcclienttimeout" , DEFAULT_HTTP_CLIENT_TIMEOUT));
203
198
204
199
HTTPReply response;
205
- struct evhttp_request * req = evhttp_request_new (http_request_done, (void *)&response); // TODO RAII
200
+ raii_evhttp_request req = obtain_evhttp_request (http_request_done, (void *)&response);
206
201
if (req == NULL )
207
202
throw std::runtime_error (" create http request failed" );
208
203
#if LIBEVENT_VERSION_NUMBER >= 0x02010300
209
- evhttp_request_set_error_cb (req, http_error_cb);
204
+ evhttp_request_set_error_cb (req. get () , http_error_cb);
210
205
#endif
211
206
212
207
// Get credentials
@@ -223,28 +218,25 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
223
218
strRPCUserColonPass = mapArgs[" -rpcuser" ] + " :" + mapArgs[" -rpcpassword" ];
224
219
}
225
220
226
- struct evkeyvalq * output_headers = evhttp_request_get_output_headers (req);
221
+ struct evkeyvalq * output_headers = evhttp_request_get_output_headers (req. get () );
227
222
assert (output_headers);
228
223
evhttp_add_header (output_headers, " Host" , host.c_str ());
229
224
evhttp_add_header (output_headers, " Connection" , " close" );
230
225
evhttp_add_header (output_headers, " Authorization" , (std::string (" Basic " ) + EncodeBase64 (strRPCUserColonPass)).c_str ());
231
226
232
227
// Attach request data
233
228
std::string strRequest = JSONRPCRequestObj (strMethod, params, 1 ).write () + " \n " ;
234
- struct evbuffer * output_buffer = evhttp_request_get_output_buffer (req);
229
+ struct evbuffer * output_buffer = evhttp_request_get_output_buffer (req. get () );
235
230
assert (output_buffer);
236
231
evbuffer_add (output_buffer, strRequest.data (), strRequest.size ());
237
232
238
- int r = evhttp_make_request (evcon, req, EVHTTP_REQ_POST, " /" );
233
+ int r = evhttp_make_request (evcon.get (), req.get (), EVHTTP_REQ_POST, " /" );
234
+ req.release (); // ownership moved to evcon in above call
239
235
if (r != 0 ) {
240
- evhttp_connection_free (evcon);
241
- event_base_free (base);
242
236
throw CConnectionFailed (" send http request failed" );
243
237
}
244
238
245
- event_base_dispatch (base);
246
- evhttp_connection_free (evcon);
247
- event_base_free (base);
239
+ event_base_dispatch (base.get ());
248
240
249
241
if (response.status == 0 )
250
242
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 ));
0 commit comments