25 std::shared_ptr<ccf::RPCMap> rpc_map;
26 std::shared_ptr<ccf::RpcHandler> handler;
27 std::shared_ptr<ccf::SessionContext> session_ctx;
28 std::shared_ptr<ErrorReporter> error_reporter;
29 std::shared_ptr<ccf::CommitCallbackSubsystem> commit_callbacks;
34 std::shared_ptr<ccf::RPCMap> rpc_map_,
38 std::unique_ptr<ccf::tls::Context> ctx,
40 const std::shared_ptr<ErrorReporter>& error_reporter_,
41 const std::shared_ptr<ccf::CommitCallbackSubsystem>& commit_callbacks_) :
43 request_parser(*this, configuration),
44 rpc_map(
std::move(rpc_map_)),
45 error_reporter(error_reporter_),
46 commit_callbacks(commit_callbacks_),
47 interface_id(
std::move(interface_id_))
50 bool parse(std::span<const uint8_t> data)
override
55 request_parser.
execute(data.data(), data.size());
63 error_reporter->report_request_payload_too_large_error(interface_id);
69 HTTP_STATUS_PAYLOAD_TOO_LARGE,
70 ccf::errors::RequestBodyTooLarge,
79 error_reporter->report_request_header_too_large_error(interface_id);
85 HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE,
86 ccf::errors::RequestHeaderTooLarge,
91 catch (
const std::exception& e)
95 error_reporter->report_parsing_error(interface_id);
100 headers[ccf::http::headers::CONTENT_TYPE] =
101 ccf::http::headervalues::contenttype::TEXT;
105 auto body_s = fmt::format(
106 "Unable to parse data as a HTTP request. Error message is: {}\n"
107 "Error occurred while parsing fragment:\n",
109 std::vector<uint8_t> response_body(
110 std::begin(body_s), std::end(body_s));
111 response_body.insert(response_body.end(), data.begin(), data.end());
114 HTTP_STATUS_BAD_REQUEST,
117 std::move(response_body));
127 const std::string_view& url,
129 std::vector<uint8_t>&& body,
133 "Processing msg({}, {} [{} bytes])",
134 llhttp_method_name(verb),
140 if (session_ctx ==
nullptr)
142 session_ctx = std::make_shared<ccf::SessionContext>(
146 std::shared_ptr<http::HttpRpcContext> rpc_ctx =
nullptr;
149 rpc_ctx = std::make_shared<HttpRpcContext>(
157 catch (std::exception& e)
160 HTTP_STATUS_INTERNAL_SERVER_ERROR,
161 ccf::errors::InternalError,
162 fmt::format(
"Error constructing RpcContext: {}", e.what())});
167 std::shared_ptr<ccf::RpcHandler> search =
168 http::fetch_rpc_handler(rpc_ctx, rpc_map);
170 search->process(rpc_ctx);
172 if (rpc_ctx->response_is_pending)
179 const auto& respond_on_commit = rpc_ctx->respond_on_commit;
180 if (respond_on_commit.has_value())
182 const auto& info = respond_on_commit.value();
183 auto tx_id = info.tx_id;
184 auto committed_func = info.committed_func;
185 auto ws_digest = info.write_set_digest;
186 auto ce = info.commit_evidence;
187 auto claims = info.claims_digest;
194 std::shared_ptr<ccf::ThreadedSession> self = shared_from_this();
198 commit_callbacks->add_callback(
200 [self, rpc_ctx, paused_task, committed_func, ws_digest, ce, claims](
206 rpc_ctx, transaction_id, status, ws_digest, ce, claims};
207 committed_func(info);
212 rpc_ctx->get_response_http_status(),
213 rpc_ctx->get_response_headers(),
214 rpc_ctx->get_response_trailers(),
215 std::move(rpc_ctx->take_response_body()));
217 catch (
const std::exception& e)
220 "Exception thrown while executing commit callback for {}: {}",
223 rpc_ctx->terminate_session =
true;
226 if (rpc_ctx->terminate_session)
228 self->close_session();
238 rpc_ctx->get_response_http_status(),
239 rpc_ctx->get_response_headers(),
240 rpc_ctx->get_response_trailers(),
241 std::move(rpc_ctx->take_response_body()));
243 if (rpc_ctx->terminate_session)
249 catch (
const std::exception& e)
252 HTTP_STATUS_INTERNAL_SERVER_ERROR,
253 ccf::errors::InternalError,
254 fmt::format(
"Exception: {}", e.what())});
258 LOG_DEBUG_FMT(
"Closing connection due to exception: {}", e.what());
269 std::vector<uint8_t>&& body)
271 if (!trailers.empty())
273 throw std::logic_error(
"Cannot return trailers over HTTP/1");
277 for (
const auto& [k, v] : headers)
279 response.set_header(k, v);
288 session.
send_data(response.build_response());
296 std::vector<uint8_t>&& body)
override
318 std::unique_ptr<ccf::tls::Context> ctx) :
321 response_parser(*this)
324 bool parse(std::span<const uint8_t> data)
override
329 response_parser.
execute(data.data(), data.size());
333 catch (
const std::exception& e)
338 "Error occurred while parsing fragment {} byte fragment:\n{}",
341 reinterpret_cast<char const*
>(data.data()), data.size()));
350 auto data = request.build_request();
355 const std::string& hostname,
356 const std::string& service,
360 tls_io->set_handshake_error_cb([e](std::string&& error_msg) {
377 std::vector<uint8_t>&& body)
override
401 response_parser(*this)
404 bool parse(std::span<const uint8_t> data)
override
408 response_parser.
execute(data.data(), data.size());
411 catch (
const std::exception& e)
416 "Error occurred while parsing fragment {} byte fragment:\n{}",
419 reinterpret_cast<char const*
>(data.data()), data.size()));
428 auto data = request.build_request();
433 const std::string& hostname,
434 const std::string& service,
444 std::vector<uint8_t>&& body)
override
Definition client_session.h:11
virtual void connect(const std::string &hostname, const std::string &service, const HandleDataCallback f, const HandleErrorCallback e=nullptr)
Definition client_session.h:41
std::function< void(const std::string &error_msg)> HandleErrorCallback
Definition client_session.h:21
std::function< void(ccf::http_status status, http::HeaderMap &&headers, std::vector< uint8_t > &&body)> HandleDataCallback
Definition client_session.h:18
HandleDataCallback handle_data_cb
Definition client_session.h:24
::tcp::ConnID session_id
Definition session.h:127
std::shared_ptr< ccf::TLSSession > tls_io
Definition session.h:126
void close_session() override
Definition session.h:109
void send_data(std::vector< uint8_t > &&data) override
Definition session.h:101
::tcp::ConnID session_id
Definition session.h:195
Definition http_responder.h:14
bool send_odata_error_response(ccf::ErrorDetails &&error)
Definition http_responder.h:24
Definition http_session.h:310
HTTPClientSession(::tcp::ConnID session_id_, ringbuffer::AbstractWriterFactory &writer_factory, std::unique_ptr< ccf::tls::Context > ctx)
Definition http_session.h:315
void send_request(http::Request &&request) override
Definition http_session.h:348
void handle_response(ccf::http_status status, ccf::http::HeaderMap &&headers, std::vector< uint8_t > &&body) override
Definition http_session.h:374
bool parse(std::span< const uint8_t > data) override
Definition http_session.h:324
void connect(const std::string &hostname, const std::string &service, const HandleDataCallback f, const HandleErrorCallback e) override
Definition http_session.h:354
Definition http_session.h:21
static bool send_response_impl(ccf::ThreadedSession &session, ccf::http_status status_code, ccf::http::HeaderMap &&headers, ccf::http::HeaderMap &&trailers, std::vector< uint8_t > &&body)
Definition http_session.h:264
bool send_response(ccf::http_status status_code, ccf::http::HeaderMap &&headers, ccf::http::HeaderMap &&trailers, std::vector< uint8_t > &&body) override
Definition http_session.h:292
void handle_request(llhttp_method verb, const std::string_view &url, ccf::http::HeaderMap &&headers, std::vector< uint8_t > &&body, int32_t) override
Definition http_session.h:125
bool parse(std::span< const uint8_t > data) override
Definition http_session.h:50
HTTPServerSession(std::shared_ptr< ccf::RPCMap > rpc_map_, ::tcp::ConnID session_id_, ccf::ListenInterfaceID interface_id_, ringbuffer::AbstractWriterFactory &writer_factory, std::unique_ptr< ccf::tls::Context > ctx, const ccf::http::ParserConfiguration &configuration, const std::shared_ptr< ErrorReporter > &error_reporter_, const std::shared_ptr< ccf::CommitCallbackSubsystem > &commit_callbacks_)
Definition http_session.h:33
void execute(const uint8_t *data, size_t size)
Definition http_parser.h:232
Definition http_parser.h:406
Definition http_proc.h:20
Definition http_builder.h:117
Definition http_parser.h:466
Definition http_proc.h:33
Definition http_builder.h:200
Definition http_session.h:391
bool parse(std::span< const uint8_t > data) override
Definition http_session.h:404
void send_request(http::Request &&request) override
Definition http_session.h:426
void handle_response(ccf::http_status status, ccf::http::HeaderMap &&headers, std::vector< uint8_t > &&body) override
Definition http_session.h:441
UnencryptedHTTPClientSession(::tcp::ConnID session_id_, ringbuffer::AbstractWriterFactory &writer_factory)
Definition http_session.h:396
void connect(const std::string &hostname, const std::string &service, const HandleDataCallback f, const HandleErrorCallback e) override
Definition http_session.h:432
Definition ring_buffer_types.h:157
#define LOG_TRACE_FMT
Definition internal_logger.h:13
#define LOG_DEBUG_FMT
Definition internal_logger.h:14
#define LOG_FAIL_FMT
Definition internal_logger.h:16
std::map< std::string, std::string, std::less<> > HeaderMap
Definition http_header_map.h:10
void resume_task(Resumable resumable)
Definition task_system.cpp:106
std::shared_ptr< IResumable > Resumable
Definition resumable.h:10
Resumable pause_current_task()
Definition task_system.cpp:90
FinalTxStatus
Definition tx_status.h:36
std::string ListenInterfaceID
Definition rpc_context.h:21
llhttp_status http_status
Definition http_status.h:9
Definition error_reporter.h:8
int64_t ConnID
Definition msg_types.h:9
Definition odata_error.h:58
std::string to_str() const
Definition tx_id.h:48
Definition endpoint_context.h:72
Definition http_configuration.h:24