26#ifndef ROUTER_SRC_HTTP_INCLUDE_HTTP_BASE_CONNECTION_H_
27#define ROUTER_SRC_HTTP_INCLUDE_HTTP_BASE_CONNECTION_H_
81 return &s->lower_layer();
91 s->set_parent(parent);
105template <
typename IOLayer>
119 CNO_CONNECTION_KIND kind, CNO_HTTP_VERSION
version)
123 std::stringstream ss;
124 ss <<
"HTTP-" <<
this;
126 socket_.set_option(net::ip::tcp::no_delay{
true});
128 cno_init(&
cno_, kind);
129 cno_.disallow_h2_prior_knowledge = 1;
145 bool send(
const uint32_t *stream_id_ptr,
const int status_code,
146 const std::string &method,
const std::string &
path,
148 cno_message_t message;
149 std::vector<cno_header_t> cno_header(headers.
size(), cno_header_t());
150 std::vector<std::string> http2_headers_names;
151 const bool only_header = 0 == data.
length();
153 if (CNO_HTTP2 ==
cno_.mode) {
154 http2_headers_names.reserve(headers.
size());
157 auto output = cno_header.data();
159 for (
const auto &
entry : headers) {
160 if (CNO_HTTP2 ==
cno_.mode) {
163 output->name.size = header_name.length();
164 output->name.data = header_name.c_str();
166 output->name.size =
entry.first.length();
167 output->name.data =
entry.first.c_str();
170 output->value.size =
entry.second.length();
171 output->value.data =
entry.second.c_str();
175 message.code = status_code;
176 message.headers = cno_header.data();
177 message.headers_len = cno_header.size();
178 message.path.data =
path.c_str();
179 message.path.size =
path.length();
180 message.method.data = method.c_str();
181 message.method.size = method.length();
184 stream_id_ptr ? *stream_id_ptr : cno_next_stream(&
cno_);
185 if (CNO_OK != cno_write_head(&
cno_, stream_id, &message, only_header)) {
190 return CNO_OK == cno_write_data(&
cno_, stream_id, data.
get().c_str(),
199 if (
auto e = s->remote_endpoint()) {
200 return e->address().to_string();
208 if (
auto e = s->remote_endpoint()) {
227 [
this](std::error_code
error,
auto size) {
271 std::size_t bytes_transferred) {
281 const int result = cno_consume(
285 const cno_error_t *cno_ec = cno_error();
287 if (
const auto reason =
315 bool has_more =
true;
316 bool should_close =
false;
323 auto size_on_page = std::min(
page.size(),
size);
324 page += size_on_page;
325 size -= size_on_page;
386 static std::optional<std::string_view>
388 if (ec->code != CNO_ERRNO_PROTOCOL)
return std::nullopt;
390 using namespace std::literals;
391 switch (ec->detail) {
392 case CNO_ERROR_DETAIL_INVALID_CONTENT_LENGTH:
393 case CNO_ERROR_DETAIL_MULTIPLE_CONTENT_LENGTHS:
394 return "invalid Content-Length"sv;
403 headers.
add(
"Connection",
"close");
404 headers.
add(
"Content-Length",
"0");
406 auto stream_id =
cno_.last_stream[CNO_REMOTE];
414 if (
cno_.client ||
cno_.mode == CNO_HTTP2)
return;
419 if (
cno_.last_stream[CNO_LOCAL] == 0) {
420 cno_.last_stream[CNO_LOCAL] = stream_id;
426 bool was_first =
false;
431 bool expected =
false;
434 auto source_it = buffers.begin();
436 while (source_it != buffers.end()) {
443 if (0 == source_it->size()) {
448 if (0 == obuffer.space_left()) {
453 (*source_it) += obuffer.write(
454 static_cast<const uint8_t *
>(source_it->data()), source_it->size());
466 [[maybe_unused]]
const cno_tail_t *tail)
override {
Definition: connection_interface.h:41
Definition: connection_status_callbacks.h:36
virtual void log_invalid_request_body_headers_rejection(std::string_view)
Definition: connection_status_callbacks.h:43
virtual void on_connection_io_error(Connection *connection, const std::error_code &ec)=0
virtual void on_connection_close(Connection *connection)=0
Definition: connection.h:106
int on_cno_close() override
Definition: connection.h:475
void shutdown(bool) override
Definition: connection.h:141
void start() override
Definition: connection.h:217
int on_cno_message_tail(const uint32_t session_id, const cno_tail_t *tail) override
Definition: connection.h:465
std::string make_lower(std::string s)
Definition: connection.h:220
bool stop_running()
Mark the connection that it should stop running.
Definition: connection.h:376
base::method::Bitset Methods
Definition: connection.h:110
virtual void on_output_buffer_empty()
Definition: connection.h:384
std::atomic< bool > suspend_
Definition: connection.h:495
void prepare_h1_error_response_stream(uint32_t stream_id)
Definition: connection.h:413
Pending on_net_send(const std::error_code &ec, size_t size)
Definition: connection.h:314
Methods * allowed_method_
Definition: connection.h:483
ConnectionStatusCallbacks * connection_handler_
Definition: connection.h:497
int on_cno_writev(const cno_buffer_t *buffer, size_t count) override
Definition: connection.h:425
void send_bad_request_and_close()
Definition: connection.h:400
std::string get_peer_address() const override
Definition: connection.h:197
void do_net_recv()
Definition: connection.h:247
uint16_t get_peer_port() const override
Definition: connection.h:206
bool send(const uint32_t *stream_id_ptr, const int status_code, const std::string &method, const std::string &path, const Headers &headers, const IOBuffer &data) override
Definition: connection.h:145
IOLayer IO
Definition: connection.h:114
http::base::details::ref_buffers< std::list< owned_buffer > > ref_buffers
Definition: connection.h:113
void suspend()
Definition: connection.h:367
cno_connection_t cno_
Definition: connection.h:484
std::atomic< bool > reading_pending_
Definition: connection.h:493
bool keep_alive_
Definition: connection.h:481
std::list< owned_buffer > output_buffers_
Definition: connection.h:490
Pending on_net_receive(const std::error_code &ec, std::size_t bytes_transferred)
Definition: connection.h:270
void resume()
Definition: connection.h:366
std::atomic< bool > output_pending_
Definition: connection.h:492
uint8_t input_buffer_[512]
Definition: connection.h:486
static std::optional< std::string_view > invalid_request_body_headers_rejection_reason(const cno_error_t *ec)
Definition: connection.h:387
IOLayer & get_socket()
Definition: connection.h:215
std::mutex output_buffer_mutex_
Definition: connection.h:489
IOLayer socket_
Definition: connection.h:482
int on_cno_stream_start(const uint32_t id) override
Definition: connection.h:471
std::atomic< bool > running_
Definition: connection.h:494
~Connection() override
Definition: connection.h:135
net::mutable_buffer input_mutable_buffer_
Definition: connection.h:487
void do_net_send()
Definition: connection.h:225
Connection(IOLayer s, base::method::Bitset *allowed_method, ConnectionStatusCallbacks *connection_handler, CNO_CONNECTION_KIND kind, CNO_HTTP_VERSION version)
Definition: connection.h:117
Definition: io_buffer.h:41
virtual const std::string & get() const
Definition: io_buffer.h:82
virtual size_t length() const
Definition: io_buffer.h:52
Definition: owned_buffer.h:83
Definition: owned_buffer.h:68
Definition: buffer_sequence.h:53
Definition: cno_interface.h:36
Definition: socket.h:1090
static constexpr shutdown_type shutdown_send
Definition: socket.h:185
int page
Definition: ctype-mb.cc:1234
static int count
Definition: myisam_ftdump.cc:45
void error(const char *format,...)
static char * path
Definition: mysqldump.cc:149
bool transform(const dd::Spatial_reference_system *source_srs, const Geometry &in, const dd::Spatial_reference_system *target_srs, const char *func_name, std::unique_ptr< Geometry > *out) noexcept
Transforms a geometry from one SRS to another.
Definition: transform.cc:216
void set_socket_parent(net::ip::tcp::socket *, const char *)
Definition: connection.h:64
auto * get_socket1(T *s)
Definition: connection.h:80
net::ip::tcp::socket * get_socket(net::ip::tcp::socket *s)
Definition: connection.h:69
std::bitset< Pos::_LAST+1 > Bitset
Definition: method.h:57
constexpr key_type BadRequest
Definition: status_code.h:64
HTTP_COMMON_EXPORT name_type to_string(key_type key)
Definition: status_code.cc:35
Pending
Definition: connection.h:98
@ k_pending_none
Definition: connection.h:99
@ k_pending_reading
Definition: connection.h:101
@ k_pending_closing
Definition: connection.h:100
@ k_pending_writing
Definition: connection.h:102
Request::Headers Headers
Definition: request.cc:35
HTTP_COMMON_EXPORT void callback_init(cno_connection_t *cno, CnoInterface *)
Definition: callback_init.cc:91
Definition: connection.h:59
Definition: http_server_component.cc:36
char tolower(const char &ch)
Definition: parsing_helpers.h:41
std::error_code make_error_code(DynamicLoaderErrc ec)
make error_code from a DynamicLoaderErrc.
Definition: dynamic_loader.cc:79
size_t size(const char *const c)
Definition: base64.h:46
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:418
Definition: gcs_xcom_synode.h:64
static std::mutex lock
Definition: net_ns.cc:56
required uint64 version
Definition: replication_group_member_actions.proto:41
Definition: completion_hash.h:35