CCF
Loading...
Searching...
No Matches
endpoint_registry.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
6#include "ccf/endpoint.h"
8#include "ccf/receipt.h"
9#include "ccf/rpc_context.h"
10#include "ccf/tx.h"
11
12#include <charconv>
13#include <functional>
14#include <llhttp/llhttp.h>
15#include <nlohmann/json.hpp>
16#include <regex>
17#include <set>
18
19namespace ccf
20{
21 struct AbstractNodeContext;
22}
23
24namespace ccf::kv
25{
26 class Consensus;
27 class TxHistory;
28}
29
30namespace ccf::endpoints
31{
33 {
34 std::regex template_regex;
35 std::vector<std::string> template_component_names;
36
37 static std::optional<PathTemplateSpec> parse(const std::string_view& uri);
38 };
39
46
48 {
49 std::string method;
50 // This contains the path template against which the request matched. For
51 // instance `/user/{user_id}` rather than `/user/Bob`. This should be safe
52 // to log, though doing so still reveals (to anyone with stdout access)
53 // exactly which endpoints were executed and when.
54 std::string dispatch_path;
55 int status = 0;
56 std::chrono::milliseconds exec_time{0};
57 size_t attempts = 0;
58 };
59
61 {
62 std::string method;
63 int status = 0;
64 };
65
67 CommandEndpointContext& ctx, const TxID& tx_id);
68
69 // Builds a TxReceiptImpl for a committed transaction. Returns nullptr
70 // and sets an error on rpc_ctx if the receipt cannot be constructed.
73
74 template <typename T>
75 inline bool get_path_param(
76 const ccf::PathParams& params,
77 const std::string& param_name,
78 T& value,
79 std::string& error)
80 {
81 const auto it = params.find(param_name);
82 if (it == params.end())
83 {
84 error = fmt::format("No parameter named '{}' in path", param_name);
85 return false;
86 }
87
88 const auto param_s = it->second;
89 const auto [p, ec] =
90 std::from_chars(param_s.data(), param_s.data() + param_s.size(), value);
91 if (ec != std::errc())
92 {
93 error = fmt::format(
94 "Unable to parse path parameter '{}' as a {}", param_s, param_name);
95 return false;
96 }
97
98 return true;
99 }
100
101 template <>
102 inline bool get_path_param(
103 const ccf::PathParams& params,
104 const std::string& param_name,
105 std::string& value,
106 std::string& error)
107 {
108 const auto it = params.find(param_name);
109 if (it == params.end())
110 {
111 error = fmt::format("No parameter named '{}' in path", param_name);
112 return false;
113 }
114
115 value = it->second;
116 return true;
117 }
118
128 {
129 public:
130 enum class ReadWrite : uint8_t
131 {
132 Read,
133 Write
134 };
135
136 const std::string method_prefix;
137
139 {
140 std::string title = "Empty title";
141 std::string description = "Empty description";
142 std::string document_version = "0.0.1";
144
145 template <typename T>
147 const ccf::PathParams& params,
148 const std::string& param_name,
149 T& value,
150 std::string& error)
151 {
152 return ccf::endpoints::get_path_param<T>(
153 params, param_name, value, error);
154 }
155
156 template <>
158 const ccf::PathParams& params,
159 const std::string& param_name,
160 std::string& value,
161 std::string& error)
162 {
163 return ccf::endpoints::get_path_param(params, param_name, value, error);
164 }
165
166 protected:
168 std::map<std::string, std::map<RESTVerb, EndpointPtr>>
170 std::map<
171 std::string,
172 std::map<RESTVerb, std::shared_ptr<PathTemplatedEndpoint>>>
174
177
178 public:
179 EndpointRegistry(std::string method_prefix_) :
180 method_prefix(std::move(method_prefix_))
181 {}
182
183 ~EndpointRegistry() override = default;
184
198 virtual Endpoint make_endpoint(
199 const std::string& method,
200 RESTVerb verb,
201 const EndpointFunction& f,
202 const AuthnPolicies& ap);
203
207 const std::string& method,
208 RESTVerb verb,
210 const AuthnPolicies& ap);
211
218 const std::string& method,
219 RESTVerb verb,
221 const AuthnPolicies& ap);
222
229 void install(Endpoint& endpoint) override;
230
239 void set_default(EndpointFunction f, const AuthnPolicies& ap);
240
247 virtual void build_api(
248 nlohmann::json& document, [[maybe_unused]] ccf::kv::ReadOnlyTx& tx);
249
250 virtual void init_handlers();
251
253 [[maybe_unused]] ccf::kv::Tx& tx, ccf::RpcContext& rpc_ctx);
254
255 virtual void execute_endpoint(
257
260
261 virtual std::set<RESTVerb> get_allowed_verbs(
262 [[maybe_unused]] ccf::kv::Tx& tx, const ccf::RpcContext& rpc_ctx);
263
264 virtual bool request_needs_root(const ccf::RpcContext& rpc_ctx);
265
267 const std::string& path,
268 const std::vector<EndpointDefinitionPtr>& matches);
269
270 virtual void tick([[maybe_unused]] std::chrono::milliseconds duration);
271
273
275
276 // Override these methods to log or report request metrics.
280
284
285 [[nodiscard]] virtual bool apply_uncommitted_tx_backpressure() const
286 {
287 return true;
288 }
289 };
290}
Definition rest_verb.h:45
Describes the currently executing RPC.
Definition rpc_context.h:58
Definition endpoint_registry.h:128
virtual void execute_endpoint_locally_committed(EndpointDefinitionPtr e, CommandEndpointContext &ctx, const TxID &tx_id)
Definition endpoint_registry.cpp:567
virtual void handle_event_request_completed(const ccf::endpoints::RequestCompletedEvent &event)
Definition endpoint_registry.h:277
std::map< std::string, std::map< RESTVerb, EndpointPtr > > fully_qualified_endpoints
Definition endpoint_registry.h:169
const std::string method_prefix
Definition endpoint_registry.h:136
~EndpointRegistry() override=default
virtual void tick(std::chrono::milliseconds duration)
Definition endpoint_registry.cpp:641
bool get_path_param(const ccf::PathParams &params, const std::string &param_name, std::string &value, std::string &error)
Definition endpoint_registry.h:157
virtual void report_ambiguous_templated_path(const std::string &path, const std::vector< EndpointDefinitionPtr > &matches)
Definition endpoint_registry.cpp:620
virtual void init_handlers()
Definition endpoint_registry.cpp:471
virtual Endpoint make_endpoint(const std::string &method, RESTVerb verb, const EndpointFunction &f, const AuthnPolicies &ap)
Definition endpoint_registry.cpp:282
struct ccf::endpoints::EndpointRegistry::OpenApiInfo openapi_info
std::map< std::string, std::map< RESTVerb, std::shared_ptr< PathTemplatedEndpoint > > > templated_endpoints
Definition endpoint_registry.h:173
void set_consensus(ccf::kv::Consensus *c)
Definition endpoint_registry.cpp:643
virtual void execute_endpoint(EndpointDefinitionPtr e, EndpointContext &ctx)
Definition endpoint_registry.cpp:553
void set_default(EndpointFunction f, const AuthnPolicies &ap)
Definition endpoint_registry.cpp:373
virtual EndpointDefinitionPtr find_endpoint(ccf::kv::Tx &tx, ccf::RpcContext &rpc_ctx)
Definition endpoint_registry.cpp:473
virtual bool request_needs_root(const ccf::RpcContext &rpc_ctx)
Definition endpoint_registry.cpp:614
virtual void handle_event_dispatch_failed(const ccf::endpoints::DispatchFailedEvent &event)
Definition endpoint_registry.h:281
EndpointPtr default_endpoint
Definition endpoint_registry.h:167
bool get_path_param(const ccf::PathParams &params, const std::string &param_name, T &value, std::string &error)
Definition endpoint_registry.h:146
virtual Endpoint make_command_endpoint(const std::string &method, RESTVerb verb, const CommandEndpointFunction &f, const AuthnPolicies &ap)
Definition endpoint_registry.cpp:332
virtual Endpoint make_read_only_endpoint(const std::string &method, RESTVerb verb, const ReadOnlyEndpointFunction &f, const AuthnPolicies &ap)
Definition endpoint_registry.cpp:313
ccf::kv::TxHistory * history
Definition endpoint_registry.h:176
virtual void build_api(nlohmann::json &document, ccf::kv::ReadOnlyTx &tx)
Definition endpoint_registry.cpp:383
ReadWrite
Definition endpoint_registry.h:131
void set_history(ccf::kv::TxHistory *h)
Definition endpoint_registry.cpp:648
virtual bool apply_uncommitted_tx_backpressure() const
Definition endpoint_registry.h:285
virtual std::set< RESTVerb > get_allowed_verbs(ccf::kv::Tx &tx, const ccf::RpcContext &rpc_ctx)
Definition endpoint_registry.cpp:582
void install(Endpoint &endpoint) override
Definition endpoint_registry.cpp:344
EndpointRegistry(std::string method_prefix_)
Definition endpoint_registry.h:179
Definition kv_types.h:367
Definition tx.h:159
Definition kv_types.h:332
Definition tx.h:200
Definition endpoint.h:17
void default_locally_committed_func(CommandEndpointContext &ctx, const TxID &tx_id)
Definition endpoint_registry.cpp:202
std::function< void(CommandEndpointContext &args)> CommandEndpointFunction
Definition endpoint_context.h:55
std::function< void(ReadOnlyEndpointContext &args)> ReadOnlyEndpointFunction
Definition endpoint_context.h:96
std::shared_ptr< const Endpoint > EndpointPtr
Definition endpoint.h:496
bool get_path_param(const ccf::PathParams &params, const std::string &param_name, T &value, std::string &error)
Definition endpoint_registry.h:75
ccf::TxReceiptImplPtr build_receipt_for_committed_tx(ccf::AbstractNodeContext &context, CommittedTxInfo &info)
Definition endpoint_registry.cpp:208
std::shared_ptr< const EndpointDefinition > EndpointDefinitionPtr
Definition endpoint.h:240
std::function< void(EndpointContext &args)> EndpointFunction
Definition endpoint_context.h:66
Definition app_interface.h:18
Definition app_interface.h:13
std::map< std::string, std::string, std::less<> > PathParams
Definition rpc_context.h:54
std::vector< std::shared_ptr< AuthnPolicy > > AuthnPolicies
Definition authentication_types.h:47
std::shared_ptr< TxReceiptImpl > TxReceiptImplPtr
Definition receipt.h:133
@ error
Definition tls_session.h:23
Definition consensus_types.h:23
STL namespace.
Definition node_context.h:12
Definition tx_id.h:44
Definition endpoint_context.h:27
Definition endpoint_context.h:72
Definition endpoint_registry.h:61
int status
Definition endpoint_registry.h:63
std::string method
Definition endpoint_registry.h:62
Definition endpoint_context.h:58
Definition endpoint_registry.h:139
std::string document_version
Definition endpoint_registry.h:142
std::string title
Definition endpoint_registry.h:140
std::string description
Definition endpoint_registry.h:141
Definition endpoint.h:268
Definition endpoint.h:259
Definition endpoint_registry.h:33
std::regex template_regex
Definition endpoint_registry.h:34
std::vector< std::string > template_component_names
Definition endpoint_registry.h:35
static std::optional< PathTemplateSpec > parse(const std::string_view &uri)
Definition endpoint_registry.cpp:136
Definition endpoint_registry.h:41
PathTemplatedEndpoint(const Endpoint &e)
Definition endpoint_registry.h:42
PathTemplateSpec spec
Definition endpoint_registry.h:44
Definition endpoint_registry.h:48
std::string dispatch_path
Definition endpoint_registry.h:54
int status
Definition endpoint_registry.h:55
std::string method
Definition endpoint_registry.h:49
std::chrono::milliseconds exec_time
Definition endpoint_registry.h:56
size_t attempts
Definition endpoint_registry.h:57