6 #ifndef _BITCOINRPC_PROTOCOL_H_
7 #define _BITCOINRPC_PROTOCOL_H_ 1
13 #include <boost/iostreams/concepts.hpp>
14 #include <boost/iostreams/stream.hpp>
15 #include <boost/asio.hpp>
16 #include <boost/asio/ssl.hpp>
18 #include "json/json_spirit_reader_template.h"
19 #include "json/json_spirit_utils.h"
20 #include "json/json_spirit_writer_template.h"
77 template <
typename Protocol>
78 class SSLIOStreamDevice :
public boost::iostreams::device<boost::iostreams::bidirectional> {
86 void handshake(boost::asio::ssl::stream_base::handshake_type role)
92 std::streamsize
read(
char* s, std::streamsize n)
94 handshake(boost::asio::ssl::stream_base::server);
95 if (
fUseSSL)
return stream.read_some(boost::asio::buffer(s, n));
96 return stream.next_layer().read_some(boost::asio::buffer(s, n));
98 std::streamsize
write(
const char* s, std::streamsize n)
100 handshake(boost::asio::ssl::stream_base::client);
101 if (
fUseSSL)
return boost::asio::write(
stream, boost::asio::buffer(s, n));
102 return boost::asio::write(
stream.next_layer(), boost::asio::buffer(s, n));
104 bool connect(
const std::string& server,
const std::string& port)
106 boost::asio::ip::tcp::resolver resolver(
stream.get_io_service());
107 boost::asio::ip::tcp::resolver::query query(server.c_str(), port.c_str());
108 boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
109 boost::asio::ip::tcp::resolver::iterator end;
110 boost::system::error_code
error = boost::asio::error::host_not_found;
111 while (error && endpoint_iterator != end)
113 stream.lowest_layer().close();
114 stream.lowest_layer().connect(*endpoint_iterator++, error);
124 boost::asio::ssl::stream<typename Protocol::socket>&
stream;
127 std::string
HTTPPost(
const std::string& strMsg,
const std::map<std::string,std::string>& mapRequestHeaders);
128 std::string
HTTPReply(
int nStatus,
const std::string& strMsg,
bool keepalive);
130 std::string& http_method, std::string& http_uri);
132 int ReadHTTPHeaders(std::basic_istream<char>& stream, std::map<std::string, std::string>& mapHeadersRet);
133 int ReadHTTPMessage(std::basic_istream<char>& stream, std::map<std::string, std::string>& mapHeadersRet,
134 std::string& strMessageRet,
int nProto);
135 std::string
JSONRPCRequest(
const std::string& strMethod,
const json_spirit::Array& params,
const json_spirit::Value&
id);
136 json_spirit::Object
JSONRPCReplyObj(
const json_spirit::Value& result,
const json_spirit::Value&
error,
const json_spirit::Value&
id);
137 std::string
JSONRPCReply(
const json_spirit::Value& result,
const json_spirit::Value&
error,
const json_spirit::Value&
id);
138 json_spirit::Object
JSONRPCError(
int code,
const std::string& message);
std::streamsize read(char *s, std::streamsize n)
int ReadHTTPHeaders(std::basic_istream< char > &stream, std::map< std::string, std::string > &mapHeadersRet)
json_spirit::Object JSONRPCReplyObj(const json_spirit::Value &result, const json_spirit::Value &error, const json_spirit::Value &id)
int ReadHTTPMessage(std::basic_istream< char > &stream, std::map< std::string, std::string > &mapHeadersRet, std::string &strMessageRet, int nProto)
bool ReadHTTPRequestLine(std::basic_istream< char > &stream, int &proto, std::string &http_method, std::string &http_uri)
std::string JSONRPCRequest(const std::string &strMethod, const json_spirit::Array ¶ms, const json_spirit::Value &id)
static bool error(const char *format)
std::string HTTPPost(const std::string &strMsg, const std::map< std::string, std::string > &mapRequestHeaders)
std::streamsize write(const char *s, std::streamsize n)
std::string JSONRPCReply(const json_spirit::Value &result, const json_spirit::Value &error, const json_spirit::Value &id)
std::string HTTPReply(int nStatus, const std::string &strMsg, bool keepalive)
boost::asio::ssl::stream< typename Protocol::socket > & stream
json_spirit::Object JSONRPCError(int code, const std::string &message)
void handshake(boost::asio::ssl::stream_base::handshake_type role)
SSLIOStreamDevice(boost::asio::ssl::stream< typename Protocol::socket > &streamIn, bool fUseSSLIn)
int ReadHTTPStatus(std::basic_istream< char > &stream, int &proto)
bool connect(const std::string &server, const std::string &port)