GNU libmicrohttpd 0.9.77
Loading...
Searching...
No Matches
connection.c File Reference

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"
Include dependency graph for connection.c:

Go to the source code of this file.

Macros

#define HTTP_100_CONTINUE   "HTTP/1.1 100 Continue\r\n\r\n"
 
#define REQUEST_TOO_BIG   ""
 
#define REQUEST_LACKS_HOST   ""
 
#define REQUEST_MALFORMED   ""
 
#define REQUEST_CHUNKED_MALFORMED   ""
 
#define REQUEST_CHUNK_TOO_LARGE   ""
 
#define REQUEST_CONTENTLENGTH_TOOLARGE   ""
 
#define REQUEST_CONTENTLENGTH_MALFORMED   ""
 
#define INTERNAL_ERROR   ""
 
#define REQ_HTTP_VER_IS_TOO_OLD   ""
 
#define REQ_HTTP_VER_IS_NOT_SUPPORTED   ""
 
#define MHD_SENFILE_CHUNK_   (0x20000)
 
#define MHD_SENFILE_CHUNK_THR_P_C_   (0x200000)
 
#define MHD_lookup_header_s_token_ci(c, h, tkn)
 
#define CONNECTION_CLOSE_ERROR(c, emsg)   connection_close_error (c, NULL)
 
#define CONNECTION_CLOSE_ERROR_CHECK(c, emsg)    connection_close_error_check (c, NULL)
 
#define buffer_append_s(buf, ppos, buf_size, str)    buffer_append(buf,ppos,buf_size,str, MHD_STATICSTR_LEN_(str))
 
#define transmit_error_response_static(c, code, msg)    transmit_error_response_len (c, code, msg, MHD_STATICSTR_LEN_ (msg))
 

Functions

static void * 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 void connection_close_error_check (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 bool is_reply_body_headers_needed (struct MHD_Connection *connection)
 
static bool is_reply_body_needed (struct MHD_Connection *connection)
 
static void setup_reply_properties (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, enum MHD_ValueKind kind, bool filter_transf_enc, 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)
 
static void MHD_connection_update_event_loop_info (struct MHD_Connection *connection)
 
static char * get_next_header_line (struct MHD_Connection *connection, size_t *line_len)
 
static enum MHD_Result connection_add_header (struct MHD_Connection *connection, const char *key, size_t key_size, const char *value, size_t value_size, enum MHD_ValueKind kind)
 
static enum MHD_Result parse_cookie_header (struct MHD_Connection *connection)
 
static enum MHD_Result parse_http_version (struct MHD_Connection *connection, const char *http_string, size_t len)
 
static enum MHD_Result parse_http_std_method (struct MHD_Connection *connection, const char *method, size_t len)
 
static enum MHD_Result parse_initial_message_line (struct MHD_Connection *connection, char *line, size_t line_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 enum MHD_Result process_header_line (struct MHD_Connection *connection, char *line)
 
static enum MHD_Result process_broken_line (struct MHD_Connection *connection, char *line, enum MHD_ValueKind kind)
 
static void parse_connection_headers (struct MHD_Connection *connection)
 
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)
 
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_ConnectionInfoMHD_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)
 

Detailed Description

Methods for managing connections.

Author
Daniel Pittman
Christian Grothoff
Karlson2k (Evgeny Grin)

Definition in file connection.c.

Macro Definition Documentation

◆ buffer_append_s

#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.

Parameters
[out]bufthe buffer to append data to
[in,out]pposthe pointer to position in the buffer
buf_sizethe size of the buffer
strthe static string to append
Returns
true if data has been added and position has been updated, false if not enough space is available

Definition at line 1855 of file connection.c.

◆ CONNECTION_CLOSE_ERROR

#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 970 of file connection.c.

◆ CONNECTION_CLOSE_ERROR_CHECK

#define CONNECTION_CLOSE_ERROR_CHECK (   c,
  emsg 
)     connection_close_error_check (c, NULL)

Macro to only include error message in call to connection_close_error_check() if we have HAVE_MESSAGES.

Definition at line 1004 of file connection.c.

◆ HTTP_100_CONTINUE

#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 62 of file connection.c.

◆ INTERNAL_ERROR

#define INTERNAL_ERROR   ""

Response text used when there is an internal server error.

Intentionally empty here to keep our memory footprint minimal.

Definition at line 160 of file connection.c.

◆ MHD_lookup_header_s_token_ci

#define MHD_lookup_header_s_token_ci (   c,
  h,
  tkn 
)
Value:
(tkn),MHD_STATICSTR_LEN_ (tkn))
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)
Definition connection.c:713
#define MHD_STATICSTR_LEN_(macro)
Definition mhd_str.h:45

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.

Parameters
cthe connection to get values from
hthe static string of header name
tknthe static string of token to find
Returns
true if token is found in specified header, false otherwise

Definition at line 755 of file connection.c.

◆ MHD_SENFILE_CHUNK_

#define MHD_SENFILE_CHUNK_   (0x20000)

sendfile() chuck size

Definition at line 187 of file connection.c.

◆ MHD_SENFILE_CHUNK_THR_P_C_

#define MHD_SENFILE_CHUNK_THR_P_C_   (0x200000)

sendfile() chuck size for thread-per-connection

Definition at line 192 of file connection.c.

◆ REQ_HTTP_VER_IS_NOT_SUPPORTED

#define REQ_HTTP_VER_IS_NOT_SUPPORTED   ""

Response text used when the request HTTP version is not supported.

Definition at line 180 of file connection.c.

◆ REQ_HTTP_VER_IS_TOO_OLD

#define REQ_HTTP_VER_IS_TOO_OLD   ""

Response text used when the request HTTP version is too old.

Definition at line 170 of file connection.c.

◆ REQUEST_CHUNK_TOO_LARGE

#define REQUEST_CHUNK_TOO_LARGE   ""

Response text used when the request HTTP chunk is too large.

Definition at line 124 of file connection.c.

◆ REQUEST_CHUNKED_MALFORMED

#define REQUEST_CHUNKED_MALFORMED   ""

Response text used when the request HTTP chunked encoding is malformed.

Definition at line 114 of file connection.c.

◆ REQUEST_CONTENTLENGTH_MALFORMED

#define REQUEST_CONTENTLENGTH_MALFORMED   ""

Response text used when the request HTTP chunked encoding is malformed.

Definition at line 147 of file connection.c.

◆ REQUEST_CONTENTLENGTH_TOOLARGE

#define REQUEST_CONTENTLENGTH_TOOLARGE   ""

Response text used when the request HTTP content is too large.

Definition at line 135 of file connection.c.

◆ REQUEST_LACKS_HOST

#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 89 of file connection.c.

◆ REQUEST_MALFORMED

#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 103 of file connection.c.

◆ REQUEST_TOO_BIG

#define REQUEST_TOO_BIG   ""

Response text used when the request (http header) is too big to be processed.

Intentionally empty here to keep our memory footprint minimal.

Definition at line 75 of file connection.c.

◆ transmit_error_response_static

#define transmit_error_response_static (   c,
  code,
  msg 
)     transmit_error_response_len (c, code, msg, MHD_STATICSTR_LEN_ (msg))

Transmit static string as error response

Definition at line 2395 of file connection.c.

Function Documentation

◆ add_user_headers()

static bool add_user_headers ( char *  buf,
size_t *  ppos,
size_t  buf_size,
struct MHD_Response response,
enum MHD_ValueKind  kind,
bool  filter_transf_enc,
bool  add_close,
bool  add_keep_alive 
)
static

Add user-defined headers from response object to the text buffer.

Parameters
bufthe buffer to add headers to
pposthe pointer to the position in the buf
buf_sizethe size of the buf
responsethe response
kindthe kind of objects (headers or footers)
filter_transf_encskip "Transfer-Encoding" header if any
add_closeadd "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_aliveadd "Keep-Alive" token to the "Connection:" header (if any)
Returns
true if succeed, false if buffer is too small

< a short alias

< Iterates through User-specified headers

< the size of current element to be added to the buf

Definition at line 1879 of file connection.c.

References MHD_Response::first_header, MHD_Response::flags_auto, MHD_HTTP_Header::header, MHD_HTTP_Header::header_size, MHD_HTTP_Header::kind, mhd_assert, MHD_HEADER_KIND, MHD_HTTP_HEADER_CONNECTION, MHD_HTTP_HEADER_TRANSFER_ENCODING, MHD_RAF_HAS_CONNECTION_CLOSE, MHD_RAF_HAS_CONNECTION_HDR, MHD_RAF_HAS_TRANS_ENC_CHUNKED, MHD_STATICSTR_LEN_, MHD_str_equal_caseless_bin_n_(), MHD_str_equal_caseless_n_(), MHD_HTTP_Header::next, NULL, MHD_HTTP_Header::value, and MHD_HTTP_Header::value_size.

Referenced by build_header_response().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ buffer_append()

static bool buffer_append ( char *  buf,
size_t *  ppos,
size_t  buf_size,
const char *  append,
size_t  append_size 
)
static

Append data to the buffer if enough space is available, update position.

Parameters
[out]bufthe buffer to append data to
[in,out]pposthe pointer to position in the buffer
buf_sizethe size of the buffer
appendthe data to append
append_sizethe size of the append
Returns
true if data has been added and position has been updated, false if not enough space is available

Definition at line 1830 of file connection.c.

References mhd_assert, and NULL.

Referenced by build_header_response().

Here is the caller graph for this function:

◆ build_connection_chunked_response_footer()

static enum MHD_Result build_connection_chunked_response_footer ( struct MHD_Connection connection)
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.

Parameters
connectionthe connection
Returns
MHD_YES on success, MHD_NO on failure (out of memory)

< the buffer to write footers to

< the size of the buf

< the used size of the buf

< a short alias

Definition at line 2203 of file connection.c.

References MHD_Reply_Properties::chunked, connection_maximize_write_buffer(), MHD_Response::first_header, MHD_HTTP_Header::header, MHD_HTTP_Header::header_size, MHD_HTTP_Header::kind, mhd_assert, MHD_CONNECTION_BODY_SENT, MHD_FOOTER_KIND, MHD_NO, MHD_YES, MHD_HTTP_Header::next, NULL, MHD_Connection::response, MHD_Connection::rp_props, MHD_Connection::state, MHD_HTTP_Header::value, MHD_HTTP_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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ build_header_response()

static enum MHD_Result build_header_response ( struct MHD_Connection connection)
static

Allocate the connection's write buffer and fill it with all of the headers from the response. Required headers are added here.

Parameters
connectionthe connection
Returns
MHD_YES on success, MHD_NO on failure (out of memory)

< 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 1980 of file connection.c.

References add_user_headers(), buffer_append(), buffer_append_s, MHD_Reply_Properties::chunked, connection_maximize_write_buffer(), MHD_Connection::daemon, MHD_Response::flags, MHD_Response::flags_auto, get_date_header(), MHD_Connection::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_HEADER_KIND, 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_ICY_FLAG, MHD_NO, MHD_RAF_HAS_CONNECTION_HDR, MHD_RAF_HAS_DATE_HDR, MHD_RAF_HAS_TRANS_ENC_CHUNKED, MHD_RF_HTTP_1_0_SERVER, 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_Connection::response, MHD_Connection::responseCode, MHD_Connection::rp_props, MHD_Reply_Properties::send_reply_body, MHD_Reply_Properties::set, 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ call_connection_handler()

static void call_connection_handler ( struct MHD_Connection connection)
static

Call the handler of the application for this connection. Handles chunking of the upload as well as normal uploads.

Parameters
connectionconnection we're processing

Definition at line 3061 of file connection.c.

References _, MHD_Connection::client_aware, MHD_Connection::client_context, CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_Daemon::default_handler, MHD_Daemon::default_handler_cls, MHD_Connection::method, MHD_NO, NULL, MHD_Connection::response, MHD_Connection::url, and MHD_Connection::version.

Referenced by MHD_connection_handle_idle().

Here is the caller graph for this function:

◆ check_write_done()

static enum MHD_Result check_write_done ( struct MHD_Connection connection,
enum MHD_CONNECTION_STATE  next_state 
)
static

Check if we are done sending the write-buffer. If so, transition into "next_state".

Parameters
connectionconnection to check write status for
next_statethe next state to transition to
Returns
MHD_NO if we are not done, MHD_YES if we are

Definition at line 3386 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().

Here is the caller graph for this function:

◆ cleanup_connection()

◆ connection_add_header()

static enum MHD_Result connection_add_header ( struct MHD_Connection connection,
const char *  key,
size_t  key_size,
const char *  value,
size_t  value_size,
enum MHD_ValueKind  kind 
)
static

Add an entry to the HTTP headers of a connection. If this fails, transmit an error response (request too big).

Parameters
connectionthe connection for which a value should be set
kindkind of the value
keykey for the value
key_sizenumber of bytes in key
valuethe value itself
value_sizenumber of bytes in value
Returns
MHD_NO on failure (out of memory), MHD_YES for success

Definition at line 2661 of file connection.c.

References _, MHD_Connection::daemon, MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE, MHD_NO, MHD_set_connection_value_n(), MHD_YES, REQUEST_TOO_BIG, and transmit_error_response_static.

Referenced by parse_cookie_header(), parse_initial_message_line(), and process_broken_line().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ connection_alloc_memory()

static void * connection_alloc_memory ( struct MHD_Connection connection,
size_t  size 
)
static

Allocate memory from connection's memory pool. If memory pool doesn't have enough free memory but read of write buffer have some unused memory, the size of the buffer will be reduced as needed.

Parameters
connectionthe connection to use
sizethe size of allocated memory area
Returns
pointer to allocated memory region in the pool or NULL if no memory is available

< The required amount of free memory

Definition at line 246 of file connection.c.

References mhd_assert, MHD_pool_allocate(), 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_(), parse_cookie_header(), and try_ready_normal_body().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ connection_check_timedout()

static bool connection_check_timedout ( struct MHD_Connection c)
static

Check whether connection has timed out.

Parameters
cthe connection to check
Returns
true if connection has timeout and needs to be closed, false otherwise.

Definition at line 4164 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ connection_close_error()

static void connection_close_error ( struct MHD_Connection connection,
const char *  emsg 
)
static

A serious error occurred, close the connection (and notify the application).

Parameters
connectionconnection to close with error
emsgerror message (can be NULL)

Definition at line 945 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 connection_close_error_check().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ connection_close_error_check()

static void connection_close_error_check ( struct MHD_Connection connection,
const char *  emsg 
)
static

A serious error occurred, check whether error response is already queued and close the connection if response wasn't queued.

Parameters
connectionconnection to close with error
emsgerror message (can be NULL)

Definition at line 982 of file connection.c.

References connection_close_error(), MHD_Response::crc, MHD_CONNECTION_HEADERS_SENDING, NULL, MHD_Connection::response, MHD_Connection::responseCode, MHD_Connection::state, and MHD_Connection::stop_with_error.

Here is the call graph for this function:

◆ connection_maximize_write_buffer()

static size_t connection_maximize_write_buffer ( struct MHD_Connection connection)
static

Allocate the maximum available amount of memory from MemoryPool for write buffer.

Parameters
connectionthe connection whose write buffer is being manipulated
Returns
the size of free space in write buffer, may be smaller than requested size.

< a short alias

Definition at line 1577 of file connection.c.

References mhd_assert, MHD_pool_get_free(), 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ connection_reset()

static void connection_reset ( struct MHD_Connection connection,
bool  reuse 
)
static

Reset connection after request-reply cycle.

Parameters
connectionthe connection to process
reusethe flag to choose whether to close connection or prepare connection for the next request processing

< a short alias

Definition at line 4292 of file connection.c.

References MHD_Connection::client_aware, MHD_Connection::client_context, MHD_Connection::colon, MHD_Connection::continue_message_write_offset, MHD_Connection::current_chunk_offset, MHD_Connection::current_chunk_size, MHD_Connection::daemon, MHD_Connection::discard_request, MHD_Connection::have_chunked_upload, MHD_Connection::header_size, MHD_Connection::headers_received, MHD_Connection::headers_received_tail, MHD_Connection::http_mthd, MHD_Connection::http_ver, MHD_Connection::keepalive, MHD_Connection::last, MHD_Connection::method, mhd_assert, MHD_CONN_KEEPALIVE_UNKOWN, MHD_connection_close_(), MHD_CONNECTION_INIT, MHD_destroy_response(), MHD_HTTP_MTHD_NO_METHOD, MHD_HTTP_VER_UNKNOWN, 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_Connection::resp_iov, MHD_Connection::response, MHD_Connection::response_write_position, MHD_Connection::responseCode, MHD_Connection::rp_props, MHD_Connection::state, MHD_Connection::stop_with_error, MHD_Connection::url, MHD_Connection::version, 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ connection_shrink_read_buffer()

static void connection_shrink_read_buffer ( struct MHD_Connection connection)
static

Shrink connection read buffer to the zero size of free space in the buffer

Parameters
connectionthe connection whose read buffer is being manipulated

< a short alias

Definition at line 1548 of file connection.c.

References mhd_assert, 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ connection_switch_from_recv_to_send()

static void connection_switch_from_recv_to_send ( struct MHD_Connection connection)
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.

Parameters
connectionthe connection to prepare for sending.

Definition at line 1669 of file connection.c.

References connection_shrink_read_buffer().

Referenced by MHD_connection_handle_idle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_date_header()

static bool get_date_header ( char *  header)
static

Produce HTTP DATE header. Result is always 37 bytes long (plus one terminating null).

Parameters
[out]headerwhere to write the header, with at least 38 bytes available space.

Definition at line 1454 of file connection.c.

References get_date_str().

Referenced by build_header_response().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_date_str()

static bool get_date_str ( char *  date)
static

Produce time stamp.

Result is NOT null-terminated. Result is always 29 bytes long.

Parameters
[out]datewhere to write the time stamp, with at least 29 bytes available space.

Definition at line 1369 of file connection.c.

References MHD_uint16_to_str(), MHD_uint8_to_str_pad(), and NULL.

Referenced by get_date_header().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_next_header_line()

static char * get_next_header_line ( struct MHD_Connection connection,
size_t *  line_len 
)
static

Parse a single line of the HTTP header. Advance read_buffer (!) appropriately. If the current line does not fit, consider growing the buffer. If the line is far too long, close the connection. If no line is found (incomplete, buffer too small, line too long), return NULL. Otherwise return a pointer to the line.

Parameters
connectionconnection we're processing
[out]line_lenpointer to variable that receive length of line or NULL
Returns
NULL if no full line is available; note that the returned string will not be 0-termianted

Definition at line 2586 of file connection.c.

References mhd_assert, MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE, MHD_HTTP_URI_TOO_LONG, NULL, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, REQUEST_TOO_BIG, transmit_error_response_static, try_grow_read_buffer(), and MHD_Connection::url.

Referenced by MHD_connection_handle_idle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_reply_body_headers_needed()

static bool is_reply_body_headers_needed ( struct MHD_Connection connection)
static

Check whether reply body-specific headers (namely Content-Length, Transfer-Encoding) are needed.

If reply body-specific headers are not needed then body itself is not allowed as well. When reply body-specific headers are needed, the body itself can be present or not, depending on other conditions.

Parameters
connectionthe connection to check
Returns
true if reply body-specific headers are needed, false otherwise.
See also
is_reply_body_needed()

< a short alias

< the response code

Definition at line 1691 of file connection.c.

References MHD_Connection::http_mthd, mhd_assert, MHD_HTTP_MTHD_CONNECT, MHD_HTTP_NO_CONTENT, MHD_ICY_FLAG, NULL, MHD_Connection::response, and MHD_Connection::responseCode.

Referenced by is_reply_body_needed(), and setup_reply_properties().

Here is the caller graph for this function:

◆ is_reply_body_needed()

static bool is_reply_body_needed ( struct MHD_Connection connection)
static

Check whether reply body must be used.

If reply body is needed, it could be zero-sized.

Parameters
connectionthe connection to check
Returns
true if reply body must be used, false otherwise
See also
is_reply_body_header_needed()

< a short alias

< the response code

Definition at line 1731 of file connection.c.

References MHD_Connection::http_mthd, is_reply_body_headers_needed(), mhd_assert, MHD_HTTP_MTHD_HEAD, MHD_HTTP_NOT_MODIFIED, MHD_ICY_FLAG, and MHD_Connection::responseCode.

Referenced by setup_reply_properties().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ keepalive_possible()

static enum MHD_ConnKeepAlive keepalive_possible ( struct MHD_Connection connection)
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.

Parameters
connectionthe connection to check for keepalive
Returns
MHD_CONN_USE_KEEPALIVE if (based on the request and the response), a keepalive is legal, MHD_CONN_MUST_CLOSE if connection must be closed after sending complete reply, MHD_CONN_MUST_UPGRADE if connection must be upgraded.

< a short alias

< a short alias

Definition at line 1301 of file connection.c.

References MHD_Connection::discard_request, MHD_Response::flags, MHD_Response::flags_auto, MHD_Connection::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_Connection::response, and MHD_Connection::stop_with_error.

Referenced by setup_reply_properties().

Here is the caller graph for this function:

◆ MHD_connection_close_()

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.

Remarks
To be called only from thread that process connection's recv(), send() and response.
Parameters
connectionconnection to close
termination_codetermination reason to give

Definition at line 830 of file connection.c.

References MHD_Connection::client_aware, MHD_Connection::client_context, MHD_Connection::daemon, mhd_assert, MHD_connection_mark_closed_(), MHD_destroy_response(), MHD_pool_destroy(), MHD_USE_INTERNAL_POLLING_THREAD, MHD_Daemon::notify_completed, MHD_Daemon::notify_completed_cls, NULL, MHD_Daemon::options, MHD_Connection::pid, MHD_Connection::pool, MHD_Connection::response, and MHD_Connection::suspended.

Referenced by connection_close_error(), connection_reset(), MHD_connection_handle_idle(), MHD_connection_handle_read(), and try_ready_normal_body().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MHD_connection_handle_idle()

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.

Remarks
To be called only from thread that process connection's recv(), send() and response.
Parameters
connectionconnection to handle
Returns
MHD_YES if we should continue to process the connection (not dead yet), MHD_NO if it died

Definition at line 4385 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_CLOSE_ERROR_CHECK, 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_next_header_line(), MHD_Connection::have_chunked_upload, MHD_Connection::header_size, HTTP_100_CONTINUE, MHD_Connection::http_ver, MHD_Connection::in_idle, MHD_Connection::keepalive, MHD_Connection::method, mhd_assert, MHD_CONN_USE_KEEPALIVE, MHD_CONNECTION_BODY_RECEIVED, MHD_CONNECTION_BODY_SENT, MHD_CONNECTION_CHUNKED_BODY_READY, MHD_CONNECTION_CHUNKED_BODY_UNREADY, MHD_connection_close_(), MHD_CONNECTION_CLOSED, MHD_CONNECTION_CONTINUE_SENDING, MHD_CONNECTION_CONTINUE_SENT, MHD_CONNECTION_FOOTER_PART_RECEIVED, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_FOOTERS_SENDING, MHD_CONNECTION_FOOTERS_SENT, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_HEADER_PART_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_LINE_RECEIVING, MHD_CONNECTION_START_REPLY, MHD_connection_update_event_loop_info(), MHD_CONNECTION_URL_RECEIVED, MHD_destroy_response(), MHD_FOOTER_KIND, MHD_FUNC_, MHD_HEADER_KIND, MHD_HTTP_BAD_REQUEST, 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_SIZE_UNKNOWN, MHD_STATICSTR_LEN_, MHD_TLS_CONN_CONNECTED, MHD_TLS_CONN_NO_TLS, MHD_USE_EPOLL, MHD_USE_INTERNAL_POLLING_THREAD, MHD_YES, MHD_Response::mutex, need_100_continue(), NULL, MHD_Daemon::options, parse_connection_headers(), parse_initial_message_line(), MHD_Connection::pid, process_broken_line(), process_header_line(), process_request_body(), MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_closed, MHD_Connection::remaining_upload_size, REQUEST_MALFORMED, MHD_Connection::response, MHD_Connection::response_write_position, MHD_Connection::responseCode, MHD_Connection::rp_props, MHD_Reply_Properties::send_reply_body, MHD_Connection::state, MHD_Connection::suspended, MHD_Response::total_size, transmit_error_response_static, 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MHD_connection_handle_read()

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.

Parameters
connectionconnection to handle
socket_errorset to true if socket error was detected

Definition at line 3668 of file connection.c.

References _, CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_Connection::discard_request, mhd_assert, MHD_CONNECTION_BODY_RECEIVED, MHD_connection_close_(), MHD_CONNECTION_CLOSED, MHD_CONNECTION_CONTINUE_SENDING, MHD_CONNECTION_CONTINUE_SENT, MHD_CONNECTION_FOOTER_PART_RECEIVED, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_HEADER_PART_RECEIVED, MHD_CONNECTION_HEADERS_PROCESSED, MHD_CONNECTION_HEADERS_RECEIVED, MHD_CONNECTION_INIT, MHD_CONNECTION_REQ_LINE_RECEIVING, MHD_CONNECTION_URL_RECEIVED, 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_Daemon::pool_increment, 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, MHD_Connection::suspended, and try_grow_read_buffer().

Referenced by call_handlers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MHD_connection_handle_write()

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.

Parameters
connectionconnection to handle

Definition at line 3826 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_SENT, MHD_CONNECTION_CHUNKED_BODY_READY, MHD_CONNECTION_CHUNKED_BODY_UNREADY, MHD_CONNECTION_CLOSED, MHD_CONNECTION_CONTINUE_SENDING, MHD_CONNECTION_CONTINUE_SENT, MHD_CONNECTION_FOOTER_PART_RECEIVED, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_FOOTERS_SENDING, MHD_CONNECTION_FOOTERS_SENT, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_HEADER_PART_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_LINE_RECEIVING, MHD_CONNECTION_START_REPLY, MHD_CONNECTION_URL_RECEIVED, 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_SIZE_UNKNOWN, MHD_STATICSTR_LEN_, MHD_TLS_CONN_CONNECTED, MHD_TLS_CONN_NO_TLS, MHD_update_last_activity_(), MHD_Response::mutex, NULL, MHD_Connection::resp_iov, MHD_Connection::response, MHD_Connection::response_write_position, MHD_Connection::rp_props, MHD_Reply_Properties::send_reply_body, SIZE_MAX, MHD_Connection::state, MHD_Connection::suspended, MHD_Response::total_size, try_ready_normal_body(), MHD_Connection::url, MHD_Connection::write_buffer, MHD_Connection::write_buffer_append_offset, and MHD_Connection::write_buffer_send_offset.

Referenced by call_handlers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MHD_connection_mark_closed_()

void MHD_connection_mark_closed_ ( struct MHD_Connection connection)

Mark connection as "closed".

Remarks
To be called from any thread.
Parameters
connectionconnection to close

Definition at line 792 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_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MHD_connection_update_event_loop_info()

static void MHD_connection_update_event_loop_info ( struct MHD_Connection connection)
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.

Parameters
connectionconnection to get poll set for

Definition at line 2407 of file connection.c.

References _, CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_Connection::discard_request, MHD_Connection::event_loop_info, INTERNAL_ERROR, mhd_assert, MHD_CONNECTION_BODY_RECEIVED, MHD_CONNECTION_BODY_SENT, MHD_CONNECTION_CHUNKED_BODY_READY, MHD_CONNECTION_CHUNKED_BODY_UNREADY, MHD_CONNECTION_CLOSED, MHD_CONNECTION_CONTINUE_SENDING, MHD_CONNECTION_CONTINUE_SENT, MHD_CONNECTION_FOOTER_PART_RECEIVED, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_FOOTERS_SENDING, MHD_CONNECTION_FOOTERS_SENT, MHD_CONNECTION_FULL_REQ_RECEIVED, MHD_CONNECTION_HEADER_PART_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_LINE_RECEIVING, MHD_CONNECTION_START_REPLY, MHD_CONNECTION_URL_RECEIVED, MHD_EVENT_LOOP_INFO_BLOCK, MHD_EVENT_LOOP_INFO_CLEANUP, MHD_EVENT_LOOP_INFO_READ, MHD_EVENT_LOOP_INFO_WRITE, MHD_FUNC_, MHD_HTTP_INTERNAL_SERVER_ERROR, MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE, MHD_HTTP_URI_TOO_LONG, MHD_TLS_CONN_HANDSHAKING, MHD_TLS_CONN_INIT, MHD_TLS_CONN_NO_TLS, MHD_USE_INTERNAL_POLLING_THREAD, NULL, MHD_Daemon::options, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Connection::read_closed, REQUEST_TOO_BIG, MHD_Connection::state, MHD_Connection::suspended, transmit_error_response_static, try_grow_read_buffer(), and MHD_Connection::url.

Referenced by MHD_connection_handle_idle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MHD_lookup_header_token_ci()

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

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.

Parameters
connectionthe connection to get values from
headerthe header name
header_lenthe length of header, not including optional terminating null-character
tokenthe token to find
token_lenthe length of token, not including optional terminating null-character.
Returns
true if token is found in specified header, false otherwise

Definition at line 713 of file connection.c.

References MHD_HTTP_Header::header, MHD_HTTP_Header::header_size, MHD_Connection::headers_received, MHD_HTTP_Header::kind, MHD_HEADER_KIND, MHD_str_equal_caseless_bin_n_(), MHD_str_has_token_caseless_(), MHD_HTTP_Header::next, NULL, and MHD_HTTP_Header::value.

Here is the call graph for this function:

◆ MHD_set_http_callbacks_()

void MHD_set_http_callbacks_ ( struct MHD_Connection connection)

Set callbacks for this connection to those for HTTP.

Parameters
connectionconnection to initialize

Definition at line 4909 of file connection.c.

References MHD_Connection::recv_cls, and recv_param_adapter().

Referenced by new_connection_prepare_().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MHD_update_last_activity_()

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.

Parameters
connectionthe connection that saw some activity

Definition at line 3626 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_monotonic_msec_counter(), MHD_mutex_lock_chk_, MHD_mutex_unlock_chk_, MHD_USE_THREAD_PER_CONNECTION, MHD_Daemon::normal_timeout_head, MHD_Daemon::normal_timeout_tail, MHD_Daemon::options, MHD_Connection::suspended, XDLL_insert, and XDLL_remove.

Referenced by MHD_connection_handle_read(), MHD_connection_handle_write(), and MHD_queue_response().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ need_100_continue()

static bool need_100_continue ( struct MHD_Connection connection)
static

Do we (still) need to send a 100 continue message for this connection?

Parameters
connectionconnection to test
Returns
false if we don't need 100 CONTINUE, true if we do

Definition at line 768 of file connection.c.

References MHD_Connection::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_(), and NULL.

Referenced by MHD_connection_handle_idle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_connection_headers()

static void parse_connection_headers ( struct MHD_Connection connection)
static

◆ parse_cookie_header()

static enum MHD_Result parse_cookie_header ( struct MHD_Connection connection)
static

Parse the cookie header (see RFC 2109).

Parameters
connectionconnection to parse header of
Returns
MHD_YES for success, MHD_NO for failure (malformed, out of memory)

Definition at line 2696 of file connection.c.

References _, connection_add_header(), connection_alloc_memory(), MHD_Connection::daemon, MHD_COOKIE_KIND, MHD_HEADER_KIND, MHD_HTTP_HEADER_COOKIE, MHD_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE, MHD_lookup_connection_value_n(), MHD_NO, MHD_STATICSTR_LEN_, MHD_YES, NULL, REQUEST_TOO_BIG, and transmit_error_response_static.

Referenced by parse_connection_headers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ parse_http_std_method()

static enum MHD_Result parse_http_std_method ( struct MHD_Connection connection,
const char *  method,
size_t  len 
)
static

Detect standard HTTP request method

Parameters
connectionthe connection
methodthe pointer to HTTP request method string
lenthe length of method in bytes
Returns
MHD_YES if HTTP method is valid string, MHD_NO if HTTP method string is not valid.

< short alias

Definition at line 2885 of file connection.c.

References MHD_Connection::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_NO, MHD_STATICSTR_LEN_, MHD_YES, and NULL.

Referenced by parse_initial_message_line().

Here is the caller graph for this function:

◆ parse_http_version()

static enum MHD_Result parse_http_version ( struct MHD_Connection connection,
const char *  http_string,
size_t  len 
)
static

Detect HTTP version

Parameters
connectionthe connection
http_stringthe pointer to HTTP version string
lenthe length of http_string in bytes
Returns
MHD_YES if HTTP version is correct and supported, MHD_NO if HTTP version is not correct or unsupported.

< short alias

Definition at line 2822 of file connection.c.

References MHD_Connection::http_ver, 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, MHD_NO, MHD_YES, NULL, REQ_HTTP_VER_IS_NOT_SUPPORTED, REQ_HTTP_VER_IS_TOO_OLD, REQUEST_MALFORMED, and transmit_error_response_static.

Referenced by parse_initial_message_line().

Here is the caller graph for this function:

◆ parse_initial_message_line()

static enum MHD_Result parse_initial_message_line ( struct MHD_Connection connection,
char *  line,
size_t  line_len 
)
static

Parse the first line of the HTTP HEADER.

Parameters
connectionthe connection (updated)
linethe first line, not 0-terminated
line_lenlength of the first line
Returns
MHD_YES if the line is ok, MHD_NO if it is malformed

Definition at line 2936 of file connection.c.

References MHD_Connection::client_aware, MHD_Connection::client_context, connection_add_header(), MHD_Connection::daemon, MHD_Connection::method, MHD_GET_ARGUMENT_KIND, MHD_NO, MHD_parse_arguments_(), MHD_YES, NULL, parse_http_std_method(), parse_http_version(), MHD_Daemon::strict_for_client, MHD_Daemon::unescape_callback, MHD_Daemon::unescape_callback_cls, MHD_Daemon::uri_log_callback, MHD_Daemon::uri_log_callback_cls, MHD_Connection::url, and MHD_Connection::version.

Referenced by MHD_connection_handle_idle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_broken_line()

static enum MHD_Result process_broken_line ( struct MHD_Connection connection,
char *  line,
enum MHD_ValueKind  kind 
)
static

Process a header value that spans multiple lines. The previous line(s) are in connection->last.

Parameters
connectionconnection we're processing
linethe current input line
kindif the line is complete, add a header of the given kind
Returns
MHD_YES if the line was processed successfully

Definition at line 3468 of file connection.c.

References MHD_Connection::colon, connection_add_header(), MHD_Connection::last, mhd_assert, MHD_HTTP_BAD_REQUEST, MHD_NO, MHD_YES, NULL, process_header_line(), REQUEST_MALFORMED, and transmit_error_response_static.

Referenced by MHD_connection_handle_idle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_header_line()

static enum MHD_Result process_header_line ( struct MHD_Connection connection,
char *  line 
)
static

We have received (possibly the beginning of) a line in the header (or footer). Validate (check for ":") and prepare to process.

Parameters
connectionconnection we're processing
lineline from the header to process
Returns
MHD_YES on success, MHD_NO on error (malformed line)

Definition at line 3411 of file connection.c.

References MHD_Connection::colon, MHD_Connection::daemon, MHD_Connection::last, MHD_NO, MHD_YES, NULL, and MHD_Daemon::strict_for_client.

Referenced by MHD_connection_handle_idle(), and process_broken_line().

Here is the caller graph for this function:

◆ process_request_body()

◆ recv_param_adapter()

static ssize_t recv_param_adapter ( struct MHD_Connection connection,
void *  other,
size_t  i 
)
static

Callback for receiving data from the socket.

Parameters
connectionthe MHD connection structure
otherwhere to write received data to
imaximum size of other (in bytes)
Returns
positive value for number of bytes actually received or negative value for error number MHD_ERR_xxx_

Definition at line 316 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_().

Here is the caller graph for this function:

◆ setup_reply_properties()

static void setup_reply_properties ( struct MHD_Connection connection)
static

Setup connection reply properties.

Reply properties include presence of reply body, transfer-encoding type and other.

Parameters
connectionto connection to process
reply_body_allowed

< a short alias

< a short alias

Definition at line 1763 of file connection.c.

References MHD_Reply_Properties::chunked, MHD_Response::flags, MHD_Response::flags_auto, MHD_Connection::http_ver, is_reply_body_headers_needed(), 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_Connection::response, MHD_Connection::rp_props, MHD_Reply_Properties::send_reply_body, MHD_Reply_Properties::set, MHD_Response::total_size, and MHD_Reply_Properties::use_reply_body_headers.

Referenced by build_header_response().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ transmit_error_response_len()

static void transmit_error_response_len ( struct MHD_Connection connection,
unsigned int  status_code,
const char *  message,
size_t  message_len 
)
static

◆ try_grow_read_buffer()

static bool try_grow_read_buffer ( struct MHD_Connection connection,
bool  required 
)
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.

Parameters
connectionthe connection
requiredset to 'true' if grow is required, i.e. connection will fail if no additional space is granted
Returns
'true' on success, 'false' on failure

Definition at line 1487 of file connection.c.

References mhd_assert, MHD_BUF_INC_SIZE, MHD_pool_get_free(), MHD_pool_reallocate(), NULL, MHD_Connection::pool, MHD_Connection::read_buffer, and MHD_Connection::read_buffer_size.

Referenced by get_next_header_line(), MHD_connection_handle_read(), and MHD_connection_update_event_loop_info().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ try_ready_chunked_body()

static enum MHD_Result try_ready_chunked_body ( struct MHD_Connection connection,
bool *  p_finished 
)
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).

Parameters
connectionthe connection
[out]p_finishedthe pointer to variable that will be set to "true" when application returned indication of the end of the stream
Returns
MHD_NO if readying the response failed

Definition at line 1124 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_reallocate(), MHD_SIZE_UNKNOWN, MHD_uint32_to_strx(), MHD_YES, MHD_Response::mutex, NULL, MHD_Connection::pool, MHD_Connection::response, MHD_Connection::response_write_position, 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ try_ready_normal_body()

static enum MHD_Result try_ready_normal_body ( struct MHD_Connection connection)
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).

Parameters
connectionthe connection
Returns
MHD_NO if readying the response failed (the lock on the response will have been released already in this case).

Definition at line 1022 of file connection.c.

References _, MHD_iovec_track_::cnt, connection_alloc_memory(), 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_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_Connection::resp_iov, MHD_Connection::response, MHD_Connection::response_write_position, MHD_Connection::rp_props, 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().

Here is the call graph for this function:
Here is the caller graph for this function: