18 const auto s = body.dump();
20 std::vector<uint8_t> data(s.begin(), s.end());
24 ccf::http::headers::CONTENT_TYPE,
25 ccf::http::headervalues::contenttype::JSON);
26 response.set_body(&data);
28 return response.build_response();
31 inline std::vector<uint8_t>
error(
34 return error({status, code, std::move(msg)});
43 std::string whole_path = {};
44 std::string path = {};
45 std::string query = {};
46 std::string fragment = {};
50 std::vector<uint8_t> request_body = {};
52 std::shared_ptr<ccf::http::HTTPResponder> responder =
nullptr;
54 std::vector<uint8_t> serialised_request = {};
58 std::vector<uint8_t> response_body = {};
61 bool serialised =
false;
63 std::optional<bool> explicit_apply_writes = std::nullopt;
69 const auto request_prefix = fmt::format(
75 ::http::get_header_string(request_headers));
77 serialised_request.resize(request_prefix.size() + request_body.size());
79 serialised_request.data(),
80 request_prefix.data(),
81 request_prefix.size());
82 if (!request_body.empty())
85 serialised_request.data() + request_prefix.size(),
96 std::shared_ptr<ccf::SessionContext> s,
99 const std::string_view& url_,
101 const std::vector<uint8_t>& body_,
102 const std::shared_ptr<ccf::http::HTTPResponder>& responder_ =
nullptr,
103 const std::vector<uint8_t>& raw_request_ = {}) :
107 request_headers(headers_),
109 responder(responder_),
110 serialised_request(raw_request_)
115 query = url_decode(query_);
116 fragment = url_decode(fragment_);
118 if (!serialised_request.empty())
126 return response_headers;
131 return response_trailers;
136 return response_body;
141 return response_status;
177 return serialised_request;
192 return request_headers;
196 const std::string_view& name)
const override
198 const auto it = request_headers.find(name);
199 if (it != request_headers.end())
218 template <
typename T>
222 if (verb != HTTP_HEAD)
224 if constexpr (std::is_same_v<T, std::string>)
226 response_body = std::vector<uint8_t>(body.begin(), body.end());
230 response_body = std::forward<T>(body);
252 return response_body;
262 return response_status;
266 const std::string_view& name,
const std::string_view& value)
override
268 response_headers[std::string(name)] = value;
273 response_headers.clear();
277 const std::string_view& name,
const std::string_view& value)
override
279 response_trailers[std::string(name)] = value;
284 explicit_apply_writes = apply;
289 if (explicit_apply_writes.has_value())
291 return explicit_apply_writes.value();
300 response_headers.clear();
301 response_body.clear();
302 response_status = HTTP_STATUS_OK;
303 explicit_apply_writes.reset();
310 for (
const auto& [k, v] : response_headers)
312 http_response.set_header(k, v);
315 http_response.set_body(&response_body);
316 return http_response.build_response();
320 inline static std::optional<std::string> extract_actor(HttpRpcContext& ctx)
322 const auto path = ctx.get_method();
323 const auto first_slash = path.find_first_of(
'/');
324 const auto second_slash = path.find_first_of(
'/', first_slash + 1);
326 if (first_slash != 0 || second_slash == std::string::npos)
331 auto actor = path.substr(first_slash + 1, second_slash - first_slash - 1);
332 auto remaining_path = path.substr(second_slash);
339 if (actor ==
".well-known")
341 const auto third_slash = path.find_first_of(
'/', second_slash + 1);
342 if (third_slash == std::string::npos)
347 actor = path.substr(first_slash + 1, third_slash - first_slash - 1);
348 remaining_path = path.substr(third_slash);
351 if (actor.empty() || remaining_path.empty())
359 ctx.set_method(remaining_path);
364 inline static std::shared_ptr<ccf::RpcHandler> fetch_rpc_handler(
365 std::shared_ptr<http::HttpRpcContext>& ctx,
366 std::shared_ptr<ccf::RPCMap>& rpc_map)
368 const auto actor_opt = http::extract_actor(*ctx);
369 std::optional<std::shared_ptr<ccf::RpcHandler>> search;
372 if (actor_opt.has_value())
374 const auto& actor_s = actor_opt.value();
375 actor = rpc_map->resolve(actor_s);
376 search = rpc_map->find(actor);
386 return search.value();
393 std::shared_ptr<ccf::SessionContext> s,
const std::vector<uint8_t>& packed)
397 parser.
execute(packed.data(), packed.size());
401 throw std::logic_error(fmt::format(
402 "Expected packed to contain a single complete HTTP message. Actually "
403 "parsed {} messages",
407 const auto& msg = processor.
received.front();
409 return std::make_shared<::http::HttpRpcContext>(
421 std::shared_ptr<ccf::SessionContext> s,
422 const std::vector<uint8_t>& packed,
425 switch (frame_format)
432 throw std::logic_error(
"Unknown Frame Format");
Definition rest_verb.h:45
const char * c_str() const
Definition rest_verb.h:62
Definition rpc_context_impl.h:21
RpcContextImpl(const std::shared_ptr< SessionContext > &s, HttpVersion v=HttpVersion::HTTP1)
Definition rpc_context_impl.h:29
HttpVersion http_version
Definition rpc_context_impl.h:24
Definition http_rpc_context.h:38
std::vector< uint8_t > & get_response_body()
Definition http_rpc_context.h:134
virtual void set_apply_writes(bool apply) override
Definition http_rpc_context.h:282
virtual void set_response_body(std::vector< uint8_t > &&body) override
Sets the main body or payload of the response.
Definition http_rpc_context.h:240
void set_method(const std::string_view &p)
Definition http_rpc_context.h:185
virtual std::string get_request_path() const override
Definition http_rpc_context.h:169
virtual const std::vector< uint8_t > & get_response_body() const override
Definition http_rpc_context.h:250
virtual const std::vector< uint8_t > & get_request_body() const override
Definition http_rpc_context.h:154
virtual void set_tx_id(const ccf::TxID &tx_id) override
Definition http_rpc_context.h:149
ccf::http::HeaderMap get_response_trailers() const
Definition http_rpc_context.h:129
void _set_response_body(T &&body)
Definition http_rpc_context.h:219
virtual void set_response_body(std::string &&body) override
Sets the main body or payload of the response.
Definition http_rpc_context.h:245
virtual const std::string & get_request_query() const override
Definition http_rpc_context.h:159
virtual ccf::FrameFormat frame_format() const override
Definition http_rpc_context.h:144
virtual void set_response_trailer(const std::string_view &name, const std::string_view &value) override
Definition http_rpc_context.h:276
virtual std::optional< std::string > get_request_header(const std::string_view &name) const override
Definition http_rpc_context.h:195
virtual void clear_response_headers() override
Definition http_rpc_context.h:271
virtual std::vector< uint8_t > serialise_response() const override
Definition http_rpc_context.h:306
virtual const ccf::http::HeaderMap & get_request_headers() const override
Returns map of all headers found in the request.
Definition http_rpc_context.h:190
HttpRpcContext(std::shared_ptr< ccf::SessionContext > s, ccf::HttpVersion http_version, llhttp_method verb_, const std::string_view &url_, const ccf::http::HeaderMap &headers_, const std::vector< uint8_t > &body_, const std::shared_ptr< ccf::http::HTTPResponder > &responder_=nullptr, const std::vector< uint8_t > &raw_request_={})
Definition http_rpc_context.h:95
virtual std::string get_method() const override
Definition http_rpc_context.h:180
ccf::http::HeaderMap get_response_headers() const
Definition http_rpc_context.h:124
virtual const std::string & get_request_url() const override
Definition http_rpc_context.h:207
virtual const std::vector< uint8_t > & get_serialised_request() override
Definition http_rpc_context.h:174
virtual bool should_apply_writes() const override
Definition http_rpc_context.h:287
virtual int get_response_status() const override
Definition http_rpc_context.h:260
virtual void set_response_body(const std::vector< uint8_t > &body) override
Sets the main body or payload of the response.
Definition http_rpc_context.h:235
virtual std::shared_ptr< ccf::http::HTTPResponder > get_responder() const override
Definition http_rpc_context.h:212
virtual void set_response_status(int status) override
Sets initial status code summarising result of RPC.
Definition http_rpc_context.h:255
ccf::http_status get_response_http_status() const
Definition http_rpc_context.h:139
virtual void set_response_header(const std::string_view &name, const std::string_view &value) override
Definition http_rpc_context.h:265
virtual void reset_response() override
Definition http_rpc_context.h:298
virtual const ccf::RESTVerb & get_request_verb() const override
Definition http_rpc_context.h:164
void execute(const uint8_t *data, size_t size)
Definition http_parser.h:221
Definition http_parser.h:394
Definition http_builder.h:200
std::map< std::string, std::string, std::less<> > HeaderMap
Definition http_header_map.h:10
Definition app_interface.h:14
std::shared_ptr<::http::HttpRpcContext > make_fwd_rpc_context(std::shared_ptr< ccf::SessionContext > s, const std::vector< uint8_t > &packed, ccf::FrameFormat frame_format)
Definition http_rpc_context.h:420
bool is_valid_actor(const std::string &actor)
Definition actors.h:20
HttpVersion
Definition rpc_context_impl.h:11
llhttp_status http_status
Definition http_status.h:9
FrameFormat
Definition frame_format.h:8
ActorsType
Definition actors.h:11
std::shared_ptr<::http::HttpRpcContext > make_rpc_context(std::shared_ptr< ccf::SessionContext > s, const std::vector< uint8_t > &packed)
Definition http_rpc_context.h:392
Definition error_reporter.h:6
std::vector< uint8_t > error(ccf::ErrorDetails &&error)
Definition http_rpc_context.h:14
auto split_url_path(const std::string_view &url)
Definition http_parser.h:23
bool status_success(ccf::http_status status)
Definition http_parser.h:71
Definition odata_error.h:58
Definition odata_error.h:50
Definition odata_error.h:37
std::string to_str() const
Definition tx_id.h:48
Definition http_parser.h:77
std::queue< Request > received
Definition http_parser.h:87