19 std::shared_ptr<ccf::TLSSession>
tls_io;
26 std::unique_ptr<ccf::tls::Context> ctx,
30 session_id_, writer_factory,
std::move(ctx))),
36 virtual bool parse(std::span<const uint8_t> data) = 0;
38 void send_data(std::span<const uint8_t> data)
override
42 tls_io->send_raw(data.data(), data.size());
47 throw std::logic_error(
"Unimplemented");
57 tls_io->recv_buffered(data.data(), data.size());
65 constexpr auto min_read_block_size = 4096;
66 if (data.size() < min_read_block_size)
68 data.resize(min_read_block_size);
71 auto n_read =
tls_io->read(data.data(), data.size(),
false);
82 bool cont =
parse({data.data(), n_read});
89 n_read =
tls_io->read(data.data(), data.size(),
false);
101 std::shared_ptr<ccf::RPCMap> rpc_map;
102 std::shared_ptr<ccf::RpcHandler> handler;
103 std::shared_ptr<ccf::SessionContext> session_ctx;
108 std::shared_ptr<ccf::RPCMap> rpc_map,
112 std::unique_ptr<ccf::tls::Context> ctx,
116 request_parser(*this, configuration),
118 interface_id(interface_id)
121 bool parse(std::span<const uint8_t> data)
override
126 request_parser.
execute(data.data(), data.size());
134 error_reporter->report_request_payload_too_large_error(interface_id);
140 HTTP_STATUS_PAYLOAD_TOO_LARGE,
141 ccf::errors::RequestBodyTooLarge,
150 error_reporter->report_request_header_too_large_error(interface_id);
156 HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE,
157 ccf::errors::RequestHeaderTooLarge,
162 catch (
const std::exception& e)
171 headers[ccf::http::headers::CONTENT_TYPE] =
172 ccf::http::headervalues::contenttype::TEXT;
176 auto body_s = fmt::format(
177 "Unable to parse data as a HTTP request. Error message is: {}\n"
178 "Error occurred while parsing fragment:\n",
180 std::vector<uint8_t> response_body(
181 std::begin(body_s), std::end(body_s));
182 response_body.insert(response_body.end(), data.begin(), data.end());
185 HTTP_STATUS_BAD_REQUEST,
188 std::move(response_body));
198 const std::string_view& url,
200 std::vector<uint8_t>&& body,
204 "Processing msg({}, {} [{} bytes])",
205 llhttp_method_name(verb),
211 if (session_ctx ==
nullptr)
213 session_ctx = std::make_shared<ccf::SessionContext>(
217 std::shared_ptr<http::HttpRpcContext> rpc_ctx =
nullptr;
220 rpc_ctx = std::make_shared<HttpRpcContext>(
228 catch (std::exception& e)
231 HTTP_STATUS_INTERNAL_SERVER_ERROR,
232 ccf::errors::InternalError,
233 fmt::format(
"Error constructing RpcContext: {}", e.what())});
237 std::shared_ptr<ccf::RpcHandler> search =
238 http::fetch_rpc_handler(rpc_ctx, rpc_map);
240 search->process(rpc_ctx);
242 if (rpc_ctx->response_is_pending)
251 rpc_ctx->get_response_http_status(),
252 rpc_ctx->get_response_headers(),
253 rpc_ctx->get_response_trailers(),
254 std::move(rpc_ctx->get_response_body()));
256 if (rpc_ctx->terminate_session)
262 catch (
const std::exception& e)
265 HTTP_STATUS_INTERNAL_SERVER_ERROR,
266 ccf::errors::InternalError,
267 fmt::format(
"Exception: {}", e.what())});
271 LOG_DEBUG_FMT(
"Closing connection due to exception: {}", e.what());
281 std::span<const uint8_t> body)
override
283 if (!trailers.empty())
285 throw std::logic_error(
"Cannot return trailers over HTTP/1");
289 for (
const auto& [k, v] : headers)
291 response.set_header(k, v);
293 response.set_body(body.data(), body.size());
295 auto data = response.build_response();
296 tls_io->send_raw(data.data(), data.size());
303 throw std::logic_error(
"Not implemented!");
308 throw std::logic_error(
"Not implemented!");
313 throw std::logic_error(
"Not implemented!");
319 throw std::logic_error(
"Not implemented!");
334 std::unique_ptr<ccf::tls::Context> ctx) :
337 response_parser(*this)
340 bool parse(std::span<const uint8_t> data)
override
345 response_parser.
execute(data.data(), data.size());
349 catch (
const std::exception& e)
354 "Error occurred while parsing fragment {} byte fragment:\n{}",
356 std::string_view((
char const*)data.data(), data.size()));
365 auto data = request.build_request();
370 const std::string& hostname,
371 const std::string& service,
375 tls_io->set_handshake_error_cb([e](std::string&& error_msg) {
392 std::vector<uint8_t>&& body)
override
426 virtual bool parse(std::span<const uint8_t> data) = 0;
432 throw std::logic_error(
433 "Called UnencryptedHTTPSession::send_data "
434 "from wrong thread");
447 throw std::logic_error(
448 "Called UnencryptedHTTPSession::close_session "
449 "from wrong thread");
474 response_parser(*this)
477 bool parse(std::span<const uint8_t> data)
override
481 response_parser.
execute(data.data(), data.size());
484 catch (
const std::exception& e)
489 "Error occurred while parsing fragment {} byte fragment:\n{}",
491 std::string_view((
char const*)data.data(), data.size()));
500 auto data = request.build_request();
505 const std::string& hostname,
506 const std::string& service,
516 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:39
std::function< void(const std::string &error_msg)> HandleErrorCallback
Definition client_session.h:19
HandleDataCallback handle_data_cb
Definition client_session.h:22
std::function< void(http_status status, http::HeaderMap &&headers, std::vector< uint8_t > &&body)> HandleDataCallback
Definition client_session.h:16
Definition tls_session.h:29
void send_data(std::span< const uint8_t > data) override
Definition session.h:58
Definition http_responder.h:16
bool send_odata_error_response(ccf::ErrorDetails &&error)
Definition http_responder.h:35
Definition http_session.h:326
HTTPClientSession(::tcp::ConnID session_id_, ringbuffer::AbstractWriterFactory &writer_factory, std::unique_ptr< ccf::tls::Context > ctx)
Definition http_session.h:331
void send_request(http::Request &&request) override
Definition http_session.h:363
bool parse(std::span< const uint8_t > data) override
Definition http_session.h:340
void connect(const std::string &hostname, const std::string &service, const HandleDataCallback f, const HandleErrorCallback e) override
Definition http_session.h:369
void handle_response(http_status status, ccf::http::HeaderMap &&headers, std::vector< uint8_t > &&body) override
Definition http_session.h:389
Definition http_session.h:97
bool set_on_stream_close_callback(ccf::http::StreamOnCloseCallback cb) override
Definition http_session.h:316
bool close_stream(ccf::http::HeaderMap &&) override
Definition http_session.h:311
bool stream_data(std::span< const uint8_t > data) override
Definition http_session.h:306
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:196
bool send_response(http_status status_code, ccf::http::HeaderMap &&headers, ccf::http::HeaderMap &&trailers, std::span< const uint8_t > body) override
Definition http_session.h:277
HTTPServerSession(std::shared_ptr< ccf::RPCMap > rpc_map, ::tcp::ConnID session_id_, const 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=nullptr)
Definition http_session.h:107
bool parse(std::span< const uint8_t > data) override
Definition http_session.h:121
bool start_stream(http_status status, const ccf::http::HeaderMap &headers) override
Definition http_session.h:300
Definition http_session.h:17
void send_data(std::span< const uint8_t > data) override
Definition http_session.h:38
std::shared_ptr< ccf::TLSSession > tls_io
Definition http_session.h:19
std::shared_ptr< ErrorReporter > error_reporter
Definition http_session.h:20
void send_data_thread(std::vector< uint8_t > &&data) override
Definition http_session.h:45
void close_session() override
Definition http_session.h:50
HTTPSession(::tcp::ConnID session_id_, ringbuffer::AbstractWriterFactory &writer_factory, std::unique_ptr< ccf::tls::Context > ctx, const std::shared_ptr< ErrorReporter > &error_reporter=nullptr)
Definition http_session.h:23
void handle_incoming_data_thread(std::vector< uint8_t > &&data) override
Definition http_session.h:55
virtual bool parse(std::span< const uint8_t > data)=0
::tcp::ConnID session_id
Definition http_session.h:21
void execute(const uint8_t *data, size_t size)
Definition http_parser.h:221
Definition http_parser.h:394
Definition http_proc.h:20
Definition http_builder.h:106
Definition http_parser.h:452
Definition http_proc.h:31
Definition http_builder.h:188
Definition http_session.h:464
bool parse(std::span< const uint8_t > data) override
Definition http_session.h:477
void send_request(http::Request &&request) override
Definition http_session.h:498
UnencryptedHTTPClientSession(::tcp::ConnID session_id_, ringbuffer::AbstractWriterFactory &writer_factory)
Definition http_session.h:469
void connect(const std::string &hostname, const std::string &service, const HandleDataCallback f, const HandleErrorCallback e) override
Definition http_session.h:504
void handle_response(http_status status, ccf::http::HeaderMap &&headers, std::vector< uint8_t > &&body) override
Definition http_session.h:513
Definition http_session.h:402
size_t execution_thread
Definition http_session.h:408
::tcp::ConnID session_id
Definition http_session.h:405
void handle_incoming_data_thread(std::vector< uint8_t > &&data) override
Definition http_session.h:455
void send_data_thread(std::vector< uint8_t > &&data) override
Definition http_session.h:428
void close_session() override
Definition http_session.h:443
ringbuffer::WriterPtr to_host
Definition http_session.h:407
UnencryptedHTTPSession(::tcp::ConnID session_id_, ringbuffer::AbstractWriterFactory &writer_factory_, const std::shared_ptr< ErrorReporter > &error_reporter=nullptr)
Definition http_session.h:410
ringbuffer::AbstractWriterFactory & writer_factory
Definition http_session.h:406
std::shared_ptr< ErrorReporter > error_reporter
Definition http_session.h:404
virtual bool parse(std::span< const uint8_t > data)=0
Definition ring_buffer_types.h:153
static ThreadMessaging & instance()
Definition thread_messaging.h:278
uint16_t get_execution_thread(uint32_t i)
Definition thread_messaging.h:365
llhttp_status http_status
Definition http_status.h:7
#define LOG_TRACE_FMT
Definition logger.h:378
#define LOG_DEBUG_FMT
Definition logger.h:380
#define LOG_FAIL_FMT
Definition logger.h:396
std::map< std::string, std::string, std::less<> > HeaderMap
Definition http_header_map.h:10
std::function< void(void)> StreamOnCloseCallback
Definition http_responder.h:13
uint16_t get_current_thread_id()
Definition thread_local.cpp:9
Definition app_interface.h:15
std::string ListenInterfaceID
Definition rpc_context.h:21
Definition error_reporter.h:6
std::shared_ptr< AbstractWriter > WriterPtr
Definition ring_buffer_types.h:150
int64_t ConnID
Definition msg_types.h:9
#define RINGBUFFER_WRITE_MESSAGE(MSG,...)
Definition ring_buffer_types.h:255
Definition odata_error.h:56
Definition http_configuration.h:24
Definition serializer.h:27
const uint8_t * data
Definition serializer.h:28