7 #ifndef _ANONCOINRPC_PROTOCOL_H_
8 #define _ANONCOINRPC_PROTOCOL_H_
14 #include <boost/iostreams/concepts.hpp>
15 #include <boost/iostreams/stream.hpp>
16 #include <boost/asio.hpp>
17 #include <boost/asio/ssl.hpp>
19 #include "json/json_spirit_reader_template.h"
20 #include "json/json_spirit_utils.h"
21 #include "json/json_spirit_writer_template.h"
78 template <
typename Protocol>
79 class SSLIOStreamDevice :
public boost::iostreams::device<boost::iostreams::bidirectional> {
87 void handshake(boost::asio::ssl::stream_base::handshake_type role)
93 std::streamsize
read(
char* s, std::streamsize n)
95 handshake(boost::asio::ssl::stream_base::server);
96 if (
fUseSSL)
return stream.read_some(boost::asio::buffer(s, n));
97 return stream.next_layer().read_some(boost::asio::buffer(s, n));
99 std::streamsize
write(
const char* s, std::streamsize n)
101 handshake(boost::asio::ssl::stream_base::client);
102 if (
fUseSSL)
return boost::asio::write(
stream, boost::asio::buffer(s, n));
103 return boost::asio::write(
stream.next_layer(), boost::asio::buffer(s, n));
105 bool connect(
const std::string& server,
const std::string& port)
107 boost::asio::ip::tcp::resolver resolver(
stream.get_io_service());
108 boost::asio::ip::tcp::resolver::query query(server.c_str(), port.c_str());
109 boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
110 boost::asio::ip::tcp::resolver::iterator end;
111 boost::system::error_code error = boost::asio::error::host_not_found;
112 while (error && endpoint_iterator != end)
114 stream.lowest_layer().close();
115 stream.lowest_layer().connect(*endpoint_iterator++, error);
125 boost::asio::ssl::stream<typename Protocol::socket>&
stream;
128 std::string
HTTPPost(
const std::string& strMsg,
const std::map<std::string,std::string>& mapRequestHeaders);
129 std::string
HTTPReply(
int nStatus,
const std::string& strMsg,
bool keepalive);
131 std::string& http_method, std::string& http_uri);
133 int ReadHTTPHeaders(std::basic_istream<char>& stream, std::map<std::string, std::string>& mapHeadersRet);
134 int ReadHTTPMessage(std::basic_istream<char>& stream, std::map<std::string, std::string>& mapHeadersRet,
135 std::string& strMessageRet,
int nProto);
136 std::string
JSONRPCRequest(
const std::string& strMethod,
const json_spirit::Array& params,
const json_spirit::Value&
id);
137 json_spirit::Object
JSONRPCReplyObj(
const json_spirit::Value& result,
const json_spirit::Value& error,
const json_spirit::Value&
id);
138 std::string
JSONRPCReply(
const json_spirit::Value& result,
const json_spirit::Value& error,
const json_spirit::Value&
id);
139 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)
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)