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"
7#include "ccf/rpc_context.h"
8
9namespace ccf
10{
11 enum class HttpVersion
12 {
13 HTTP1 = 0,
14 HTTP2
15 };
16
17 // Partial implementation of RpcContext, private to the framework (not visible
18 // to apps). Serves 2 purposes:
19 // - Default implementation of simple methods accessing member fields
20 // - Adding methods like `serialise_response()`, required by frontends
22 {
23 protected:
24 std::shared_ptr<SessionContext> session;
26
27 std::shared_ptr<void> user_data;
28
29 public:
31 const std::shared_ptr<SessionContext>& s,
33 session(s),
35 {}
36
37 std::shared_ptr<SessionContext> get_session_context() const override
38 {
39 return session;
40 }
41
42 virtual void set_user_data(std::shared_ptr<void> data) override
43 {
44 user_data = data;
45 }
46
47 virtual void* get_user_data() const override
48 {
49 return user_data.get();
50 }
51
52 ccf::ClaimsDigest claims = ccf::empty_claims();
54 {
55 claims.set(std::move(digest));
56 }
57
59 virtual const ccf::PathParams& get_request_path_params() override
60 {
61 return path_params;
62 }
63
66 {
68 }
69
71 {
72 return http_version;
73 }
74
75 virtual void set_error(
76 http_status status,
77 const std::string& code,
78 std::string&& msg,
79 const std::vector<nlohmann::json>& details = {}) override
80 {
81 auto content_type = get_request_header(ccf::http::headers::CONTENT_TYPE);
82 if (
83 content_type.has_value() &&
84 content_type.value() == http::headervalues::contenttype::GRPC)
85 {
86 set_grpc_error(http_status_to_grpc(status), std::move(msg));
87 }
88 else
89 {
90 nlohmann::json body = ccf::ODataErrorResponse{
91 ccf::ODataError{code, std::move(msg), details}};
92 set_response_json(body, status);
93 }
94 }
95
97 {
98 nlohmann::json body = ccf::ODataErrorResponse{
99 ccf::ODataError{std::move(error.code), std::move(error.msg)}};
100 set_response_json(body, error.status);
101 }
102
104 const nlohmann::json& body, http_status status) override
105 {
106 // Set error_handler to replace, to avoid throwing if the error message
107 // contains non-UTF8 characters. Other args are default values
108 const auto s =
109 body.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace);
110 set_response_status(status);
111 set_response_body(std::vector<uint8_t>(s.begin(), s.end()));
113 ccf::http::headers::CONTENT_TYPE,
114 http::headervalues::contenttype::JSON);
115 }
116
117 void set_grpc_error(grpc_status grpc_status, std::string&& msg)
118 {
120 {
121 throw std::logic_error("Cannot set gRPC error on non-HTTP/2 interface");
122 }
123
124 set_response_status(HTTP_STATUS_OK);
126 ccf::http::headers::CONTENT_TYPE,
127 http::headervalues::contenttype::GRPC);
128 set_response_trailer(grpc::make_status_trailer(grpc_status));
129 set_response_trailer(grpc::make_message_trailer(msg));
130 }
131
133 bool terminate_session = false;
134
135 virtual void set_tx_id(const ccf::TxID& tx_id) = 0;
136 virtual bool should_apply_writes() const = 0;
137 virtual void reset_response() = 0;
138 virtual std::vector<uint8_t> serialise_response() const = 0;
139 virtual const std::vector<uint8_t>& get_serialised_request() = 0;
140 };
141}
Definition claims_digest.h:10
void set(Digest &&digest_)
Definition claims_digest.h:21
Definition rpc_context_impl.h:22
void set_grpc_error(grpc_status grpc_status, std::string &&msg)
Definition rpc_context_impl.h:117
virtual const std::vector< uint8_t > & get_serialised_request()=0
ccf::PathParams decoded_path_params
Definition rpc_context_impl.h:64
HttpVersion get_http_version() const
Definition rpc_context_impl.h:70
RpcContextImpl(const std::shared_ptr< SessionContext > &s, HttpVersion v=HttpVersion::HTTP1)
Definition rpc_context_impl.h:30
virtual const ccf::PathParams & get_decoded_request_path_params() override
Definition rpc_context_impl.h:65
bool response_is_pending
Definition rpc_context_impl.h:132
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:42
bool terminate_session
Definition rpc_context_impl.h:133
virtual const ccf::PathParams & get_request_path_params() override
Definition rpc_context_impl.h:59
void set_claims_digest(ccf::ClaimsDigest::Digest &&digest) override
Definition rpc_context_impl.h:53
void set_error(ccf::ErrorDetails &&error) override
Definition rpc_context_impl.h:96
virtual void * get_user_data() const override
Definition rpc_context_impl.h:47
std::shared_ptr< void > user_data
Definition rpc_context_impl.h:27
HttpVersion http_version
Definition rpc_context_impl.h:25
virtual void reset_response()=0
ccf::PathParams path_params
Definition rpc_context_impl.h:58
void set_response_json(const nlohmann::json &body, http_status status) override
Definition rpc_context_impl.h:103
virtual void set_error(http_status status, const std::string &code, std::string &&msg, const std::vector< nlohmann::json > &details={}) override
Definition rpc_context_impl.h:75
virtual void set_tx_id(const ccf::TxID &tx_id)=0
std::shared_ptr< SessionContext > session
Definition rpc_context_impl.h:24
std::shared_ptr< SessionContext > get_session_context() const override
Definition rpc_context_impl.h:37
ccf::ClaimsDigest claims
Definition rpc_context_impl.h:52
Describes the currently executing RPC.
Definition rpc_context.h:58
Definition sha256_hash.h:16
virtual std::optional< std::string > get_request_header(const std::string_view &name) const =0
virtual void set_response_trailer(const std::string_view &name, const std::string_view &value)=0
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.
grpc_status
Definition grpc_status.h:30
llhttp_status http_status
Definition http_status.h:7
Definition app_interface.h:15
@ error
Definition tls_session.h:25
std::map< std::string, std::string, std::less<> > PathParams
Definition rpc_context.h:54
HttpVersion
Definition rpc_context_impl.h:12
Definition odata_error.h:56
Definition odata_error.h:48
Definition odata_error.h:37
Definition tx_id.h:44