GNU libmicrohttpd 1.0.0
|
Methods for managing connections. More...
#include "internal.h"
#include "mhd_limits.h"
#include "connection.h"
#include "memorypool.h"
#include "response.h"
#include "mhd_mono_clock.h"
#include "mhd_str.h"
#include "mhd_sockets.h"
#include "mhd_compat.h"
#include "mhd_itc.h"
#include "mhd_send.h"
#include "mhd_assert.h"
Go to the source code of this file.
Functions | |
void * | MHD_connection_alloc_memory_ (struct MHD_Connection *connection, size_t size) |
static ssize_t | recv_param_adapter (struct MHD_Connection *connection, void *other, size_t i) |
_MHD_EXTERN int | MHD_get_connection_values (struct MHD_Connection *connection, enum MHD_ValueKind kind, MHD_KeyValueIterator iterator, void *iterator_cls) |
_MHD_EXTERN int | MHD_get_connection_values_n (struct MHD_Connection *connection, enum MHD_ValueKind kind, MHD_KeyValueIteratorN iterator, void *iterator_cls) |
static enum MHD_Result | MHD_set_connection_value_n_nocheck_ (struct MHD_Connection *connection, enum MHD_ValueKind kind, const char *key, size_t key_size, const char *value, size_t value_size) |
_MHD_EXTERN enum MHD_Result | MHD_set_connection_value_n (struct MHD_Connection *connection, enum MHD_ValueKind kind, const char *key, size_t key_size, const char *value, size_t value_size) |
_MHD_EXTERN enum MHD_Result | MHD_set_connection_value (struct MHD_Connection *connection, enum MHD_ValueKind kind, const char *key, const char *value) |
_MHD_EXTERN const char * | MHD_lookup_connection_value (struct MHD_Connection *connection, enum MHD_ValueKind kind, const char *key) |
_MHD_EXTERN enum MHD_Result | MHD_lookup_connection_value_n (struct MHD_Connection *connection, enum MHD_ValueKind kind, const char *key, size_t key_size, const char **value_ptr, size_t *value_size_ptr) |
static bool | MHD_lookup_header_token_ci (const struct MHD_Connection *connection, const char *header, size_t header_len, const char *token, size_t token_len) |
static bool | need_100_continue (struct MHD_Connection *connection) |
void | MHD_connection_mark_closed_ (struct MHD_Connection *connection) |
void | MHD_connection_close_ (struct MHD_Connection *connection, enum MHD_RequestTerminationCode termination_code) |
static void | connection_close_error (struct MHD_Connection *connection, const char *emsg) |
static enum MHD_Result | try_ready_normal_body (struct MHD_Connection *connection) |
static enum MHD_Result | try_ready_chunked_body (struct MHD_Connection *connection, bool *p_finished) |
static enum MHD_ConnKeepAlive | keepalive_possible (struct MHD_Connection *connection) |
static bool | get_date_str (char *date) |
static bool | get_date_header (char *header) |
static bool | try_grow_read_buffer (struct MHD_Connection *connection, bool required) |
static void | connection_shrink_read_buffer (struct MHD_Connection *connection) |
static size_t | connection_maximize_write_buffer (struct MHD_Connection *connection) |
static void | connection_switch_from_recv_to_send (struct MHD_Connection *connection) |
static enum replyBodyUse | is_reply_body_needed (struct MHD_Connection *connection, unsigned int rcode) |
static void | setup_reply_properties (struct MHD_Connection *connection) |
static void | check_connection_reply (struct MHD_Connection *connection) |
static bool | buffer_append (char *buf, size_t *ppos, size_t buf_size, const char *append, size_t append_size) |
static bool | add_user_headers (char *buf, size_t *ppos, size_t buf_size, struct MHD_Response *response, bool filter_transf_enc, bool filter_content_len, bool add_close, bool add_keep_alive) |
static enum MHD_Result | build_header_response (struct MHD_Connection *connection) |
static enum MHD_Result | build_connection_chunked_response_footer (struct MHD_Connection *connection) |
static void | transmit_error_response_len (struct MHD_Connection *connection, unsigned int status_code, const char *message, size_t message_len, char *header_name, size_t header_name_len, char *header_value, size_t header_value_len) |
static bool | has_unprocessed_upload_body_data_in_buffer (struct MHD_Connection *c) |
static unsigned int | get_no_space_err_status_code (struct MHD_Connection *c, enum MHD_ProcRecvDataStage stage, const char *add_element, size_t add_element_size) |
static void | handle_req_headers_no_space (struct MHD_Connection *c, const char *add_header, size_t add_header_size) |
static void | handle_req_chunk_size_line_no_space (struct MHD_Connection *c, const char *chunk_size_line, size_t chunk_size_line_size) |
static void | handle_req_footers_no_space (struct MHD_Connection *c, const char *add_footer, size_t add_footer_size) |
static void | handle_recv_no_space (struct MHD_Connection *c, enum MHD_ProcRecvDataStage stage) |
static bool | check_and_grow_read_buffer_space (struct MHD_Connection *c) |
static void | MHD_connection_update_event_loop_info (struct MHD_Connection *connection) |
static enum MHD_Result | connection_add_header (void *cls, const char *key, size_t key_size, const char *value, size_t value_size, enum MHD_ValueKind kind) |
static bool | parse_http_version (struct MHD_Connection *connection, const char *http_string, size_t len) |
static void | parse_http_std_method (struct MHD_Connection *connection, const char *method, size_t len) |
static void | call_connection_handler (struct MHD_Connection *connection) |
static void | process_request_body (struct MHD_Connection *connection) |
static enum MHD_Result | check_write_done (struct MHD_Connection *connection, enum MHD_CONNECTION_STATE next_state) |
static void | parse_connection_headers (struct MHD_Connection *connection) |
_MHD_static_inline void | reset_rq_header_processing_state (struct MHD_Connection *c) |
_MHD_static_inline void | switch_to_rq_headers_processing (struct MHD_Connection *c) |
static bool | get_request_line_inner (struct MHD_Connection *c) |
static void | send_redirect_fixed_rq_target (struct MHD_Connection *c) |
static bool | process_request_target (struct MHD_Connection *c) |
static bool | get_request_line (struct MHD_Connection *c) |
static enum MHD_HdrLineReadRes_ | get_req_header (struct MHD_Connection *c, bool process_footers, struct _MHD_str_w_len *hdr_name, struct _MHD_str_w_len *hdr_value) |
static bool | get_req_headers (struct MHD_Connection *c, bool process_footers) |
void | MHD_update_last_activity_ (struct MHD_Connection *connection) |
void | MHD_connection_handle_read (struct MHD_Connection *connection, bool socket_error) |
void | MHD_connection_handle_write (struct MHD_Connection *connection) |
static bool | connection_check_timedout (struct MHD_Connection *c) |
static void | cleanup_connection (struct MHD_Connection *connection) |
void | MHD_connection_set_initial_state_ (struct MHD_Connection *c) |
static void | connection_reset (struct MHD_Connection *connection, bool reuse) |
enum MHD_Result | MHD_connection_handle_idle (struct MHD_Connection *connection) |
void | MHD_set_http_callbacks_ (struct MHD_Connection *connection) |
_MHD_EXTERN const union MHD_ConnectionInfo * | MHD_get_connection_info (struct MHD_Connection *connection, enum MHD_ConnectionInfoType info_type,...) |
_MHD_EXTERN enum MHD_Result | MHD_set_connection_option (struct MHD_Connection *connection, enum MHD_CONNECTION_OPTION option,...) |
_MHD_EXTERN enum MHD_Result | MHD_queue_response (struct MHD_Connection *connection, unsigned int status_code, struct MHD_Response *response) |
Variables | |
enum MHD_HdrLineReadRes_ | _MHD_FIXED_ENUM |
Methods for managing connections.
Definition in file connection.c.
#define BARE_CR_IN_FOOTER "" |
Response text used when the request HTTP footer has bare CR character without LF character (and CR is not allowed to be treated as whitespace).
Definition at line 228 of file connection.c.
#define BARE_CR_IN_HEADER "" |
Response text used when the request HTTP header has bare CR character without LF character (and CR is not allowed to be treated as whitespace).
Definition at line 213 of file connection.c.
#define BARE_LF_IN_FOOTER "" |
Response text used when the request HTTP footer has bare LF character without CR character.
Definition at line 258 of file connection.c.
#define BARE_LF_IN_HEADER "" |
Response text used when the request HTTP header has bare LF character without CR character.
Definition at line 243 of file connection.c.
#define buffer_append_s | ( | buf, | |
ppos, | |||
buf_size, | |||
str | |||
) | buffer_append (buf,ppos,buf_size,str, MHD_STATICSTR_LEN_ (str)) |
Append static string to the buffer if enough space is available, update position.
[out] | buf | the buffer to append data to |
[in,out] | ppos | the pointer to position in the buffer |
buf_size | the size of the buffer | |
str | the static string to append |
Definition at line 2328 of file connection.c.
#define CONNECTION_CLOSE_ERROR | ( | c, | |
emsg | |||
) | connection_close_error (c, NULL) |
Macro to only include error message in call to connection_close_error() if we have HAVE_MESSAGES.
Definition at line 1386 of file connection.c.
#define ERR_MSG_REQUEST_CHUNK_LINE_EXT_TOO_BIG "" |
Response text used when the request chunk size line with chunk extension cannot fit the buffer.
Definition at line 148 of file connection.c.
#define ERR_MSG_REQUEST_CHUNK_LINE_TOO_BIG "" |
Response text used when the request chunk size line without chunk extension cannot fit the buffer.
Definition at line 167 of file connection.c.
#define ERR_MSG_REQUEST_FOOTER_TOO_BIG "" |
Response text used when the request header is too big to be processed.
Definition at line 185 of file connection.c.
#define ERR_MSG_REQUEST_HEADER_TOO_BIG "" |
Response text used when the request header is too big to be processed.
Definition at line 111 of file connection.c.
#define ERR_MSG_REQUEST_HEADER_WITH_COOKIES_TOO_BIG "" |
Response text used when the request cookie header is too big to be processed.
Definition at line 129 of file connection.c.
#define ERR_MSG_REQUEST_TOO_BIG "" |
Response text used when the request (http header) is too big to be processed.
Definition at line 94 of file connection.c.
#define ERR_RSP_EMPTY_FOOTER_NAME "" |
Response text used when request header has zero-length header (filed) name.
Definition at line 436 of file connection.c.
#define ERR_RSP_EMPTY_HEADER_NAME "" |
Response text used when request header has zero-length header (filed) name.
Definition at line 423 of file connection.c.
#define ERR_RSP_FOOTER_WITHOUT_COLON "" |
Response text used when request footer has no colon character.
Definition at line 410 of file connection.c.
#define ERR_RSP_INVALID_CHR_IN_HEADER "" |
Response text used when request header has invalid character.
Response text used when request header has no colon character.
Definition at line 397 of file connection.c.
#define ERR_RSP_INVALID_CHR_IN_HEADER "" |
Response text used when request header has invalid character.
Response text used when request header has no colon character.
Definition at line 397 of file connection.c.
#define ERR_RSP_INVALID_CHR_IN_HEADER "" |
Response text used when request header has invalid character.
Response text used when request header has no colon character.
Definition at line 397 of file connection.c.
#define ERR_RSP_OBS_FOLD "" |
Response text used when line folding is used in request headers.
Definition at line 285 of file connection.c.
#define ERR_RSP_OBS_FOLD_FOOTER "" |
Response text used when line folding is used in request footers.
Definition at line 298 of file connection.c.
#define ERR_RSP_WSP_BEFORE_FOOTER "" |
Response text used when the request has whitespace at the start of the first footer line.
Definition at line 328 of file connection.c.
#define ERR_RSP_WSP_BEFORE_HEADER "" |
Response text used when the request has whitespace at the start of the first header line.
Definition at line 313 of file connection.c.
#define ERR_RSP_WSP_IN_FOOTER_NAME "" |
Response text used when the whitespace found before colon (inside header name or between header name and colon).
Definition at line 358 of file connection.c.
#define ERR_RSP_WSP_IN_HEADER_NAME "" |
Response text used when the whitespace found before colon (inside header name or between header name and colon).
Definition at line 343 of file connection.c.
#define ERROR_MSG_DATA_NOT_HANDLED_BY_APP "" |
Response text used when there is an internal server error.
Intentionally empty here to keep our memory footprint minimal.
Definition at line 562 of file connection.c.
#define HTTP_100_CONTINUE "HTTP/1.1 100 Continue\r\n\r\n" |
Message to transmit when http 1.1 request is received
Definition at line 80 of file connection.c.
#define HTTP_VER_LEN (MHD_STATICSTR_LEN_ (MHD_HTTP_VERSION_1_1)) |
The valid length of any HTTP version string
Definition at line 4238 of file connection.c.
#define MHD_ALLOW_BARE_LF_AS_CRLF_ | ( | discp_lvl | ) | (0 >= discp_lvl) |
Get whether bare LF in HTTP header and other protocol elements should be treated as the line termination depending on the configured strictness level. RFC 9112, section 2.2
Definition at line 65 of file connection.c.
#define MHD_CHUNK_HEADER_REASONABLE_LEN 24 |
The reasonable length of the upload chunk "header" (the size specifier with optional chunk extension). MHD tries to keep the space in the read buffer large enough to read the chunk "header" in one step. The real "header" could be much larger, it will be handled correctly anyway, however it may require several rounds of buffer grow.
Definition at line 75 of file connection.c.
#define MHD_lookup_header_s_token_ci | ( | c, | |
h, | |||
tkn | |||
) |
Check whether request header contains particular static tkn.
Token could be surrounded by spaces and tabs and delimited by comma. Case-insensitive match used for header names and tokens.
c | the connection to get values from |
h | the static string of header name |
tkn | the static string of token to find |
Definition at line 1160 of file connection.c.
#define MHD_MAX_EMPTY_LINES_SKIP 1024 |
The maximum number of ignored empty line before the request line at default "strictness" level.
Definition at line 4880 of file connection.c.
#define MHD_MAX_FIXED_URI_LEN (64 * 1024) |
The maximum size of the fixed URI for automatic redirection
Definition at line 5440 of file connection.c.
#define MHD_MAX_REASONABLE_HEADERS_SIZE_ (6 * 1024) |
A reasonable headers size (excluding request line) that should be sufficient for most requests. If incoming data buffer free space is not enough to process the complete header (the request line and all headers) and the headers size is larger than this size then the status code 431 "Request Header Fields Too Large" is returned to the client. The larger headers are processed by MHD if enough space is available.
Definition at line 3004 of file connection.c.
#define MHD_MAX_REASONABLE_REQ_TARGET_SIZE_ 8000 |
A reasonable request target (the request URI) size that should be sufficient for most requests. If incoming data buffer free space is not enough to process the complete header (the request line and all headers) and the request target size is larger than this size then the status code 414 "URI Too Long" is returned to the client. The larger request targets are processed by MHD if enough space is available. The value chosen according to RFC 9112 Section 3, paragraph 5
Definition at line 3018 of file connection.c.
#define MHD_MIN_REASONABLE_HEADERS_SIZE_ 26 |
A reasonable headers size (excluding request line) that should be sufficient for basic simple requests. When no space left in the receiving buffer try to avoid replying with the status code 431 "Request Header Fields Too Large" if headers size is smaller then this value.
Definition at line 3029 of file connection.c.
#define MHD_MIN_REASONABLE_REQ_CHUNK_LINE_LENGTH_ 4 |
A reasonable minimal chunk line length. When no space left in the receiving buffer reply with 413 "Content Too Large" if the chunk line length is larger than this value.
Definition at line 3060 of file connection.c.
#define MHD_MIN_REASONABLE_REQ_METHOD_SIZE_ 16 |
A reasonable request method string size that should be sufficient for basic simple requests. When no space left in the receiving buffer try to avoid replying with the status code 501 "Not Implemented" if the request method size is smaller then this value.
Definition at line 3051 of file connection.c.
#define MHD_MIN_REASONABLE_REQ_TARGET_SIZE_ 40 |
A reasonable request target (the request URI) size that should be sufficient for basic simple requests. When no space left in the receiving buffer try to avoid replying with the status code 414 "URI Too Long" if the request target size is smaller then this value.
Definition at line 3040 of file connection.c.
#define MHD_SENFILE_CHUNK_ (0x20000) |
sendfile() chuck size
Definition at line 592 of file connection.c.
#define MHD_SENFILE_CHUNK_THR_P_C_ (0x200000) |
sendfile() chuck size for thread-per-connection
Definition at line 597 of file connection.c.
#define REQ_HTTP_VER_IS_NOT_SUPPORTED "" |
Response text used when the request HTTP version is not supported.
Definition at line 585 of file connection.c.
#define REQ_HTTP_VER_IS_TOO_OLD "" |
Response text used when the request HTTP version is too old.
Definition at line 574 of file connection.c.
#define REQUEST_CHUNK_TOO_LARGE "" |
Response text used when the request HTTP chunk is too large.
Definition at line 521 of file connection.c.
#define REQUEST_CHUNKED_MALFORMED "" |
Response text used when the request HTTP chunked encoding is malformed.
Definition at line 509 of file connection.c.
#define REQUEST_CONTENTLENGTH_MALFORMED "" |
Response text used when the request HTTP chunked encoding is malformed.
Definition at line 546 of file connection.c.
#define REQUEST_CONTENTLENGTH_TOOLARGE "" |
Response text used when the request HTTP content is too large.
Definition at line 533 of file connection.c.
#define REQUEST_LACKS_HOST "" |
Response text used when the request (http header) does not contain a "Host:" header and still claims to be HTTP 1.1.
Intentionally empty here to keep our memory footprint minimal.
Definition at line 454 of file connection.c.
#define REQUEST_LENGTH_WITH_TR_ENCODING "" |
Response text used when the request has unsupported both headers: "Transfer-Encoding:" and "Content-Length:"
Definition at line 482 of file connection.c.
#define REQUEST_MALFORMED "" |
Response text used when the request (http header) is malformed.
Intentionally empty here to keep our memory footprint minimal.
Definition at line 497 of file connection.c.
#define REQUEST_UNSUPPORTED_TR_ENCODING "" |
Response text used when the request has unsupported "Transfer-Encoding:".
Definition at line 467 of file connection.c.
#define RQ_LINE_TOO_MANY_WSP "" |
Response text used when the request line has more then two whitespaces.
Definition at line 198 of file connection.c.
#define RQ_TARGET_INVALID_CHAR "" |
Response text used when the request line has invalid characters in URI.
Definition at line 272 of file connection.c.
#define transmit_error_response_header | ( | c, | |
code, | |||
m, | |||
hd_n, | |||
hd_n_l, | |||
hd_v, | |||
hd_v_l | |||
) |
Transmit static string as error response and add specified header
Definition at line 2940 of file connection.c.
#define transmit_error_response_static | ( | c, | |
code, | |||
msg | |||
) |
Transmit static string as error response
Definition at line 2932 of file connection.c.
enum MHD_HdrLineReadRes_ |
Results of header line reading
Definition at line 5678 of file connection.c.
The stage of input data processing. Used for out-of-memory (in the pool) handling.
Definition at line 2980 of file connection.c.
enum replyBodyUse |
This enum type describes requirements for reply body and reply bode-specific headers (namely Content-Length, Transfer-Encoding).
Definition at line 2103 of file connection.c.
|
static |
Add user-defined headers from response object to the text buffer.
buf | the buffer to add headers to |
ppos | the pointer to the position in the buf |
buf_size | the size of the buf |
response | the response |
filter_transf_enc | skip "Transfer-Encoding" header if any |
filter_content_len | skip "Content-Length" header if any |
add_close | add "close" token to the "Connection:" header (if any), ignored if no "Connection:" header was added by user or if "close" token is already present in "Connection:" header |
add_keep_alive | add "Keep-Alive" token to the "Connection:" header (if any) |
< a short alias
< Iterates through User-specified headers
< the size of current element to be added to the buf
Definition at line 2352 of file connection.c.
References MHD_Response::first_header, MHD_Response::flags, MHD_Response::flags_auto, MHD_HTTP_Res_Header::header, MHD_HTTP_Res_Header::header_size, MHD_HTTP_Res_Header::kind, mhd_assert, MHD_HEADER_KIND, MHD_HTTP_HEADER_CONNECTION, MHD_HTTP_HEADER_CONTENT_LENGTH, MHD_HTTP_HEADER_TRANSFER_ENCODING, MHD_RAF_HAS_CONNECTION_CLOSE, MHD_RAF_HAS_CONNECTION_HDR, MHD_RAF_HAS_CONTENT_LENGTH, MHD_RAF_HAS_TRANS_ENC_CHUNKED, MHD_RF_INSANITY_HEADER_CONTENT_LENGTH, MHD_STATICSTR_LEN_, MHD_str_equal_caseless_bin_n_(), MHD_str_equal_caseless_n_(), MHD_HTTP_Res_Header::next, NULL, MHD_HTTP_Res_Header::value, and MHD_HTTP_Res_Header::value_size.
Referenced by build_header_response().
|
static |
Append data to the buffer if enough space is available, update position.
[out] | buf | the buffer to append data to |
[in,out] | ppos | the pointer to position in the buffer |
buf_size | the size of the buffer | |
append | the data to append | |
append_size | the size of the append |
Definition at line 2303 of file connection.c.
References mhd_assert, and NULL.
Referenced by build_header_response().
|
static |
Allocate the connection's write buffer (if necessary) and fill it with response footers. Works only for chunked responses as other responses do not need and do not support any kind of footers.
connection | the connection |
< the buffer to write footers to
< the size of the buf
< the used size of the buf
< a short alias
Definition at line 2698 of file connection.c.
References MHD_Reply_Properties::chunked, connection_maximize_write_buffer(), MHD_Response::first_header, MHD_HTTP_Res_Header::header, MHD_HTTP_Res_Header::header_size, MHD_HTTP_Res_Header::kind, mhd_assert, MHD_CONNECTION_CHUNKED_BODY_SENT, MHD_FOOTER_KIND, MHD_NO, MHD_YES, MHD_HTTP_Res_Header::next, NULL, MHD_Reply::props, MHD_Reply::response, MHD_Connection::rp, MHD_Connection::state, MHD_HTTP_Res_Header::value, MHD_HTTP_Res_Header::value_size, MHD_Connection::write_buffer, MHD_Connection::write_buffer_append_offset, and MHD_Connection::write_buffer_size.
Referenced by MHD_connection_handle_idle().
|
static |
Allocate the connection's write buffer and fill it with all of the headers from the response. Required headers are added here.
connection | the connection |
< a short alias
< a short alias
< the output buffer
< append offset in the buf
< the size of the buf
< the size of current element to be added to the buf
< the response code
< Use "Connection: close" header
< Use "Connection: Keep-Alive" header
Definition at line 2465 of file connection.c.
References add_user_headers(), buffer_append(), buffer_append_s, check_connection_reply(), MHD_Reply_Properties::chunked, connection_maximize_write_buffer(), MHD_Connection::daemon, MHD_Response::flags, MHD_Response::flags_auto, get_date_header(), MHD_Request::http_ver, MHD_Connection::keepalive, mhd_assert, MHD_CONN_MUST_CLOSE, MHD_CONN_MUST_UPGRADE, MHD_CONN_USE_KEEPALIVE, MHD_get_reason_phrase_for(), MHD_get_reason_phrase_len_for(), MHD_HTTP_HEADER_CONNECTION, MHD_HTTP_HEADER_CONTENT_LENGTH, MHD_HTTP_HEADER_TRANSFER_ENCODING, MHD_HTTP_VER_1_0, MHD_HTTP_VERSION_1_0, MHD_HTTP_VERSION_1_1, MHD_NO, MHD_RAF_HAS_CONNECTION_HDR, MHD_RAF_HAS_CONTENT_LENGTH, MHD_RAF_HAS_DATE_HDR, MHD_RAF_HAS_TRANS_ENC_CHUNKED, MHD_RF_HEAD_ONLY_RESPONSE, MHD_RF_HTTP_1_0_SERVER, MHD_RF_INSANITY_HEADER_CONTENT_LENGTH, MHD_RF_SEND_KEEP_ALIVE_HEADER, MHD_SIZE_UNKNOWN, MHD_uint16_to_str(), MHD_uint64_to_str(), MHD_USE_SUPPRESS_DATE_NO_CLOCK, MHD_YES, NULL, MHD_Daemon::options, MHD_Reply::props, MHD_Reply::response, MHD_Reply::responseCode, MHD_Reply::responseIcy, MHD_Connection::rp, MHD_Connection::rq, MHD_Reply_Properties::send_reply_body, setup_reply_properties(), MHD_Response::total_size, MHD_Reply_Properties::use_reply_body_headers, MHD_Connection::write_buffer, MHD_Connection::write_buffer_append_offset, and MHD_Connection::write_buffer_size.
Referenced by MHD_connection_handle_idle(), and transmit_error_response_len().
|
static |
Call the handler of the application for this connection. Handles chunking of the upload as well as normal uploads.
connection | connection we're processing |
Definition at line 4356 of file connection.c.
References _, MHD_Request::client_aware, MHD_Request::client_context, CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_Daemon::default_handler, MHD_Daemon::default_handler_cls, MHD_Connection::in_access_handler, MHD_Request::method, MHD_NO, NULL, MHD_Reply::response, MHD_Connection::rp, MHD_Connection::rq, MHD_Request::url, and MHD_Request::version.
Referenced by MHD_connection_handle_idle().
|
static |
Check whether enough space is available in the read buffer for the next operation. Handles grow of the buffer if required and error conditions (when buffer grow is required but not possible). Must be called only when processing the event loop states and when reading is required for the next phase.
c | the connection to check |
The increase of read buffer size is desirable.
The increase of read buffer size is a hard requirement.
Definition at line 3556 of file connection.c.
References MHD_Request::current_chunk_offset, MHD_Request::current_chunk_size, MHD_Connection::daemon, MHD_Connection::discard_request, MHD_Connection::event_loop_info, handle_recv_no_space(), has_unprocessed_upload_body_data_in_buffer(), MHD_Request::have_chunked_upload, MHD_Request::http_mthd, mhd_assert, MHD_CHUNK_HEADER_REASONABLE_LEN, MHD_CONNECTION_BODY_RECEIVED, MHD_CONNECTION_BODY_RECEIVING, MHD_CONNECTION_CHUNKED_BODY_READY, MHD_CONNECTION_CHUNKED_BODY_SENT, MHD_CONNECTION_CHUNKED_BODY_UNREADY, MHD_CONNECTION_CLOSED, MHD_CONNECTION_CONTINUE_SENDING, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_FOOTERS_RECEIVING, MHD_CONNECTION_FOOTERS_SENDING, MHD_CONNECTION_FULL_REPLY_SENT, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_HEADERS_PROCESSED, MHD_CONNECTION_HEADERS_RECEIVED, MHD_CONNECTION_HEADERS_SENDING, MHD_CONNECTION_HEADERS_SENT, MHD_CONNECTION_INIT, MHD_CONNECTION_NORMAL_BODY_READY, MHD_CONNECTION_NORMAL_BODY_UNREADY, MHD_CONNECTION_REQ_HEADERS_RECEIVING, MHD_CONNECTION_REQ_LINE_RECEIVED, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_CONNECTION_START_REPLY, MHD_D_IS_USING_THREADS_, MHD_EVENT_LOOP_INFO_PROCESS, MHD_EVENT_LOOP_INFO_READ, MHD_HTTP_MTHD_NO_METHOD, MHD_PROC_RECV_BODY_CHUNKED, MHD_PROC_RECV_BODY_NORMAL, MHD_PROC_RECV_FOOTERS, MHD_PROC_RECV_HEADERS, MHD_PROC_RECV_HTTPVER, MHD_PROC_RECV_INIT, MHD_PROC_RECV_METHOD, MHD_PROC_RECV_URI, MHD_SIZE_UNKNOWN, MHD_Daemon::pool_increment, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Request::remaining_upload_size, MHD_Request::req_target_len, MHD_Connection::rq, MHD_Connection::state, and try_grow_read_buffer().
Referenced by MHD_connection_update_event_loop_info().
|
static |
Check whether queued response is suitable for connection.
connection | to connection to check |
< a short alias
< a short alias
Definition at line 2261 of file connection.c.
References _, MHD_Connection::daemon, MHD_Response::flags_auto, mhd_assert, MHD_RAF_HAS_CONTENT_LENGTH, MHD_Reply::props, MHD_Reply::response, MHD_Reply::responseCode, MHD_Connection::rp, MHD_Response::total_size, and MHD_Reply_Properties::use_reply_body_headers.
Referenced by build_header_response().
|
static |
Check if we are done sending the write-buffer. If so, transition into "next_state".
connection | connection to check write status for |
next_state | the next state to transition to |
Definition at line 4690 of file connection.c.
References MHD_NO, MHD_YES, MHD_Connection::state, MHD_Connection::write_buffer_append_offset, and MHD_Connection::write_buffer_send_offset.
Referenced by MHD_connection_handle_write().
|
static |
Clean up the state of the given connection and move it into the clean up queue for final disposal.
connection | handle for the connection to clean up |
Definition at line 6968 of file connection.c.
References _, MHD_Daemon::cleanup_connection_mutex, MHD_Daemon::cleanup_head, MHD_Daemon::cleanup_tail, MHD_Connection::connection_timeout_ms, MHD_Daemon::connection_timeout_ms, MHD_Daemon::connections_head, MHD_Daemon::connections_tail, MHD_Connection::daemon, DLL_insert, DLL_remove, MHD_Connection::in_cleanup, MHD_Connection::in_idle, MHD_Daemon::itc, MHD_Daemon::manual_timeout_head, MHD_Daemon::manual_timeout_tail, mhd_assert, MHD_D_IS_USING_THREAD_PER_CONN_, MHD_D_IS_USING_THREADS_, MHD_destroy_response(), MHD_mutex_lock_chk_, MHD_mutex_unlock_chk_, MHD_thread_handle_ID_is_current_thread_, MHD_Daemon::normal_timeout_head, MHD_Daemon::normal_timeout_tail, NULL, MHD_Reply::response, MHD_Connection::resuming, MHD_Connection::rp, MHD_Connection::suspended, MHD_Daemon::suspended_connections_head, MHD_Daemon::suspended_connections_tail, MHD_Daemon::worker_pool, and XDLL_remove.
Referenced by MHD_connection_handle_idle().
|
static |
Add an entry to the HTTP headers of a connection. If this fails, transmit an error response (request too big).
cls | the context (connection) |
kind | kind of the value |
key | key for the value |
key_size | number of bytes in key |
value | the value itself |
value_size | number of bytes in value |
Definition at line 3876 of file connection.c.
References _, MHD_Connection::daemon, ERR_MSG_REQUEST_TOO_BIG, MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE, MHD_NO, MHD_set_connection_value_n(), MHD_YES, and transmit_error_response_static.
Referenced by process_request_target().
|
static |
Check whether connection has timed out.
c | the connection to check |
Definition at line 6916 of file connection.c.
References _, MHD_Connection::connection_timeout_ms, MHD_Connection::daemon, MHD_Connection::last_activity, MHD_monotonic_msec_counter(), PRIu64, MHD_Connection::suspended, and UINT64_MAX.
Referenced by MHD_connection_handle_idle().
|
static |
A serious error occurred, close the connection (and notify the application).
connection | connection to close with error |
emsg | error message (can be NULL) |
Definition at line 1361 of file connection.c.
References MHD_Connection::daemon, MHD_Connection::discard_request, MHD_connection_close_(), MHD_REQUEST_TERMINATED_WITH_ERROR, NULL, and MHD_Connection::stop_with_error.
Referenced by get_request_line_inner(), handle_recv_no_space(), and send_redirect_fixed_rq_target().
|
static |
Allocate the maximum available amount of memory from MemoryPool for write buffer.
connection | the connection whose write buffer is being manipulated |
< a short alias
Definition at line 1997 of file connection.c.
References mhd_assert, MHD_pool_get_free(), MHD_pool_is_resizable_inplace(), MHD_pool_reallocate(), NULL, MHD_Connection::pool, MHD_Connection::write_buffer, MHD_Connection::write_buffer_append_offset, MHD_Connection::write_buffer_send_offset, and MHD_Connection::write_buffer_size.
Referenced by build_connection_chunked_response_footer(), and build_header_response().
|
static |
Reset connection after request-reply cycle.
connection | the connection to process |
reuse | the flag to choose whether to close connection or prepare connection for the next request processing |
< a short alias
Definition at line 7086 of file connection.c.
References MHD_Request::client_aware, MHD_Request::client_context, MHD_Connection::continue_message_write_offset, MHD_Connection::daemon, MHD_Connection::discard_request, MHD_Connection::event_loop_info, MHD_Connection::keepalive, mhd_assert, MHD_CONN_KEEPALIVE_UNKOWN, MHD_connection_close_(), MHD_CONNECTION_INIT, MHD_destroy_response(), MHD_EVENT_LOOP_INFO_PROCESS, MHD_EVENT_LOOP_INFO_READ, MHD_pool_reset(), MHD_REQUEST_TERMINATED_COMPLETED_OK, MHD_REQUEST_TERMINATED_WITH_ERROR, MHD_Daemon::notify_completed, MHD_Daemon::notify_completed_cls, NULL, MHD_Connection::pool, MHD_Daemon::pool_size, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Reply::response, MHD_Connection::rp, MHD_Connection::rq, MHD_Connection::state, MHD_Connection::stop_with_error, MHD_Connection::write_buffer, MHD_Connection::write_buffer_append_offset, MHD_Connection::write_buffer_send_offset, and MHD_Connection::write_buffer_size.
Referenced by MHD_connection_handle_idle().
|
static |
Shrink connection read buffer to the zero size of free space in the buffer
connection | the connection whose read buffer is being manipulated |
< a short alias
Definition at line 1958 of file connection.c.
References mhd_assert, MHD_pool_deallocate(), MHD_pool_is_resizable_inplace(), MHD_pool_reallocate(), NULL, MHD_Connection::pool, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, and MHD_Connection::read_buffer_size.
Referenced by connection_switch_from_recv_to_send().
|
static |
Switch connection from recv mode to send mode.
Current request header or body will not be read anymore, response must be assigned to connection.
connection | the connection to prepare for sending. |
Definition at line 2092 of file connection.c.
References connection_shrink_read_buffer().
Referenced by MHD_connection_handle_idle().
|
static |
Produce HTTP DATE header. Result is always 37 bytes long (plus one terminating null).
[out] | header | where to write the header, with at least 38 bytes available space. |
Definition at line 1844 of file connection.c.
References get_date_str().
Referenced by build_header_response().
|
static |
Produce time stamp.
Result is NOT null-terminated. Result is always 29 bytes long.
[out] | date | where to write the time stamp, with at least 29 bytes available space. |
Definition at line 1759 of file connection.c.
References MHD_uint16_to_str(), MHD_uint8_to_str_pad(), and NULL.
Referenced by get_date_header().
|
static |
Select the HTTP error status code for "out of receive buffer space" error.
c | the connection to process |
stage | the current stage of request receiving |
add_element | the optional pointer to the element failed to be processed or added, the meaning of the element depends on the stage. Could be not zero-terminated and can contain binary zeros. Can be NULL. |
add_element_size | the size of the add_element |
Definition at line 3076 of file connection.c.
References MHD_Request::field_lines, MHD_Request::http_mthd, MHD_Request::method, mhd_assert, MHD_CONNECTION_HEADERS_RECEIVED, MHD_HEADER_KIND, MHD_HTTP_CONTENT_TOO_LARGE, MHD_HTTP_HEADER_HOST, MHD_HTTP_MTHD_OTHER, MHD_HTTP_NOT_IMPLEMENTED, MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE, MHD_HTTP_URI_TOO_LONG, MHD_lookup_connection_value_n(), MHD_MAX_REASONABLE_HEADERS_SIZE_, MHD_MAX_REASONABLE_REQ_TARGET_SIZE_, MHD_MIN_REASONABLE_HEADERS_SIZE_, MHD_MIN_REASONABLE_REQ_CHUNK_LINE_LENGTH_, MHD_MIN_REASONABLE_REQ_METHOD_SIZE_, MHD_MIN_REASONABLE_REQ_TARGET_SIZE_, MHD_NO, MHD_PROC_RECV_BODY_CHUNKED, MHD_PROC_RECV_HEADERS, MHD_STATICSTR_LEN_, MHD_str_equal_caseless_bin_n_(), NULL, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Request::req_target_len, MHD_Connection::rq, MHD_StartOrSize::size, MHD_StartOrSize::start, and MHD_Connection::state.
Referenced by handle_req_chunk_size_line_no_space(), and handle_req_headers_no_space().
|
static |
Find the end of the request header line and make basic header parsing. Handle errors and header folding.
c | the connection to process | |
process_footers | if true then footers are processed, if false then headers are processed | |
[out] | hdr_name | the name of the parsed header (field) |
[out] | hdr_name | the value of the parsed header (field) |
< The position of the currently processed character
The full length of the line, including CRLF (or bare LF).
Definition at line 5711 of file connection.c.
References _, BARE_CR_IN_FOOTER, BARE_CR_IN_HEADER, BARE_LF_IN_FOOTER, BARE_LF_IN_HEADER, MHD_Daemon::client_discipline, MHD_Connection::daemon, ERR_RSP_EMPTY_FOOTER_NAME, ERR_RSP_EMPTY_HEADER_NAME, ERR_RSP_FOOTER_WITHOUT_COLON, ERR_RSP_INVALID_CHR_IN_HEADER, ERR_RSP_OBS_FOLD, ERR_RSP_OBS_FOLD_FOOTER, ERR_RSP_WSP_BEFORE_FOOTER, ERR_RSP_WSP_BEFORE_HEADER, ERR_RSP_WSP_IN_FOOTER_NAME, ERR_RSP_WSP_IN_HEADER_NAME, MHD_HeadersProcessing::hdr, MHD_Request::hdrs, _MHD_str_w_len::len, MHD_ALLOW_BARE_LF_AS_CRLF_, mhd_assert, MHD_CONNECTION_FOOTERS_RECEIVING, MHD_CONNECTION_REQ_HEADERS_RECEIVING, MHD_HDR_LINE_READING_DATA_ERROR, MHD_HDR_LINE_READING_GOT_END_OF_HEADER, MHD_HDR_LINE_READING_GOT_HEADER, MHD_HDR_LINE_READING_NEED_MORE_DATA, MHD_HTTP_BAD_REQUEST, MHD_HeaderProcessing::name_end_found, MHD_HeaderProcessing::name_len, MHD_Request::num_cr_sp_replaced, MHD_HeaderProcessing::proc_pos, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Connection::rq, MHD_Request::skipped_broken_lines, MHD_HeaderProcessing::starts_with_ws, MHD_Connection::state, _MHD_str_w_len::str, transmit_error_response_static, MHD_HeaderProcessing::value_start, and MHD_HeaderProcessing::ws_start.
Referenced by get_req_headers().
|
static |
Find the end of the request headers and make basic header parsing. Advance to the next state when done, handle errors.
c | the connection to process |
process_footers | if true then footers are processed, if false then headers are processed |
The position of the terminating NUL after the last character of the last header element.
Definition at line 6176 of file connection.c.
References _, MHD_Connection::daemon, MHD_Connection::discard_request, MHD_Request::field_lines, get_req_header(), handle_req_footers_no_space(), handle_req_headers_no_space(), MHD_Request::header_size, MHD_Request::headers_received_tail, HTTP_VER_LEN, _MHD_str_w_len::len, MHD_Request::method, mhd_assert, MHD_BUF_INC_SIZE, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_FOOTERS_RECEIVING, MHD_CONNECTION_HEADERS_RECEIVED, MHD_CONNECTION_REQ_HEADERS_RECEIVING, MHD_FOOTER_KIND, MHD_HDR_LINE_READING_DATA_ERROR, MHD_HDR_LINE_READING_GOT_END_OF_HEADER, MHD_HDR_LINE_READING_GOT_HEADER, MHD_HDR_LINE_READING_NEED_MORE_DATA, MHD_HEADER_KIND, MHD_NO, MHD_set_connection_value_n_nocheck_(), NULL, MHD_Request::num_cr_sp_replaced, PRIu64, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, reset_rq_header_processing_state(), MHD_Connection::rq, MHD_StartOrSize::size, MHD_Request::skipped_broken_lines, MHD_StartOrSize::start, MHD_Connection::state, MHD_Connection::stop_with_error, _MHD_str_w_len::str, MHD_HTTP_Header::value, and MHD_Request::version.
Referenced by MHD_connection_handle_idle().
|
static |
Find and parse the request line. Advance to the next state when done, handle errors.
c | the connection to process |
Definition at line 5619 of file connection.c.
References MHD_Daemon::client_discipline, MHD_Connection::daemon, get_request_line_inner(), MHD_Request::hdrs, MHD_Request::http_ver, HTTP_VER_LEN, mhd_assert, MHD_CONNECTION_REQ_LINE_RECEIVED, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_HTTP_BAD_REQUEST, MHD_HTTP_VER_INVALID, NULL, MHD_RequestLineProcessing::num_ws_in_uri, MHD_RequestLineProcessing::proc_pos, process_request_target(), MHD_Connection::read_buffer, REQUEST_MALFORMED, MHD_Connection::rq, MHD_HeadersProcessing::rq_line, RQ_TARGET_INVALID_CHAR, MHD_RequestLineProcessing::rq_tgt, send_redirect_fixed_rq_target(), MHD_Connection::state, transmit_error_response_static, MHD_Request::url, MHD_Request::url_len, and MHD_Request::version.
Referenced by MHD_connection_handle_idle().
|
static |
Find and parse the request line.
c | the connection to process |
< The current processing position
Definition at line 4891 of file connection.c.
References _, BARE_CR_IN_HEADER, BARE_LF_IN_HEADER, MHD_Daemon::client_discipline, connection_close_error(), MHD_Connection::daemon, MHD_Request::hdrs, MHD_Request::http_mthd, HTTP_VER_LEN, MHD_RequestLineProcessing::last_ws_end, MHD_RequestLineProcessing::last_ws_start, MHD_Request::method, MHD_ALLOW_BARE_LF_AS_CRLF_, mhd_assert, MHD_CONNECTION_INIT, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_HTTP_BAD_REQUEST, MHD_HTTP_MTHD_DELETE, MHD_HTTP_MTHD_NO_METHOD, MHD_MAX_EMPTY_LINES_SKIP, NULL, MHD_Request::num_cr_sp_replaced, MHD_RequestLineProcessing::num_ws_in_uri, parse_http_std_method(), parse_http_version(), MHD_RequestLineProcessing::proc_pos, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Request::req_target_len, REQUEST_MALFORMED, MHD_Connection::rq, MHD_HeadersProcessing::rq_line, RQ_LINE_TOO_MANY_WSP, MHD_RequestLineProcessing::rq_tgt, MHD_RequestLineProcessing::rq_tgt_qmark, MHD_RequestLineProcessing::skipped_empty_lines, MHD_Connection::state, transmit_error_response_static, MHD_Request::url, MHD_Request::url_len, and MHD_Request::version.
Referenced by get_request_line().
|
static |
Handle situation with read buffer exhaustion. Must be called when no more space left in the read buffer, no more space left in the memory pool to grow the read buffer, but more data need to be received from the client. Could be called when the result of received data processing cannot be stored in the memory pool (like some header).
c | the connection to process |
stage | the receive stage where the exhaustion happens. |
Definition at line 3405 of file connection.c.
References _, connection_close_error(), MHD_Request::current_chunk_offset, MHD_Request::current_chunk_size, MHD_Connection::daemon, ERR_MSG_REQUEST_TOO_BIG, ERROR_MSG_DATA_NOT_HANDLED_BY_APP, handle_req_chunk_size_line_no_space(), handle_req_footers_no_space(), handle_req_headers_no_space(), has_unprocessed_upload_body_data_in_buffer(), MHD_Request::have_chunked_upload, MHD_Request::http_mthd, MHD_Request::http_ver, mhd_assert, MHD_CONNECTION_BODY_RECEIVING, MHD_CONNECTION_FOOTERS_RECEIVING, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_INIT, MHD_CONNECTION_REQ_HEADERS_RECEIVING, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_D_IS_USING_THREADS_, MHD_HTTP_INTERNAL_SERVER_ERROR, MHD_HTTP_MTHD_DELETE, MHD_HTTP_MTHD_NO_METHOD, MHD_HTTP_URI_TOO_LONG, MHD_HTTP_VER_UNKNOWN, MHD_PROC_RECV_BODY_CHUNKED, MHD_PROC_RECV_BODY_NORMAL, MHD_PROC_RECV_COOKIE, MHD_PROC_RECV_FOOTERS, MHD_PROC_RECV_HEADERS, MHD_PROC_RECV_HTTPVER, MHD_PROC_RECV_INIT, MHD_PROC_RECV_METHOD, MHD_PROC_RECV_URI, NULL, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::rq, MHD_Request::some_payload_processed, MHD_Connection::state, and transmit_error_response_static.
Referenced by check_and_grow_read_buffer_space().
|
static |
Send error reply when receive buffer space exhausted while receiving the chunk size line.
c | the connection to handle |
add_header | the optional pointer to the partially received the current chunk size line. Could be not zero-terminated and can contain binary zeros. Can be NULL. |
add_header_size | the size of the add_header |
Definition at line 3340 of file connection.c.
References ERR_MSG_REQUEST_CHUNK_LINE_EXT_TOO_BIG, ERR_MSG_REQUEST_CHUNK_LINE_TOO_BIG, get_no_space_err_status_code(), MHD_HTTP_CONTENT_TOO_LARGE, MHD_PROC_RECV_BODY_CHUNKED, NULL, and transmit_error_response_static.
Referenced by handle_recv_no_space().
|
static |
Send error reply when receive buffer space exhausted while receiving or storing the request footers (for chunked requests).
c | the connection to handle |
add_footer | the optional pointer to the current footer string being processed or the footer failed to be added. Could be not zero-terminated and can contain binary zeros. Can be NULL. |
add_footer_size | the size of the add_footer |
Definition at line 3380 of file connection.c.
References ERR_MSG_REQUEST_FOOTER_TOO_BIG, MHD_Request::have_chunked_upload, mhd_assert, MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE, MHD_Connection::rq, and transmit_error_response_static.
Referenced by get_req_headers(), and handle_recv_no_space().
|
static |
Send error reply when receive buffer space exhausted while receiving or storing the request headers
c | the connection to handle |
add_header | the optional pointer to the current header string being processed or the header failed to be added. Could be not zero-terminated and can contain binary zeros. Can be NULL. |
add_header_size | the size of the add_header |
Definition at line 3289 of file connection.c.
References ERR_MSG_REQUEST_HEADER_TOO_BIG, get_no_space_err_status_code(), MHD_PROC_RECV_HEADERS, and transmit_error_response_static.
Referenced by get_req_headers(), and handle_recv_no_space().
|
static |
Check whether the read buffer has any upload body data ready to be processed. Must be called only when connection is in MHD_CONNECTION_BODY_RECEIVING state.
c | the connection to check |
Definition at line 2958 of file connection.c.
References MHD_Request::current_chunk_offset, MHD_Request::current_chunk_size, MHD_Request::have_chunked_upload, mhd_assert, MHD_CONNECTION_BODY_RECEIVING, MHD_Connection::read_buffer_offset, MHD_Request::remaining_upload_size, MHD_Connection::rq, and MHD_Connection::state.
Referenced by check_and_grow_read_buffer_space(), handle_recv_no_space(), and MHD_connection_update_event_loop_info().
|
static |
Check whether reply body must be used.
If reply body is needed, it could be zero-sized.
connection | the connection to check |
rcode | the response code |
< a short alias
Definition at line 2140 of file connection.c.
References MHD_Request::http_mthd, mhd_assert, MHD_HTTP_MTHD_CONNECT, MHD_HTTP_MTHD_HEAD, MHD_HTTP_NO_CONTENT, MHD_HTTP_NOT_MODIFIED, NULL, MHD_Reply::response, MHD_Connection::rp, RP_BODY_HEADERS_ONLY, RP_BODY_NONE, RP_BODY_SEND, and MHD_Connection::rq.
Referenced by MHD_queue_response(), and setup_reply_properties().
|
static |
Are we allowed to keep the given connection alive? We can use the TCP stream for a second request if the connection is HTTP 1.1 and the "Connection" header either does not exist or is not set to "close", or if the connection is HTTP 1.0 and the "Connection" header is explicitly set to "keep-alive". If no HTTP version is specified (or if it is not 1.0 or 1.1), we definitively close the connection. If the "Connection" header is not exactly "close" or "keep-alive", we proceed to use the default for the respective HTTP version. If response has HTTP/1.0 flag or has "Connection: close" header then connection must be closed. If full request has not been read then connection must be closed as well.
connection | the connection to check for keepalive |
< a short alias
< a short alias
Definition at line 1691 of file connection.c.
References MHD_Connection::discard_request, MHD_Response::flags, MHD_Response::flags_auto, MHD_Request::http_ver, MHD_Connection::keepalive, mhd_assert, MHD_CONN_MUST_CLOSE, MHD_CONN_MUST_UPGRADE, MHD_CONN_USE_KEEPALIVE, MHD_HTTP_HEADER_CONNECTION, MHD_HTTP_VER_1_0, MHD_IS_HTTP_VER_1_1_COMPAT, MHD_IS_HTTP_VER_SUPPORTED, MHD_lookup_header_s_token_ci, MHD_RAF_HAS_CONNECTION_CLOSE, MHD_RF_HTTP_1_0_COMPATIBLE_STRICT, MHD_RF_HTTP_1_0_SERVER, NULL, MHD_Connection::read_closed, MHD_Reply::response, MHD_Connection::rp, MHD_Connection::rq, and MHD_Connection::stop_with_error.
Referenced by setup_reply_properties().
void * MHD_connection_alloc_memory_ | ( | struct MHD_Connection * | connection, |
size_t | size | ||
) |
Allocate memory from connection's memory pool. If memory pool doesn't have enough free memory but read or write buffer have some unused memory, the size of the buffer will be reduced as needed.
connection | the connection to use |
size | the size of allocated memory area |
< The required amount of additional free memory
Definition at line 651 of file connection.c.
References mhd_assert, MHD_pool_allocate(), MHD_pool_is_resizable_inplace(), MHD_pool_reallocate(), MHD_pool_try_alloc(), NULL, MHD_Connection::pool, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Connection::write_buffer, MHD_Connection::write_buffer_append_offset, MHD_Connection::write_buffer_send_offset, and MHD_Connection::write_buffer_size.
Referenced by MHD_set_connection_value_n_nocheck_(), and try_ready_normal_body().
void MHD_connection_close_ | ( | struct MHD_Connection * | connection, |
enum MHD_RequestTerminationCode | termination_code | ||
) |
Close the given connection and give the specified termination code to the user.
connection | connection to close |
termination_code | termination reason to give |
Definition at line 1246 of file connection.c.
References MHD_Request::client_aware, MHD_Request::client_context, MHD_Connection::daemon, mhd_assert, MHD_connection_mark_closed_(), MHD_D_IS_USING_THREADS_, MHD_destroy_response(), MHD_pool_destroy(), MHD_thread_handle_ID_is_current_thread_, MHD_Daemon::notify_completed, MHD_Daemon::notify_completed_cls, NULL, MHD_Connection::pool, MHD_Reply::response, MHD_Connection::rp, MHD_Connection::rq, and MHD_Connection::suspended.
Referenced by connection_close_error(), connection_reset(), MHD_connection_handle_idle(), MHD_connection_handle_read(), and try_ready_normal_body().
enum MHD_Result MHD_connection_handle_idle | ( | struct MHD_Connection * | connection | ) |
This function was created to handle per-connection processing that has to happen even if the socket cannot be read or written to. All implementations (multithreaded, external select, internal select) call this function.
connection | connection to handle |
Definition at line 7174 of file connection.c.
References _, build_connection_chunked_response_footer(), build_header_response(), call_connection_handler(), MHD_Reply_Properties::chunked, cleanup_connection(), connection_check_timedout(), CONNECTION_CLOSE_ERROR, connection_reset(), connection_switch_from_recv_to_send(), MHD_Connection::continue_message_write_offset, MHD_Response::crc, MHD_Connection::daemon, MHD_Connection::discard_request, get_req_headers(), get_request_line(), MHD_Request::have_chunked_upload, HTTP_100_CONTINUE, MHD_Request::http_ver, MHD_Connection::in_idle, MHD_Connection::keepalive, mhd_assert, MHD_CONN_USE_KEEPALIVE, MHD_CONNECTION_BODY_RECEIVED, MHD_CONNECTION_BODY_RECEIVING, MHD_CONNECTION_CHUNKED_BODY_READY, MHD_CONNECTION_CHUNKED_BODY_SENT, MHD_CONNECTION_CHUNKED_BODY_UNREADY, MHD_connection_close_(), MHD_CONNECTION_CLOSED, MHD_CONNECTION_CONTINUE_SENDING, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_FOOTERS_RECEIVING, MHD_CONNECTION_FOOTERS_SENDING, MHD_CONNECTION_FULL_REPLY_SENT, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_HEADERS_PROCESSED, MHD_CONNECTION_HEADERS_RECEIVED, MHD_CONNECTION_HEADERS_SENDING, MHD_CONNECTION_HEADERS_SENT, MHD_CONNECTION_INIT, MHD_CONNECTION_NORMAL_BODY_READY, MHD_CONNECTION_NORMAL_BODY_UNREADY, MHD_CONNECTION_REQ_HEADERS_RECEIVING, MHD_CONNECTION_REQ_LINE_RECEIVED, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_CONNECTION_START_REPLY, MHD_connection_update_event_loop_info(), MHD_D_IS_USING_EPOLL_, MHD_D_IS_USING_THREADS_, MHD_destroy_response(), MHD_FUNC_, MHD_HTTP_PROCESSING, MHD_IS_HTTP_VER_SUPPORTED, MHD_mutex_lock_chk_, MHD_mutex_unlock_chk_, MHD_NO, MHD_REQUEST_TERMINATED_TIMEOUT_REACHED, MHD_response_execute_upgrade_(), MHD_STATICSTR_LEN_, MHD_thread_handle_ID_is_current_thread_, MHD_TLS_CONN_CONNECTED, MHD_TLS_CONN_NO_TLS, MHD_YES, MHD_Response::mutex, need_100_continue(), NULL, MHD_Request::num_cr_sp_replaced, parse_connection_headers(), process_request_body(), MHD_Reply::props, MHD_Connection::read_buffer_offset, MHD_Connection::read_closed, MHD_Request::remaining_upload_size, reset_rq_header_processing_state(), MHD_Reply::response, MHD_Reply::responseCode, MHD_Connection::rp, MHD_Connection::rq, MHD_Reply::rsp_write_position, MHD_Reply_Properties::send_reply_body, MHD_Request::skipped_broken_lines, MHD_Connection::state, MHD_Connection::suspended, switch_to_rq_headers_processing(), MHD_Response::total_size, try_ready_chunked_body(), try_ready_normal_body(), MHD_Connection::write_buffer_append_offset, and MHD_Connection::write_buffer_send_offset.
Referenced by call_handlers(), and MHD_queue_response().
void MHD_connection_handle_read | ( | struct MHD_Connection * | connection, |
bool | socket_error | ||
) |
This function handles a particular connection when it has been determined that there is data to be read off a socket. All implementations (multithreaded, external polling, internal polling) call this function to handle reads.
connection | connection to handle |
socket_error | set to true if socket error was detected |
Definition at line 6406 of file connection.c.
References _, CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_Connection::discard_request, mhd_assert, MHD_CONNECTION_BODY_RECEIVED, MHD_CONNECTION_BODY_RECEIVING, MHD_CONNECTION_CHUNKED_BODY_READY, MHD_CONNECTION_CHUNKED_BODY_SENT, MHD_CONNECTION_CHUNKED_BODY_UNREADY, MHD_connection_close_(), MHD_CONNECTION_CLOSED, MHD_CONNECTION_CONTINUE_SENDING, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_FOOTERS_RECEIVING, MHD_CONNECTION_FOOTERS_SENDING, MHD_CONNECTION_FULL_REPLY_SENT, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_HEADERS_PROCESSED, MHD_CONNECTION_HEADERS_RECEIVED, MHD_CONNECTION_HEADERS_SENDING, MHD_CONNECTION_HEADERS_SENT, MHD_CONNECTION_INIT, MHD_CONNECTION_NORMAL_BODY_READY, MHD_CONNECTION_NORMAL_BODY_UNREADY, MHD_CONNECTION_REQ_HEADERS_RECEIVING, MHD_CONNECTION_REQ_LINE_RECEIVED, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_CONNECTION_START_REPLY, MHD_ERR_AGAIN_, MHD_ERR_CONNRESET_, MHD_FUNC_, MHD_pool_reallocate(), MHD_REQUEST_TERMINATED_CLIENT_ABORT, MHD_REQUEST_TERMINATED_COMPLETED_OK, MHD_REQUEST_TERMINATED_READ_ERROR, MHD_REQUEST_TERMINATED_WITH_ERROR, MHD_run_tls_handshake_(), MHD_TLS_CONN_CONNECTED, MHD_TLS_CONN_NO_TLS, MHD_update_last_activity_(), NULL, MHD_Connection::pool, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Connection::read_closed, MHD_Connection::recv_cls, MHD_Connection::sk_nonblck, MHD_Connection::state, and MHD_Connection::suspended.
Referenced by call_handlers().
void MHD_connection_handle_write | ( | struct MHD_Connection * | connection | ) |
This function was created to handle writes to sockets when it has been determined that the socket can be written to. All implementations (multithreaded, external select, internal select) call this function
connection | connection to handle |
Definition at line 6579 of file connection.c.
References _, check_write_done(), MHD_Reply_Properties::chunked, CONNECTION_CLOSE_ERROR, MHD_Connection::continue_message_write_offset, MHD_Response::crc, MHD_Connection::daemon, MHD_Response::data, MHD_Response::data_iov, MHD_Response::data_size, MHD_Response::data_start, HTTP_100_CONTINUE, MHD_Connection::keepalive, mhd_assert, MHD_CONN_MUST_UPGRADE, MHD_CONNECTION_BODY_RECEIVED, MHD_CONNECTION_BODY_RECEIVING, MHD_CONNECTION_CHUNKED_BODY_READY, MHD_CONNECTION_CHUNKED_BODY_SENT, MHD_CONNECTION_CHUNKED_BODY_UNREADY, MHD_CONNECTION_CLOSED, MHD_CONNECTION_CONTINUE_SENDING, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_FOOTERS_RECEIVING, MHD_CONNECTION_FOOTERS_SENDING, MHD_CONNECTION_FULL_REPLY_SENT, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_HEADERS_PROCESSED, MHD_CONNECTION_HEADERS_RECEIVED, MHD_CONNECTION_HEADERS_SENDING, MHD_CONNECTION_HEADERS_SENT, MHD_CONNECTION_INIT, MHD_CONNECTION_NORMAL_BODY_READY, MHD_CONNECTION_NORMAL_BODY_UNREADY, MHD_CONNECTION_REQ_HEADERS_RECEIVING, MHD_CONNECTION_REQ_LINE_RECEIVED, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_CONNECTION_START_REPLY, MHD_ERR_AGAIN_, MHD_FUNC_, MHD_mutex_lock_chk_, MHD_mutex_unlock_chk_, MHD_NO, MHD_PANIC, MHD_run_tls_handshake_(), MHD_send_data_(), MHD_send_hdr_and_body_(), MHD_send_iovec_(), MHD_STATICSTR_LEN_, MHD_TLS_CONN_CONNECTED, MHD_TLS_CONN_NO_TLS, MHD_update_last_activity_(), MHD_Response::mutex, NULL, MHD_Reply::props, MHD_Reply::resp_iov, MHD_Reply::response, MHD_Connection::rp, MHD_Connection::rq, MHD_Reply::rsp_write_position, MHD_Reply_Properties::send_reply_body, SIZE_MAX, MHD_Connection::state, MHD_Connection::suspended, MHD_Response::total_size, try_ready_normal_body(), MHD_Request::url, MHD_Connection::write_buffer, MHD_Connection::write_buffer_append_offset, and MHD_Connection::write_buffer_send_offset.
Referenced by call_handlers().
void MHD_connection_mark_closed_ | ( | struct MHD_Connection * | connection | ) |
Mark connection as "closed".
connection | connection to close |
Definition at line 1208 of file connection.c.
References MHD_Connection::daemon, MHD_Connection::event_loop_info, MHD_CONNECTION_CLOSED, MHD_EVENT_LOOP_INFO_CLEANUP, MHD_tls_connection_shutdown(), MHD_USE_TLS, MHD_USE_TURBO, MHD_Daemon::options, MHD_Daemon::shutdown, MHD_Connection::socket_fd, and MHD_Connection::state.
Referenced by MHD_connection_close_().
void MHD_connection_set_initial_state_ | ( | struct MHD_Connection * | c | ) |
Set initial internal states for the connection to start reading and processing incoming data.
c | the connection to process |
Definition at line 7044 of file connection.c.
References MHD_Connection::continue_message_write_offset, MHD_Connection::daemon, MHD_Connection::event_loop_info, MHD_Connection::keepalive, mhd_assert, MHD_CONN_KEEPALIVE_UNKOWN, MHD_CONNECTION_INIT, MHD_EVENT_LOOP_INFO_READ, MHD_pool_allocate(), MHD_TLS_CONN_INIT, MHD_TLS_CONN_NO_TLS, MHD_USE_TLS, NULL, MHD_Daemon::options, MHD_Connection::pool, MHD_Daemon::pool_size, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Connection::rp, MHD_Connection::rq, MHD_Connection::state, MHD_Connection::write_buffer, MHD_Connection::write_buffer_append_offset, MHD_Connection::write_buffer_send_offset, and MHD_Connection::write_buffer_size.
Referenced by new_connection_process_().
|
static |
Update the 'event_loop_info' field of this connection based on the state that the connection is now in. May also close the connection or perform other updates to the connection if needed to prepare for the next round of the event loop.
connection | connection to get poll set for |
Definition at line 3705 of file connection.c.
References _, check_and_grow_read_buffer_space(), MHD_Connection::daemon, MHD_Connection::discard_request, MHD_Connection::event_loop_info, has_unprocessed_upload_body_data_in_buffer(), MHD_Request::have_chunked_upload, mhd_assert, MHD_CONNECTION_BODY_RECEIVED, MHD_CONNECTION_BODY_RECEIVING, MHD_CONNECTION_CHUNKED_BODY_READY, MHD_CONNECTION_CHUNKED_BODY_SENT, MHD_CONNECTION_CHUNKED_BODY_UNREADY, MHD_CONNECTION_CLOSED, MHD_CONNECTION_CONTINUE_SENDING, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_FOOTERS_RECEIVING, MHD_CONNECTION_FOOTERS_SENDING, MHD_CONNECTION_FULL_REPLY_SENT, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_HEADERS_PROCESSED, MHD_CONNECTION_HEADERS_RECEIVED, MHD_CONNECTION_HEADERS_SENDING, MHD_CONNECTION_HEADERS_SENT, MHD_CONNECTION_INIT, MHD_CONNECTION_NORMAL_BODY_READY, MHD_CONNECTION_NORMAL_BODY_UNREADY, MHD_CONNECTION_REQ_HEADERS_RECEIVING, MHD_CONNECTION_REQ_LINE_RECEIVED, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_CONNECTION_START_REPLY, MHD_EVENT_LOOP_INFO_CLEANUP, MHD_EVENT_LOOP_INFO_PROCESS, MHD_EVENT_LOOP_INFO_PROCESS_READ, MHD_EVENT_LOOP_INFO_READ, MHD_EVENT_LOOP_INFO_WRITE, MHD_FUNC_, MHD_PANIC, MHD_TLS_CONN_CONNECTED, MHD_TLS_CONN_HANDSHAKING, MHD_TLS_CONN_INIT, MHD_TLS_CONN_INVALID_STATE, MHD_TLS_CONN_NO_TLS, MHD_TLS_CONN_TLS_CLOSED, MHD_TLS_CONN_TLS_CLOSING, MHD_TLS_CONN_TLS_FAILED, MHD_TLS_CONN_WR_CLOSED, MHD_TLS_CONN_WR_CLOSING, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Request::remaining_upload_size, MHD_Connection::rq, MHD_Request::some_payload_processed, MHD_Connection::state, and MHD_Connection::suspended.
Referenced by MHD_connection_handle_idle().
|
static |
Check whether request header contains particular token.
Token could be surrounded by spaces and tabs and delimited by comma. Case-insensitive match used for header names and tokens.
connection | the connection to get values from |
header | the header name |
header_len | the length of header, not including optional terminating null-character |
token | the token to find |
token_len | the length of token, not including optional terminating null-character. |
Definition at line 1122 of file connection.c.
References MHD_HTTP_Req_Header::header, MHD_HTTP_Req_Header::header_size, MHD_Request::headers_received, MHD_HTTP_Req_Header::kind, MHD_HEADER_KIND, MHD_str_equal_caseless_bin_n_(), MHD_str_has_token_caseless_(), MHD_HTTP_Req_Header::next, NULL, MHD_Connection::rq, and MHD_HTTP_Req_Header::value.
void MHD_set_http_callbacks_ | ( | struct MHD_Connection * | connection | ) |
Set callbacks for this connection to those for HTTP.
connection | connection to initialize |
Definition at line 7611 of file connection.c.
References MHD_Connection::recv_cls, and recv_param_adapter().
Referenced by new_connection_prepare_().
void MHD_update_last_activity_ | ( | struct MHD_Connection * | connection | ) |
Update the 'last_activity' field of the connection to the current time and move the connection to the head of the 'normal_timeout' list if the timeout for the connection uses the default value.
connection | the connection that saw some activity |
Definition at line 6361 of file connection.c.
References MHD_Daemon::cleanup_connection_mutex, MHD_Connection::connection_timeout_ms, MHD_Daemon::connection_timeout_ms, MHD_Connection::daemon, MHD_Connection::last_activity, mhd_assert, MHD_D_IS_USING_THREAD_PER_CONN_, MHD_monotonic_msec_counter(), MHD_mutex_lock_chk_, MHD_mutex_unlock_chk_, MHD_Daemon::normal_timeout_head, MHD_Daemon::normal_timeout_tail, NULL, MHD_Connection::suspended, MHD_Daemon::worker_pool, XDLL_insert, and XDLL_remove.
Referenced by MHD_connection_handle_read(), MHD_connection_handle_write(), and MHD_queue_response().
|
static |
Do we (still) need to send a 100 continue message for this connection?
connection | connection to test |
Definition at line 1173 of file connection.c.
References MHD_Request::http_ver, MHD_HEADER_KIND, MHD_HTTP_HEADER_EXPECT, MHD_IS_HTTP_VER_1_1_COMPAT, MHD_lookup_connection_value_n(), MHD_NO, MHD_STATICSTR_LEN_, MHD_str_equal_caseless_(), NULL, MHD_Request::remaining_upload_size, and MHD_Connection::rq.
Referenced by MHD_connection_handle_idle().
|
static |
Parse the various headers; figure out the size of the upload and make sure the headers follow the protocol. Advance to the appropriate state.
connection | connection we're processing |
Definition at line 4713 of file connection.c.
References _, MHD_Daemon::client_discipline, MHD_Connection::daemon, MHD_Request::have_chunked_upload, MHD_Request::http_ver, MHD_Connection::keepalive, MHD_CONN_MUST_CLOSE, MHD_HEADER_KIND, MHD_HTTP_BAD_REQUEST, MHD_HTTP_CONTENT_TOO_LARGE, MHD_HTTP_HEADER_CONTENT_LENGTH, MHD_HTTP_HEADER_HOST, MHD_HTTP_HEADER_TRANSFER_ENCODING, MHD_IS_HTTP_VER_1_1_COMPAT, MHD_lookup_connection_value_n(), MHD_NO, MHD_SIZE_UNKNOWN, MHD_STATICSTR_LEN_, MHD_str_equal_caseless_(), MHD_str_to_uint64_n_(), NULL, parse_cookie_header(), MHD_Request::remaining_upload_size, REQUEST_CONTENTLENGTH_MALFORMED, REQUEST_CONTENTLENGTH_TOOLARGE, REQUEST_LACKS_HOST, REQUEST_LENGTH_WITH_TR_ENCODING, REQUEST_UNSUPPORTED_TR_ENCODING, MHD_Connection::rq, and transmit_error_response_static.
Referenced by MHD_connection_handle_idle().
|
static |
Detect standard HTTP request method
connection | the connection |
method | the pointer to HTTP request method string |
len | the length of method in bytes |
< short alias
Definition at line 4311 of file connection.c.
References MHD_Request::http_mthd, mhd_assert, MHD_HTTP_METHOD_CONNECT, MHD_HTTP_METHOD_DELETE, MHD_HTTP_METHOD_GET, MHD_HTTP_METHOD_HEAD, MHD_HTTP_METHOD_OPTIONS, MHD_HTTP_METHOD_POST, MHD_HTTP_METHOD_PUT, MHD_HTTP_METHOD_TRACE, MHD_HTTP_MTHD_CONNECT, MHD_HTTP_MTHD_DELETE, MHD_HTTP_MTHD_GET, MHD_HTTP_MTHD_HEAD, MHD_HTTP_MTHD_OPTIONS, MHD_HTTP_MTHD_OTHER, MHD_HTTP_MTHD_POST, MHD_HTTP_MTHD_PUT, MHD_HTTP_MTHD_TRACE, MHD_STATICSTR_LEN_, NULL, and MHD_Connection::rq.
Referenced by get_request_line_inner().
|
static |
Detect HTTP version, send error response if version is not supported
connection | the connection |
http_string | the pointer to HTTP version string |
len | the length of http_string in bytes |
< short alias
Definition at line 4250 of file connection.c.
References MHD_Request::http_ver, HTTP_VER_LEN, mhd_assert, MHD_HTTP_BAD_REQUEST, MHD_HTTP_HTTP_VERSION_NOT_SUPPORTED, MHD_HTTP_VER_1_0, MHD_HTTP_VER_1_1, MHD_HTTP_VER_1_2__1_9, MHD_HTTP_VER_FUTURE, MHD_HTTP_VER_INVALID, MHD_HTTP_VER_TOO_OLD, NULL, REQ_HTTP_VER_IS_NOT_SUPPORTED, REQ_HTTP_VER_IS_TOO_OLD, REQUEST_MALFORMED, MHD_Connection::rq, and transmit_error_response_static.
Referenced by get_request_line_inner().
|
static |
Call the handler of the application for this connection. Handles chunking of the upload as well as normal uploads.
connection | connection we're processing |
The number of found digits in the chunk size number
The length of the string with the number of the chunk size, including chunk extension
Definition at line 4395 of file connection.c.
References _, MHD_Request::client_aware, MHD_Request::client_context, MHD_Daemon::client_discipline, CONNECTION_CLOSE_ERROR, MHD_Request::current_chunk_offset, MHD_Request::current_chunk_size, MHD_Connection::daemon, MHD_Daemon::default_handler, MHD_Daemon::default_handler_cls, MHD_Request::have_chunked_upload, MHD_Connection::in_access_handler, MHD_Request::method, MHD_ALLOW_BARE_LF_AS_CRLF_, mhd_assert, MHD_D_IS_USING_THREADS_, MHD_HTTP_BAD_REQUEST, MHD_HTTP_CONTENT_TOO_LARGE, MHD_NO, MHD_PANIC, MHD_SIZE_UNKNOWN, MHD_strx_to_uint64_n_(), NULL, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Request::remaining_upload_size, REQUEST_CHUNK_TOO_LARGE, REQUEST_CHUNKED_MALFORMED, MHD_Reply::response, MHD_Connection::rp, MHD_Connection::rq, MHD_Request::some_payload_processed, MHD_Connection::suspended, transmit_error_response_static, MHD_Request::url, and MHD_Request::version.
Referenced by MHD_connection_handle_idle().
|
static |
Process request-target string, form URI and URI parameters
c | the connection to process |
Definition at line 5548 of file connection.c.
References MHD_Request::client_aware, MHD_Request::client_context, connection_add_header(), MHD_Connection::daemon, MHD_Request::hdrs, mhd_assert, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_GET_ARGUMENT_KIND, MHD_NO, MHD_parse_arguments_(), NULL, MHD_Request::req_target_len, MHD_Connection::rq, MHD_HeadersProcessing::rq_line, MHD_RequestLineProcessing::rq_tgt, MHD_RequestLineProcessing::rq_tgt_qmark, MHD_Connection::state, MHD_Daemon::unescape_callback, MHD_Daemon::unescape_callback_cls, MHD_Daemon::uri_log_callback, MHD_Daemon::uri_log_callback_cls, MHD_Request::url, and MHD_Request::url_len.
Referenced by get_request_line().
|
static |
Callback for receiving data from the socket.
connection | the MHD connection structure |
other | where to write received data to |
i | maximum size of other (in bytes) |
Definition at line 725 of file connection.c.
References MHD_CONNECTION_CLOSED, MHD_EPOLL_STATE_READ_READY, MHD_ERR_AGAIN_, MHD_ERR_BADF_, MHD_ERR_CONNRESET_, MHD_ERR_INVAL_, MHD_ERR_NOMEM_, MHD_ERR_NOTCONN_, MHD_ERR_OPNOTSUPP_, MHD_INVALID_SOCKET, MHD_recv_, MHD_SCKT_EBADF_, MHD_SCKT_EINVAL_, MHD_SCKT_ENOTCONN_, MHD_SCKT_EOPNOTSUPP_, MHD_SCKT_ERR_IS_, MHD_SCKT_ERR_IS_EAGAIN_, MHD_SCKT_ERR_IS_EINTR_, MHD_SCKT_ERR_IS_LOW_RESOURCES_, MHD_SCKT_ERR_IS_REMOTE_DISCNN_, MHD_SCKT_SEND_MAX_SIZE_, MHD_socket_get_error_, MHD_Connection::socket_fd, and MHD_Connection::state.
Referenced by MHD_set_http_callbacks_().
_MHD_static_inline void reset_rq_header_processing_state | ( | struct MHD_Connection * | c | ) |
Reset request header processing state.
This function resets the processing state before processing the next header (or footer) line.
c | the connection to process |
Definition at line 4856 of file connection.c.
References MHD_HeadersProcessing::hdr, MHD_Request::hdrs, and MHD_Connection::rq.
Referenced by get_req_headers(), and MHD_connection_handle_idle().
|
static |
Send the automatic redirection to fixed URI when received URI with whitespaces. If URI is too large, close connection with error.
c | the connection to process |
Definition at line 5451 of file connection.c.
References _, connection_close_error(), MHD_Connection::daemon, MHD_Request::hdrs, mhd_assert, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_HTTP_HEADER_LOCATION, MHD_HTTP_MOVED_PERMANENTLY, MHD_MAX_FIXED_URI_LEN, MHD_STATICSTR_LEN_, NULL, MHD_RequestLineProcessing::num_ws_in_uri, MHD_Daemon::pool_size, MHD_Request::req_target_len, MHD_Connection::rq, MHD_HeadersProcessing::rq_line, RQ_TARGET_INVALID_CHAR, MHD_RequestLineProcessing::rq_tgt, MHD_Connection::state, and transmit_error_response_header.
Referenced by get_request_line().
|
static |
Setup connection reply properties.
Reply properties include presence of reply body, transfer-encoding type and other.
connection | to connection to process |
< a short alias
< a short alias
Definition at line 2196 of file connection.c.
References MHD_Reply_Properties::chunked, MHD_Response::flags, MHD_Response::flags_auto, MHD_Request::http_ver, is_reply_body_needed(), MHD_Connection::keepalive, keepalive_possible(), mhd_assert, MHD_CONN_MUST_CLOSE, MHD_IS_HTTP_VER_1_1_COMPAT, MHD_RAF_HAS_TRANS_ENC_CHUNKED, MHD_RF_HTTP_1_0_COMPATIBLE_STRICT, MHD_RF_HTTP_1_0_SERVER, MHD_SIZE_UNKNOWN, NULL, MHD_Reply::props, MHD_Reply::response, MHD_Reply::responseCode, MHD_Connection::rp, RP_BODY_HEADERS_ONLY, RP_BODY_NONE, MHD_Connection::rq, MHD_Reply_Properties::send_reply_body, MHD_Response::total_size, and MHD_Reply_Properties::use_reply_body_headers.
Referenced by build_header_response().
_MHD_static_inline void switch_to_rq_headers_processing | ( | struct MHD_Connection * | c | ) |
Switch to request headers (field lines) processing state.
c | the connection to process |
Definition at line 4867 of file connection.c.
References MHD_Request::field_lines, MHD_HeadersProcessing::hdr, MHD_Request::hdrs, MHD_CONNECTION_REQ_HEADERS_RECEIVING, MHD_Connection::read_buffer, MHD_Connection::rq, MHD_StartOrSize::start, and MHD_Connection::state.
Referenced by MHD_connection_handle_idle().
|
static |
We encountered an error processing the request. Handle it properly by stopping to read data and sending the indicated response code and message.
connection | the connection |
status_code | the response code to send (400, 413 or 414) |
message | the error message to send |
message_len | the length of the message |
header_name | the name of the header, malloc()ed by the caller, free() by this function, optional, can be NULL |
header_name_len | the length of the header_name |
header_value | the value of the header, malloc()ed by the caller, free() by this function, optional, can be NULL |
header_value_len | the length of the header_value |
Definition at line 2773 of file connection.c.
References _, build_header_response(), CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_Connection::discard_request, MHD_Request::headers_received, MHD_Request::headers_received_tail, MHD_Connection::in_access_handler, MHD_Connection::keepalive, MHD_Request::method, MHD_add_response_entry_no_alloc_(), mhd_assert, MHD_CONN_MUST_CLOSE, MHD_CONNECTION_CLOSED, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_HEADERS_SENDING, MHD_create_response_from_buffer_static(), MHD_destroy_response(), MHD_HEADER_KIND, MHD_NO, MHD_pool_deallocate(), MHD_pool_reset(), MHD_queue_response(), MHD_YES, NULL, MHD_Connection::pool, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Reply::response, MHD_Connection::rp, MHD_Connection::rq, MHD_Connection::state, MHD_Response::status_code, MHD_Connection::stop_with_error, MHD_Request::url, MHD_Request::url_len, MHD_Request::version, MHD_Connection::write_buffer, MHD_Connection::write_buffer_append_offset, MHD_Connection::write_buffer_send_offset, and MHD_Connection::write_buffer_size.
|
static |
Try growing the read buffer. We initially claim half the available buffer space for the read buffer (the other half being left for management data structures; the write buffer can in the end take virtually everything as the read buffer can be reduced to the minimum necessary at that point.
connection | the connection |
required | set to 'true' if grow is required, i.e. connection will fail if no additional space is granted |
Definition at line 1877 of file connection.c.
References MHD_Connection::daemon, mhd_assert, MHD_BUF_INC_SIZE, MHD_pool_get_free(), MHD_pool_is_resizable_inplace(), MHD_pool_reallocate(), NULL, MHD_Connection::pool, MHD_Daemon::pool_increment, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, and MHD_Connection::read_buffer_size.
Referenced by check_and_grow_read_buffer_space().
|
static |
Prepare the response buffer of this connection for sending. Assumes that the response mutex is already held. If the transmission is complete, this function may close the socket (and return MHD_NO).
connection | the connection | |
[out] | p_finished | the pointer to variable that will be set to "true" when application returned indication of the end of the stream |
Definition at line 1505 of file connection.c.
References _, CONNECTION_CLOSE_ERROR, MHD_Response::crc, MHD_Response::crc_cls, MHD_Response::data, MHD_Response::data_size, MHD_Response::data_start, mhd_assert, MHD_CONNECTION_CHUNKED_BODY_UNREADY, MHD_CONTENT_READER_END_OF_STREAM, MHD_CONTENT_READER_END_WITH_ERROR, MHD_mutex_unlock_chk_, MHD_NO, MHD_pool_get_free(), MHD_pool_is_resizable_inplace(), MHD_pool_reallocate(), MHD_SIZE_UNKNOWN, MHD_uint32_to_strx(), MHD_YES, MHD_Response::mutex, NULL, MHD_Connection::pool, MHD_Reply::response, MHD_Connection::rp, MHD_Reply::rsp_write_position, SSIZE_MAX, MHD_Connection::state, MHD_Response::total_size, MHD_Connection::write_buffer, MHD_Connection::write_buffer_append_offset, MHD_Connection::write_buffer_send_offset, and MHD_Connection::write_buffer_size.
Referenced by MHD_connection_handle_idle().
|
static |
Prepare the response buffer of this connection for sending. Assumes that the response mutex is already held. If the transmission is complete, this function may close the socket (and return MHD_NO).
connection | the connection |
Definition at line 1403 of file connection.c.
References _, MHD_iovec_track_::cnt, CONNECTION_CLOSE_ERROR, MHD_Response::crc, MHD_Response::crc_cls, MHD_Response::data, MHD_Response::data_buffer_size, MHD_Response::data_iov, MHD_Response::data_iovcnt, MHD_Response::data_size, MHD_Response::data_start, MHD_iovec_track_::iov, mhd_assert, MHD_connection_alloc_memory_(), MHD_connection_close_(), MHD_CONNECTION_NORMAL_BODY_UNREADY, MHD_CONTENT_READER_END_OF_STREAM, MHD_MIN, MHD_mutex_unlock_chk_, MHD_NO, MHD_REQUEST_TERMINATED_COMPLETED_OK, MHD_YES, MHD_Response::mutex, NULL, MHD_Reply::props, MHD_Reply::resp_iov, MHD_Reply::response, MHD_Connection::rp, MHD_Reply::rsp_write_position, MHD_Reply_Properties::send_reply_body, MHD_iovec_track_::sent, MHD_Connection::state, and MHD_Response::total_size.
Referenced by MHD_connection_handle_idle(), and MHD_connection_handle_write().
enum MHD_HdrLineReadRes_ _MHD_FIXED_ENUM |