26#ifndef ROUTER_SRC_HTTP_SRC_HTTP_SERVER_CONNECTION_H_
27#define ROUTER_SRC_HTTP_SRC_HTTP_SERVER_CONNECTION_H_
48template <
typename Socket>
55 :
public Parent::ConnectionStatusCallbacks {
60 uint64_t max_request_body_size,
61 std::optional<uint64_t> content_length) = 0;
63 uint64_t max_response_body_size, uint64_t response_body_size) = 0;
77 :
Parent(
std::move(s), allowed_method, connection_handler,
78 CNO_CONNECTION_KIND::CNO_SERVER, CNO_HTTP_VERSION::CNO_HTTP1),
83 std::string_view content_length_value) {
84 uint64_t content_length{};
85 const auto *
begin = content_length_value.data();
86 const auto *end =
begin + content_length_value.size();
88 if (ec != std::errc{} || ptr != end)
return std::nullopt;
89 return content_length;
93 size_t next_chunk_size) {
94 if (current_size > max_size)
return true;
95 return next_chunk_size > (max_size - current_size);
103 std::string_view value,
106 "Transfer-Encoding")) {
107 result.has_transfer_encoding =
true;
116 result.has_content_length =
true;
119 if (!parsed.has_value()) {
120 result.invalid_content_length =
true;
124 if (!
result.content_length.has_value()) {
125 result.content_length = *parsed;
126 }
else if (*
result.content_length != *parsed) {
127 result.invalid_content_length =
true;
131 bool send(
const uint32_t *stream_id_ptr,
const int status_code,
132 const std::string &method,
const std::string &
path,
135 const auto max_response_body_size =
139 max_response_body_size, data.
length());
143 error_headers.
add(
"Connection",
"close");
144 error_headers.
add(
"Content-Length",
"0");
145 Parent::keep_alive_ =
false;
149 error_headers, k_empty);
164 const size_t size)
override {
177 auto &session = it->second;
178 if (session.payload_limit_exceeded) {
183 session.input_body_size,
size)) {
185 session.max_request_body_size, std::nullopt);
187 session.payload_limit_exceeded =
true;
188 Parent::keep_alive_ =
false;
192 session.input_body_size +=
size;
193 session.request.get_data().input_body_.get().append(data,
size);
198 [[maybe_unused]]
const cno_tail_t *tail)
override {
200 if (it ==
sessions_.end() || it->second.payload_limit_exceeded) {
217 const cno_message_t *msg)
override {
220 const auto method_pos =
231 body_headers.has_content_length = msg->has_content_length != 0;
232 for (
const auto &header :
sequence) {
236 input_headers.
add(std::move(header_name), std::move(header_value));
238 if (body_headers.has_transfer_encoding && body_headers.has_content_length) {
240 "both Content-Length and Transfer-Encoding are present");
242 path, std::move(input_headers))
244 Parent::keep_alive_ =
false;
248 if (body_headers.invalid_content_length) {
250 "invalid Content-Length");
252 path, std::move(input_headers))
254 Parent::keep_alive_ =
false;
258 const auto max_request_body_size =
260 if (body_headers.content_length.has_value() &&
261 *body_headers.content_length > max_request_body_size) {
263 max_request_body_size, body_headers.content_length);
265 path, std::move(input_headers))
267 Parent::keep_alive_ =
false;
271 if (!(*Parent::allowed_method_)[method_pos]) {
273 "", std::move(input_headers))
281 session_id,
this, session_id,
283 std::move(input_headers), max_request_body_size);
288 pair.first->second.request.get_output_headers().add(
"Date",
buffer);
289 pair.first->second.request.get_output_headers().add(
290 "Content-Type",
"text/html; charset=ISO-8859-1");
294 "", std::move(input_headers))
307 uint64_t max_body_size)
308 :
request(connection, session_id, method,
path,
std::move(headers)),
Definition: connection_interface.h:41
Definition: connection.h:106
Definition: io_buffer.h:41
virtual size_t length() const
Definition: io_buffer.h:52
Definition: buffer_sequence.h:39
Definition: request_handler_interface.h:34
virtual void route(http::base::Request &request)=0
Definition: connection.h:55
virtual uint64_t max_request_body_size() const =0
virtual uint64_t max_response_body_size() const =0
virtual void log_max_response_body_size_rejection(uint64_t max_response_body_size, uint64_t response_body_size)=0
virtual void log_max_request_body_size_rejection(uint64_t max_request_body_size, std::optional< uint64_t > content_length)=0
Definition: connection.h:49
int on_cno_message_head(const uint32_t session_id, const cno_message_t *msg) override
Definition: connection.h:216
static bool body_size_exceeds_limit(uint64_t max_size, uint64_t current_size, size_t next_chunk_size)
Definition: connection.h:92
int on_cno_message_body(const uint32_t session_id, const char *data, const size_t size) override
Definition: connection.h:163
ConnectionStatusCallbacks * connection_handler_
Definition: connection.h:318
static bool body_size_exceeds_limit(uint64_t limit, size_t body_size)
Definition: connection.h:98
bool send(const uint32_t *stream_id_ptr, const int status_code, const std::string &method, const std::string &path, const typename Parent::Headers &headers, const http::base::IOBuffer &data) override
Definition: connection.h:131
ServerConnection(Socket s, base::method::Bitset *allowed_method, RequestHandlerInterface *rhi, ConnectionStatusCallbacks *connection_handler)
Definition: connection.h:74
RequestHandlerInterface * request_handler_
Definition: connection.h:317
bool first_request_
Definition: connection.h:302
uint32_t SessionId
Definition: connection.h:52
int on_cno_stream_end(const uint32_t id) override
Definition: connection.h:211
static void update_body_related_header(std::string_view name, std::string_view value, BodyHeadersValidationResult &result)
Definition: connection.h:102
int on_cno_message_tail(const uint32_t session_id, const cno_tail_t *tail) override
Definition: connection.h:197
static std::optional< uint64_t > parse_content_length(std::string_view content_length_value)
Definition: connection.h:82
int on_settings() override
Definition: connection.h:157
std::map< SessionId, SessionData > sessions_
Definition: connection.h:316
a HTTP request and response.
Definition: request.h:46
void send_reply(StatusType status_code) override
Definition: request.cc:99
void send_error(StatusType status_code) override
Definition: request.cc:76
Definition: socket.h:1090
#define HTTP_SERVER_LIB_EXPORT
Definition: http_server_lib_export.h:15
mysql_service_status_t send(const char *tag, const unsigned char *data, const size_t data_length) noexcept
Definition: message_service.cc:33
static char * path
Definition: mysqldump.cc:149
std::bitset< Pos::_LAST+1 > Bitset
Definition: method.h:57
HTTP_COMMON_EXPORT pos_type from_string_to_post(const std::string_view &method)
Definition: method.cc:50
int key_type
Definition: method.h:38
constexpr key_type PayloadTooLarge
Definition: status_code.h:77
constexpr key_type InternalError
Definition: status_code.h:93
constexpr key_type NotImplemented
Definition: status_code.h:94
constexpr key_type BadRequest
Definition: status_code.h:64
HTTP_COMMON_EXPORT name_type to_string(key_type key)
Definition: status_code.cc:35
HTTP_COMMON_EXPORT int time_to_rfc5322_fixdate(time_t ts, char *date_buf, size_t date_buf_len)
convert time_t into a Date: header value.
Definition: http_time.cc:39
HTTP_COMMON_EXPORT bool compare_case_insensitive(const std::string &l, const std::string_view &r)
Definition: headers.cc:37
std::string to_string(const T &str)
Convert CNO buffers to strings.
Definition: string.h:42
HTTP_SERVER_LIB_EXPORT std::atomic< uint64_t > http_connections_reused
Definition: server.cc:45
Definition: connection.h:59
const char * begin(const char *const c)
Definition: base64.h:44
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
case opt name
Definition: sslopt-case.h:29
Definition: connection.h:67
std::optional< uint64_t > content_length
Definition: connection.h:71
bool has_content_length
Definition: connection.h:69
bool invalid_content_length
Definition: connection.h:70
bool has_transfer_encoding
Definition: connection.h:68
Definition: connection.h:303
SessionData(http::base::ConnectionInterface *connection, const uint32_t session_id, const base::method::key_type method, const std::string &path, http::base::Headers &&headers, uint64_t max_body_size)
Definition: connection.h:304
uint64_t max_request_body_size
Definition: connection.h:312
bool payload_limit_exceeded
Definition: connection.h:314
ServerRequest request
Definition: connection.h:311
uint64_t input_body_size
Definition: connection.h:313
Definition: server_struct.h:39
static stdx::expected< T, std::error_code > from_chars(const std::string &value, int base=10)
convert a numeric string to a number.
Definition: tcp_address.cc:61
long long sequence(UDF_INIT *initid, UDF_ARGS *args, unsigned char *, unsigned char *)
Definition: udf_example.cc:568