Bitcoin ABC  0.29.2
P2P Digital Currency
server.h
Go to the documentation of this file.
1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2016 The Bitcoin Core developers
3 // Copyright (c) 2017-2019 The Bitcoin developers
4 // Distributed under the MIT software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #ifndef BITCOIN_RPC_SERVER_H
8 #define BITCOIN_RPC_SERVER_H
9 
10 #include <rpc/command.h>
11 #include <rpc/request.h>
12 #include <rpc/util.h>
13 #include <rwcollection.h>
14 #include <util/system.h>
15 
16 #include <univalue.h>
17 
18 #include <cstdint>
19 #include <functional>
20 #include <map>
21 #include <string>
22 
23 static const unsigned int DEFAULT_RPC_SERIALIZE_VERSION = 1;
24 
25 class CRPCCommand;
26 
27 namespace RPCServerSignals {
28 void OnStarted(std::function<void()> slot);
29 void OnStopped(std::function<void()> slot);
30 } // namespace RPCServerSignals
31 
32 class Config;
33 
34 typedef std::map<std::string, std::unique_ptr<RPCCommand>> RPCCommandMap;
35 
39 class RPCServer {
40 private:
42 
43 public:
44  RPCServer() {}
45 
46  RPCServer(const RPCServer &) = delete;
47  RPCServer &operator=(const RPCServer &) = delete;
48 
53  UniValue ExecuteCommand(const Config &config,
54  const JSONRPCRequest &request) const;
55 
59  void RegisterCommand(std::unique_ptr<RPCCommand> command);
60 };
61 
65 bool IsRPCRunning();
66 
69 
74 void SetRPCWarmupStatus(const std::string &newStatus);
75 
80 
84 bool RPCIsInWarmup(std::string *outStatus);
85 
91 class RPCTimerBase {
92 public:
93  virtual ~RPCTimerBase() {}
94 };
95 
100 public:
101  virtual ~RPCTimerInterface() {}
102 
106  virtual const char *Name() = 0;
107 
118  virtual RPCTimerBase *NewTimer(std::function<void()> &func,
119  int64_t millis) = 0;
120 };
121 
126 
131 
136 
141 void RPCRunLater(const std::string &name, std::function<void()> func,
142  int64_t nSeconds);
143 
145 
146 class CRPCCommand {
147 public:
151  using Actor =
152  std::function<bool(const Config &config, const JSONRPCRequest &request,
153  UniValue &result, bool last_handler)>;
154 
156  CRPCCommand(std::string _category, std::string _name, Actor _actor,
157  std::vector<std::string> _args, intptr_t _unique_id)
158  : category(std::move(_category)), name(std::move(_name)),
159  actor(std::move(_actor)), argNames(std::move(_args)),
160  unique_id(_unique_id) {}
161 
163  CRPCCommand(std::string _category, RpcMethodFnType _fn)
164  : CRPCCommand(
165  _category, _fn().m_name,
166  [_fn](const Config &config, const JSONRPCRequest &request,
167  UniValue &result, bool) {
168  result = _fn().HandleRequest(config, request);
169  return true;
170  },
171  _fn().GetArgNames(), intptr_t(_fn)) {}
172 
173  std::string category;
174  std::string name;
176  std::vector<std::string> argNames;
177  intptr_t unique_id;
178 };
179 
183 class CRPCTable {
184 private:
185  std::map<std::string, std::vector<const CRPCCommand *>> mapCommands;
186 
187 public:
188  CRPCTable();
189  std::string help(const Config &config, const std::string &name,
190  const JSONRPCRequest &helpreq) const;
191 
198  UniValue execute(const Config &config, const JSONRPCRequest &request) const;
199 
204  std::vector<std::string> listCommands() const;
205 
210  UniValue dumpArgMap(const Config &config,
211  const JSONRPCRequest &request) const;
212 
225  void appendCommand(const std::string &name, const CRPCCommand *pcmd);
226  bool removeCommand(const std::string &name, const CRPCCommand *pcmd);
227 };
228 
229 bool IsDeprecatedRPCEnabled(const ArgsManager &args, const std::string &method);
230 
231 extern CRPCTable tableRPC;
232 
233 void StartRPC();
234 void InterruptRPC();
235 void StopRPC();
236 std::string JSONRPCExecBatch(const Config &config, RPCServer &rpcServer,
237  const JSONRPCRequest &req, const UniValue &vReq);
238 
243 
244 #endif // BITCOIN_RPC_SERVER_H
std::vector< std::string > argNames
Definition: server.h:176
std::string category
Definition: server.h:173
intptr_t unique_id
Definition: server.h:177
std::string name
Definition: server.h:174
CRPCCommand(std::string _category, RpcMethodFnType _fn)
Simplified constructor taking plain RpcMethodFnType function pointer.
Definition: server.h:163
Actor actor
Definition: server.h:175
std::function< bool(const Config &config, const JSONRPCRequest &request, UniValue &result, bool last_handler)> Actor
RPC method handler reading request and assigning result.
Definition: server.h:153
CRPCCommand(std::string _category, std::string _name, Actor _actor, std::vector< std::string > _args, intptr_t _unique_id)
Constructor taking Actor callback supporting multiple handlers.
Definition: server.h:156
RPC command dispatcher.
Definition: server.h:183
std::map< std::string, std::vector< const CRPCCommand * > > mapCommands
Definition: server.h:185
CRPCTable()
Definition: server.cpp:324
bool removeCommand(const std::string &name, const CRPCCommand *pcmd)
Definition: server.cpp:338
std::string help(const Config &config, const std::string &name, const JSONRPCRequest &helpreq) const
Definition: server.cpp:119
std::vector< std::string > listCommands() const
Returns a list of registered commands.
Definition: server.cpp:550
UniValue execute(const Config &config, const JSONRPCRequest &request) const
Execute a method.
Definition: server.cpp:511
void appendCommand(const std::string &name, const CRPCCommand *pcmd)
Appends a CRPCCommand to the dispatch table.
Definition: server.cpp:330
UniValue dumpArgMap(const Config &config, const JSONRPCRequest &request) const
Return all named arguments that need to be converted by the client from string to another JSON type.
Definition: server.cpp:558
Definition: config.h:17
Class for registering and managing all RPC calls.
Definition: server.h:39
RPCServer(const RPCServer &)=delete
UniValue ExecuteCommand(const Config &config, const JSONRPCRequest &request) const
Attempts to execute an RPC command from the given request.
Definition: server.cpp:69
RWCollection< RPCCommandMap > commands
Definition: server.h:41
void RegisterCommand(std::unique_ptr< RPCCommand > command)
Register an RPC command.
Definition: server.cpp:98
RPCServer & operator=(const RPCServer &)=delete
RPCServer()
Definition: server.h:44
Opaque base class for timers returned by NewTimerFunc.
Definition: server.h:91
virtual ~RPCTimerBase()
Definition: server.h:93
RPC timer "driver".
Definition: server.h:99
virtual RPCTimerBase * NewTimer(std::function< void()> &func, int64_t millis)=0
Factory function for timers.
virtual ~RPCTimerInterface()
Definition: server.h:101
virtual const char * Name()=0
Implementation name.
void OnStarted(std::function< void()> slot)
Definition: server.cpp:111
void OnStopped(std::function< void()> slot)
Definition: server.cpp:115
Implement std::hash so RCUPtr can be used as a key for maps or sets.
Definition: rcu.h:257
const char * name
Definition: rest.cpp:48
void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface)
Set the factory function for timer, but only, if unset.
Definition: server.cpp:575
void SetRPCWarmupFinished()
Mark warmup as done.
Definition: server.cpp:396
static const unsigned int DEFAULT_RPC_SERIALIZE_VERSION
Definition: server.h:23
bool IsDeprecatedRPCEnabled(const ArgsManager &args, const std::string &method)
Definition: server.cpp:410
void StartRPC()
Definition: server.cpp:351
void RPCUnsetTimerInterface(RPCTimerInterface *iface)
Unset factory function for timers.
Definition: server.cpp:585
void RPCRunLater(const std::string &name, std::function< void()> func, int64_t nSeconds)
Run func nSeconds from now.
Definition: server.cpp:591
bool RPCIsInWarmup(std::string *outStatus)
Returns the current warmup state.
Definition: server.cpp:402
std::string JSONRPCExecBatch(const Config &config, RPCServer &rpcServer, const JSONRPCRequest &req, const UniValue &vReq)
Definition: server.cpp:438
void StopRPC()
Definition: server.cpp:368
RPCHelpMan(*)() RpcMethodFnType
Definition: server.h:144
bool IsRPCRunning()
Query whether RPC is running.
Definition: server.cpp:381
int RPCSerializationFlags()
Retrieves any serialization flags requested in command line argument.
Definition: server.cpp:606
void InterruptRPC()
Definition: server.cpp:357
std::map< std::string, std::unique_ptr< RPCCommand > > RPCCommandMap
Definition: server.h:32
void SetRPCWarmupStatus(const std::string &newStatus)
Set the RPC warmup status.
Definition: server.cpp:391
CRPCTable tableRPC
Definition: server.cpp:610
void RPCSetTimerInterface(RPCTimerInterface *iface)
Set the factory function for timers.
Definition: server.cpp:581
void RpcInterruptionPoint()
Throw JSONRPCError if RPC is not running.
Definition: server.cpp:385