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/rpc_context.h"
9#include "ccf/tx.h"
10
11#include <charconv>
12#include <functional>
13#include <llhttp/llhttp.h>
14#include <nlohmann/json.hpp>
15#include <regex>
16#include <set>
17
18namespace ccf::kv
19{
20 class Consensus;
21 class TxHistory;
22}
23
24namespace ccf::endpoints
25{
27 {
28 std::regex template_regex;
29 std::vector<std::string> template_component_names;
30
31 static std::optional<PathTemplateSpec> parse(const std::string_view& uri);
32 };
33
40
42 {
43 std::string method = "";
44 // This contains the path template against which the request matched. For
45 // instance `/user/{user_id}` rather than `/user/Bob`. This should be safe
46 // to log, though doing so still reveals (to anyone with stdout access)
47 // exactly which endpoints were executed and when.
48 std::string dispatch_path = "";
49 int status = 0;
50 std::chrono::milliseconds exec_time{0};
51 size_t attempts = 0;
52 };
53
55 {
56 std::string method = "";
57 int status = 0;
58 };
59
61 CommandEndpointContext& ctx, const TxID& tx_id);
62
63 template <typename T>
64 inline bool get_path_param(
65 const ccf::PathParams& params,
66 const std::string& param_name,
67 T& value,
68 std::string& error)
69 {
70 const auto it = params.find(param_name);
71 if (it == params.end())
72 {
73 error = fmt::format("No parameter named '{}' in path", param_name);
74 return false;
75 }
76
77 const auto param_s = it->second;
78 const auto [p, ec] =
79 std::from_chars(param_s.data(), param_s.data() + param_s.size(), value);
80 if (ec != std::errc())
81 {
82 error = fmt::format(
83 "Unable to parse path parameter '{}' as a {}", param_s, param_name);
84 return false;
85 }
86
87 return true;
88 }
89
90 template <>
91 inline bool get_path_param(
92 const ccf::PathParams& params,
93 const std::string& param_name,
94 std::string& value,
95 std::string& error)
96 {
97 const auto it = params.find(param_name);
98 if (it == params.end())
99 {
100 error = fmt::format("No parameter named '{}' in path", param_name);
101 return false;
102 }
103
104 value = it->second;
105 return true;
106 }
107
117 {
118 public:
120 {
122 Write
123 };
124
125 const std::string method_prefix;
126
128 {
129 std::string title = "Empty title";
130 std::string description = "Empty description";
131 std::string document_version = "0.0.1";
133
134 template <typename T>
136 const ccf::PathParams& params,
137 const std::string& param_name,
138 T& value,
139 std::string& error)
140 {
141 return ccf::endpoints::get_path_param<T>(
142 params, param_name, value, error);
143 }
144
145 template <>
147 const ccf::PathParams& params,
148 const std::string& param_name,
149 std::string& value,
150 std::string& error)
151 {
152 return ccf::endpoints::get_path_param(params, param_name, value, error);
153 }
154
155 protected:
157 std::map<std::string, std::map<RESTVerb, EndpointPtr>>
159 std::map<
160 std::string,
161 std::map<RESTVerb, std::shared_ptr<PathTemplatedEndpoint>>>
163
166
167 public:
168 EndpointRegistry(const std::string& method_prefix_) :
169 method_prefix(method_prefix_)
170 {}
171
172 virtual ~EndpointRegistry() {}
173
187 virtual Endpoint make_endpoint(
188 const std::string& method,
189 RESTVerb verb,
190 const EndpointFunction& f,
191 const AuthnPolicies& ap);
192
196 const std::string& method,
197 RESTVerb verb,
199 const AuthnPolicies& ap);
200
207 const std::string& method,
208 RESTVerb verb,
209 const EndpointFunction& f,
211 const AuthnPolicies& ap);
212
216 const std::string& method,
217 RESTVerb verb,
220 const AuthnPolicies& ap);
221
228 const std::string& method,
229 RESTVerb verb,
231 const AuthnPolicies& ap);
232
239 void install(Endpoint& endpoint) override;
240
249 void set_default(EndpointFunction f, const AuthnPolicies& ap);
250
257 virtual void build_api(nlohmann::json& document, ccf::kv::ReadOnlyTx&);
258
259 virtual void init_handlers();
260
262 ccf::kv::Tx&, ccf::RpcContext& rpc_ctx);
263
264 virtual void execute_endpoint(
266
269
270 virtual std::set<RESTVerb> get_allowed_verbs(
271 ccf::kv::Tx&, const ccf::RpcContext& rpc_ctx);
272
273 virtual bool request_needs_root(const ccf::RpcContext& rpc_ctx);
274
276 const std::string& path,
277 const std::vector<EndpointDefinitionPtr>& matches);
278
279 virtual void tick(std::chrono::milliseconds);
280
282
284
285 // Override these methods to log or report request metrics.
289
293
295 {
296 return true;
297 }
298 };
299}
Definition rest_verb.h:45
Describes the currently executing RPC.
Definition rpc_context.h:58
Definition endpoint_registry.h:117
virtual void execute_endpoint_locally_committed(EndpointDefinitionPtr e, CommandEndpointContext &ctx, const TxID &tx_id)
Definition endpoint_registry.cpp:513
virtual void handle_event_request_completed(const ccf::endpoints::RequestCompletedEvent &event)
Definition endpoint_registry.h:286
std::map< std::string, std::map< RESTVerb, EndpointPtr > > fully_qualified_endpoints
Definition endpoint_registry.h:158
const std::string method_prefix
Definition endpoint_registry.h:125
virtual std::set< RESTVerb > get_allowed_verbs(ccf::kv::Tx &, const ccf::RpcContext &rpc_ctx)
Definition endpoint_registry.cpp:528
virtual ~EndpointRegistry()
Definition endpoint_registry.h:172
EndpointRegistry(const std::string &method_prefix_)
Definition endpoint_registry.h:168
bool get_path_param(const ccf::PathParams &params, const std::string &param_name, std::string &value, std::string &error)
Definition endpoint_registry.h:146
virtual void report_ambiguous_templated_path(const std::string &path, const std::vector< EndpointDefinitionPtr > &matches)
Definition endpoint_registry.cpp:566
ReadWrite
Definition endpoint_registry.h:120
@ Read
Definition endpoint_registry.h:121
@ Write
Definition endpoint_registry.h:122
virtual Endpoint make_endpoint_with_local_commit_handler(const std::string &method, RESTVerb verb, const EndpointFunction &f, const LocallyCommittedEndpointFunction &l, const AuthnPolicies &ap)
Definition endpoint_registry.cpp:254
virtual void tick(std::chrono::milliseconds)
Definition endpoint_registry.cpp:587
virtual void init_handlers()
Definition endpoint_registry.cpp:417
virtual Endpoint make_endpoint(const std::string &method, RESTVerb verb, const EndpointFunction &f, const AuthnPolicies &ap)
Definition endpoint_registry.cpp:204
struct ccf::endpoints::EndpointRegistry::OpenApiInfo openapi_info
std::map< std::string, std::map< RESTVerb, std::shared_ptr< PathTemplatedEndpoint > > > templated_endpoints
Definition endpoint_registry.h:162
void set_consensus(ccf::kv::Consensus *c)
Definition endpoint_registry.cpp:589
virtual void execute_endpoint(EndpointDefinitionPtr e, EndpointContext &ctx)
Definition endpoint_registry.cpp:499
void set_default(EndpointFunction f, const AuthnPolicies &ap)
Definition endpoint_registry.cpp:319
virtual bool request_needs_root(const ccf::RpcContext &rpc_ctx)
Definition endpoint_registry.cpp:560
virtual void handle_event_dispatch_failed(const ccf::endpoints::DispatchFailedEvent &event)
Definition endpoint_registry.h:290
EndpointPtr default_endpoint
Definition endpoint_registry.h:156
virtual void build_api(nlohmann::json &document, ccf::kv::ReadOnlyTx &)
Definition endpoint_registry.cpp:329
bool get_path_param(const ccf::PathParams &params, const std::string &param_name, T &value, std::string &error)
Definition endpoint_registry.h:135
virtual Endpoint make_command_endpoint(const std::string &method, RESTVerb verb, const CommandEndpointFunction &f, const AuthnPolicies &ap)
Definition endpoint_registry.cpp:278
virtual Endpoint make_read_only_endpoint(const std::string &method, RESTVerb verb, const ReadOnlyEndpointFunction &f, const AuthnPolicies &ap)
Definition endpoint_registry.cpp:235
virtual Endpoint make_read_only_endpoint_with_local_commit_handler(const std::string &method, RESTVerb verb, const ReadOnlyEndpointFunction &f, const LocallyCommittedEndpointFunction &l, const AuthnPolicies &ap)
Definition endpoint_registry.cpp:266
ccf::kv::TxHistory * history
Definition endpoint_registry.h:165
virtual EndpointDefinitionPtr find_endpoint(ccf::kv::Tx &, ccf::RpcContext &rpc_ctx)
Definition endpoint_registry.cpp:419
void set_history(ccf::kv::TxHistory *h)
Definition endpoint_registry.cpp:594
virtual bool apply_uncommitted_tx_backpressure() const
Definition endpoint_registry.h:294
void install(Endpoint &endpoint) override
Definition endpoint_registry.cpp:290
Definition kv_types.h:436
Definition tx.h:160
Definition kv_types.h:368
Definition tx.h:201
Definition endpoint.h:16
void default_locally_committed_func(CommandEndpointContext &ctx, const TxID &tx_id)
Definition endpoint_registry.cpp:198
std::function< void(CommandEndpointContext &args)> CommandEndpointFunction
Definition endpoint_context.h:52
std::function< void(ReadOnlyEndpointContext &args)> ReadOnlyEndpointFunction
Definition endpoint_context.h:80
std::shared_ptr< const Endpoint > EndpointPtr
Definition endpoint.h:474
bool get_path_param(const ccf::PathParams &params, const std::string &param_name, T &value, std::string &error)
Definition endpoint_registry.h:64
std::function< void(CommandEndpointContext &ctx, const ccf::TxID &txid)> LocallyCommittedEndpointFunction
Definition endpoint_context.h:66
std::shared_ptr< const EndpointDefinition > EndpointDefinitionPtr
Definition endpoint.h:234
std::function< void(EndpointContext &args)> EndpointFunction
Definition endpoint_context.h:63
Definition app_interface.h:19
@ error
Definition tls_session.h:24
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
Definition consensus_types.h:23
Definition tx_id.h:44
Definition endpoint_context.h:24
Definition endpoint_registry.h:55
int status
Definition endpoint_registry.h:57
std::string method
Definition endpoint_registry.h:56
Definition endpoint_context.h:55
Definition endpoint_registry.h:128
std::string document_version
Definition endpoint_registry.h:131
std::string title
Definition endpoint_registry.h:129
std::string description
Definition endpoint_registry.h:130
Definition endpoint.h:260
Definition endpoint.h:253
Definition endpoint_registry.h:27
std::regex template_regex
Definition endpoint_registry.h:28
std::vector< std::string > template_component_names
Definition endpoint_registry.h:29
static std::optional< PathTemplateSpec > parse(const std::string_view &uri)
Definition endpoint_registry.cpp:132
Definition endpoint_registry.h:35
PathTemplatedEndpoint(const Endpoint &e)
Definition endpoint_registry.h:36
PathTemplateSpec spec
Definition endpoint_registry.h:38
Definition endpoint_registry.h:42
std::string dispatch_path
Definition endpoint_registry.h:48
int status
Definition endpoint_registry.h:49
std::string method
Definition endpoint_registry.h:43
std::chrono::milliseconds exec_time
Definition endpoint_registry.h:50
size_t attempts
Definition endpoint_registry.h:51