CCF
Loading...
Searching...
No Matches
rpc_context_impl.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
5#include "ccf/claims_digest.h"
6#include "ccf/rpc_context.h"
7
8namespace ccf
9{
10 enum class HttpVersion
11 {
12 HTTP1 = 0,
13 HTTP2
14 };
15
16 // Partial implementation of RpcContext, private to the framework (not visible
17 // to apps). Serves 2 purposes:
18 // - Default implementation of simple methods accessing member fields
19 // - Adding methods like `serialise_response()`, required by frontends
21 {
22 protected:
23 std::shared_ptr<SessionContext> session;
25
26 std::shared_ptr<void> user_data;
27
28 public:
30 const std::shared_ptr<SessionContext>& s,
32 session(s),
34 {}
35
36 std::shared_ptr<SessionContext> get_session_context() const override
37 {
38 return session;
39 }
40
41 virtual void set_user_data(std::shared_ptr<void> data) override
42 {
43 user_data = data;
44 }
45
46 virtual void* get_user_data() const override
47 {
48 return user_data.get();
49 }
50
51 ccf::ClaimsDigest claims = ccf::empty_claims();
53 {
54 claims.set(std::move(digest));
55 }
56
58 virtual const ccf::PathParams& get_request_path_params() override
59 {
60 return path_params;
61 }
62
65 {
67 }
68
70 {
71 return http_version;
72 }
73
74 virtual void set_error(
75 ccf::http_status status,
76 const std::string& code,
77 std::string&& msg,
78 const std::vector<nlohmann::json>& details = {}) override
79 {
80 nlohmann::json body =
81 ccf::ODataErrorResponse{ccf::ODataError{code, std::move(msg), details}};
82 set_response_json(body, status);
83 }
84
86 {
87 nlohmann::json body = ccf::ODataErrorResponse{
88 ccf::ODataError{std::move(error.code), std::move(error.msg)}};
89 set_response_json(body, error.status);
90 }
91
93 const nlohmann::json& body, ccf::http_status status) override
94 {
95 // Set error_handler to replace, to avoid throwing if the error message
96 // contains non-UTF8 characters. Other args are default values
97 const auto s =
98 body.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace);
99 set_response_status(status);
100 set_response_body(std::vector<uint8_t>(s.begin(), s.end()));
102 ccf::http::headers::CONTENT_TYPE,
103 http::headervalues::contenttype::JSON);
104 }
105
107 bool terminate_session = false;
108
109 virtual void set_tx_id(const ccf::TxID& tx_id) = 0;
110 virtual bool should_apply_writes() const = 0;
111 virtual void reset_response() = 0;
112 virtual std::vector<uint8_t> serialise_response() const = 0;
113 virtual const std::vector<uint8_t>& get_serialised_request() = 0;
114 };
115}
Definition claims_digest.h:10
void set(Digest &&digest_)
Definition claims_digest.h:21
Definition rpc_context_impl.h:21
virtual const std::vector< uint8_t > & get_serialised_request()=0
ccf::PathParams decoded_path_params
Definition rpc_context_impl.h:63
HttpVersion get_http_version() const
Definition rpc_context_impl.h:69
RpcContextImpl(const std::shared_ptr< SessionContext > &s, HttpVersion v=HttpVersion::HTTP1)
Definition rpc_context_impl.h:29
void set_response_json(const nlohmann::json &body, ccf::http_status status) override
Definition rpc_context_impl.h:92
virtual const ccf::PathParams & get_decoded_request_path_params() override
Definition rpc_context_impl.h:64
bool response_is_pending
Definition rpc_context_impl.h:106
virtual std::vector< uint8_t > serialise_response() const =0
virtual bool should_apply_writes() const =0
virtual void set_user_data(std::shared_ptr< void > data) override
Definition rpc_context_impl.h:41
bool terminate_session
Definition rpc_context_impl.h:107
virtual const ccf::PathParams & get_request_path_params() override
Definition rpc_context_impl.h:58
void set_claims_digest(ccf::ClaimsDigest::Digest &&digest) override
Definition rpc_context_impl.h:52
virtual void set_error(ccf::http_status status, const std::string &code, std::string &&msg, const std::vector< nlohmann::json > &details={}) override
Construct error response, formatted as JSON OData.
Definition rpc_context_impl.h:74
void set_error(ccf::ErrorDetails &&error) override
Construct error response, formatted as JSON OData.
Definition rpc_context_impl.h:85
virtual void * get_user_data() const override
Definition rpc_context_impl.h:46
std::shared_ptr< void > user_data
Definition rpc_context_impl.h:26
HttpVersion http_version
Definition rpc_context_impl.h:24
virtual void reset_response()=0
ccf::PathParams path_params
Definition rpc_context_impl.h:57
virtual void set_tx_id(const ccf::TxID &tx_id)=0
std::shared_ptr< SessionContext > session
Definition rpc_context_impl.h:23
std::shared_ptr< SessionContext > get_session_context() const override
Definition rpc_context_impl.h:36
ccf::ClaimsDigest claims
Definition rpc_context_impl.h:51
Describes the currently executing RPC.
Definition rpc_context.h:58
Definition sha256_hash.h:16
virtual void set_response_status(int status)=0
Sets initial status code summarising result of RPC.
virtual void set_response_header(const std::string_view &name, const std::string_view &value)=0
virtual void set_response_body(const std::vector< uint8_t > &body)=0
Sets the main body or payload of the response.
Definition app_interface.h:14
@ error
Definition tls_session.h:24
std::map< std::string, std::string, std::less<> > PathParams
Definition rpc_context.h:54
HttpVersion
Definition rpc_context_impl.h:11
llhttp_status http_status
Definition http_status.h:9
Definition odata_error.h:58
Definition odata_error.h:50
Definition odata_error.h:37
Definition tx_id.h:44