Bitcoin ABC  0.26.3
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 <common/system.h>
11 #include <rpc/command.h>
12 #include <rpc/request.h>
13 #include <rpc/util.h>
14 #include <rwcollection.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 ArgsManager;
26 class CRPCCommand;
27 
28 namespace RPCServerSignals {
29 void OnStarted(std::function<void()> slot);
30 void OnStopped(std::function<void()> slot);
31 } // namespace RPCServerSignals
32 
33 class Config;
34 
35 typedef std::map<std::string, std::unique_ptr<RPCCommand>> RPCCommandMap;
36 
40 class RPCServer {
41 private:
43 
44 public:
45  RPCServer() {}
46 
47  RPCServer(const RPCServer &) = delete;
48  RPCServer &operator=(const RPCServer &) = delete;
49 
54  UniValue ExecuteCommand(const Config &config,
55  const JSONRPCRequest &request) const;
56 
60  void RegisterCommand(std::unique_ptr<RPCCommand> command);
61 };
62 
66 bool IsRPCRunning();
67 
70 
75 void SetRPCWarmupStatus(const std::string &newStatus);
76 
81 
85 bool RPCIsInWarmup(std::string *outStatus);
86 
92 class RPCTimerBase {
93 public:
94  virtual ~RPCTimerBase() {}
95 };
96 
101 public:
102  virtual ~RPCTimerInterface() {}
103 
107  virtual const char *Name() = 0;
108 
119  virtual RPCTimerBase *NewTimer(std::function<void()> &func,
120  int64_t millis) = 0;
121 };
122 
127 
132 
137 
142 void RPCRunLater(const std::string &name, std::function<void()> func,
143  int64_t nSeconds);
144 
146 
147 class CRPCCommand {
148 public:
152  using Actor =
153  std::function<bool(const Config &config, const JSONRPCRequest &request,
154  UniValue &result, bool last_handler)>;
155 
157  CRPCCommand(std::string _category, std::string _name, Actor _actor,
158  std::vector<std::pair<std::string, bool>> _args,
159  intptr_t _unique_id)
160  : category(std::move(_category)), name(std::move(_name)),
161  actor(std::move(_actor)), argNames(std::move(_args)),
162  unique_id(_unique_id) {}
163 
165  CRPCCommand(std::string _category, RpcMethodFnType _fn)
166  : CRPCCommand(
167  _category, _fn().m_name,
168  [_fn](const Config &config, const JSONRPCRequest &request,
169  UniValue &result, bool) {
170  result = _fn().HandleRequest(config, request);
171  return true;
172  },
173  _fn().GetArgNames(), intptr_t(_fn)) {}
174 
175  std::string category;
176  std::string name;
187  std::vector<std::pair<std::string, bool>> argNames;
188  intptr_t unique_id;
189 };
190 
194 class CRPCTable {
195 private:
196  std::map<std::string, std::vector<const CRPCCommand *>> mapCommands;
197 
198 public:
199  CRPCTable();
200  std::string help(const Config &config, const std::string &name,
201  const JSONRPCRequest &helpreq) const;
202 
209  UniValue execute(const Config &config, const JSONRPCRequest &request) const;
210 
215  std::vector<std::string> listCommands() const;
216 
221  UniValue dumpArgMap(const Config &config,
222  const JSONRPCRequest &request) const;
223 
236  void appendCommand(const std::string &name, const CRPCCommand *pcmd);
237  bool removeCommand(const std::string &name, const CRPCCommand *pcmd);
238 };
239 
240 bool IsDeprecatedRPCEnabled(const ArgsManager &args, const std::string &method);
241 
242 extern CRPCTable tableRPC;
243 
244 void StartRPC();
245 void InterruptRPC();
246 void StopRPC();
247 std::string JSONRPCExecBatch(const Config &config, RPCServer &rpcServer,
248  const JSONRPCRequest &req, const UniValue &vReq);
249 
254 
255 #endif // BITCOIN_RPC_SERVER_H
std::string category
Definition: server.h:175
intptr_t unique_id
Definition: server.h:188
std::vector< std::pair< std::string, bool > > argNames
List of method arguments and whether they are named-only.
Definition: server.h:187
std::string name
Definition: server.h:176
CRPCCommand(std::string _category, std::string _name, Actor _actor, std::vector< std::pair< std::string, bool >> _args, intptr_t _unique_id)
Constructor taking Actor callback supporting multiple handlers.
Definition: server.h:157
CRPCCommand(std::string _category, RpcMethodFnType _fn)
Simplified constructor taking plain RpcMethodFnType function pointer.
Definition: server.h:165
Actor actor
Definition: server.h:177
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:154
RPC command dispatcher.
Definition: server.h:194
std::map< std::string, std::vector< const CRPCCommand * > > mapCommands
Definition: server.h:196
CRPCTable()
Definition: server.cpp:321
bool removeCommand(const std::string &name, const CRPCCommand *pcmd)
Definition: server.cpp:335
std::string help(const Config &config, const std::string &name, const JSONRPCRequest &helpreq) const
Definition: server.cpp:121
std::vector< std::string > listCommands() const
Returns a list of registered commands.
Definition: server.cpp:623
UniValue execute(const Config &config, const JSONRPCRequest &request) const
Execute a method.
Definition: server.cpp:582
void appendCommand(const std::string &name, const CRPCCommand *pcmd)
Appends a CRPCCommand to the dispatch table.
Definition: server.cpp:327
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:631
Definition: config.h:19
Class for registering and managing all RPC calls.
Definition: server.h:40
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:71
RWCollection< RPCCommandMap > commands
Definition: server.h:42
void RegisterCommand(std::unique_ptr< RPCCommand > command)
Register an RPC command.
Definition: server.cpp:100
RPCServer & operator=(const RPCServer &)=delete
RPCServer()
Definition: server.h:45
Opaque base class for timers returned by NewTimerFunc.
Definition: server.h:92
virtual ~RPCTimerBase()
Definition: server.h:94
RPC timer "driver".
Definition: server.h:100
virtual RPCTimerBase * NewTimer(std::function< void()> &func, int64_t millis)=0
Factory function for timers.
virtual ~RPCTimerInterface()
Definition: server.h:102
virtual const char * Name()=0
Implementation name.
void OnStarted(std::function< void()> slot)
Definition: server.cpp:113
void OnStopped(std::function< void()> slot)
Definition: server.cpp:117
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:47
void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface)
Set the factory function for timer, but only, if unset.
Definition: server.cpp:648
void SetRPCWarmupFinished()
Mark warmup as done.
Definition: server.cpp:393
static const unsigned int DEFAULT_RPC_SERIALIZE_VERSION
Definition: server.h:23
bool IsDeprecatedRPCEnabled(const ArgsManager &args, const std::string &method)
Definition: server.cpp:407
void StartRPC()
Definition: server.cpp:348
void RPCUnsetTimerInterface(RPCTimerInterface *iface)
Unset factory function for timers.
Definition: server.cpp:658
void RPCRunLater(const std::string &name, std::function< void()> func, int64_t nSeconds)
Run func nSeconds from now.
Definition: server.cpp:664
bool RPCIsInWarmup(std::string *outStatus)
Returns the current warmup state.
Definition: server.cpp:399
std::string JSONRPCExecBatch(const Config &config, RPCServer &rpcServer, const JSONRPCRequest &req, const UniValue &vReq)
Definition: server.cpp:435
void StopRPC()
Definition: server.cpp:365
RPCHelpMan(*)() RpcMethodFnType
Definition: server.h:145
bool IsRPCRunning()
Query whether RPC is running.
Definition: server.cpp:378
int RPCSerializationFlags()
Retrieves any serialization flags requested in command line argument.
Definition: server.cpp:679
void InterruptRPC()
Definition: server.cpp:354
std::map< std::string, std::unique_ptr< RPCCommand > > RPCCommandMap
Definition: server.h:33
void SetRPCWarmupStatus(const std::string &newStatus)
Set the RPC warmup status.
Definition: server.cpp:388
CRPCTable tableRPC
Definition: server.cpp:683
void RPCSetTimerInterface(RPCTimerInterface *iface)
Set the factory function for timers.
Definition: server.cpp:654
void RpcInterruptionPoint()
Throw JSONRPCError if RPC is not running.
Definition: server.cpp:382