GNU libmicrohttpd
0.9.72
|
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"
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 | INTERNAL_ERROR "" |
#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) |
Functions | |
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) |
static enum MHD_Result | keepalive_possible (struct MHD_Connection *connection) |
static void | get_date_string (char *date, size_t date_len) |
static bool | try_grow_read_buffer (struct MHD_Connection *connection, bool required) |
static enum MHD_Result | build_header_response (struct MHD_Connection *connection) |
static void | transmit_error_response (struct MHD_Connection *connection, unsigned int status_code, const char *message) |
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_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) |
void | MHD_connection_handle_write (struct MHD_Connection *connection) |
static void | cleanup_connection (struct MHD_Connection *connection) |
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) |
Methods for managing connections.
Definition in 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 774 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 60 of file connection.c.
#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 114 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 566 of file connection.c.
#define MHD_SENFILE_CHUNK_ (0x20000) |
sendfile() chuck size
Definition at line 121 of file connection.c.
#define MHD_SENFILE_CHUNK_THR_P_C_ (0x200000) |
sendfile() chuck size for thread-per-connection
Definition at line 126 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 87 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 101 of file connection.c.
#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 73 of file connection.c.
|
static |
Allocate the connection's write buffer and fill it with all of the headers (or footers, if we have already sent the body) from the HTTPd's response. If headers are missing in the response supplied by the application, additional headers may be added here.
connection | the connection |
Definition at line 1106 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 transmit_error_response().
|
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 2132 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.
|
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 2168 of file connection.c.
References _, MHD_Connection::client_aware, MHD_Connection::client_context, CONNECTION_CLOSE_ERROR, MHD_Connection::current_chunk_offset, MHD_Connection::current_chunk_size, MHD_Connection::daemon, MHD_Daemon::default_handler, MHD_Daemon::default_handler_cls, MHD_Connection::have_chunked_upload, MHD_Connection::method, MHD_MIN, MHD_NO, mhd_panic, mhd_panic_cls, MHD_SIZE_UNKNOWN, MHD_strx_to_uint64_n_(), MHD_USE_INTERNAL_POLLING_THREAD, MHD_YES, NULL, MHD_Daemon::options, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::remaining_upload_size, MHD_Connection::response, MHD_Connection::suspended, MHD_Connection::url, and MHD_Connection::version.
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 3154 of file connection.c.
References _, MHD_Daemon::cleanup_connection_mutex, MHD_Daemon::cleanup_head, MHD_Daemon::cleanup_tail, MHD_Connection::connection_timeout, MHD_Daemon::connection_timeout, 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_destroy_response(), MHD_mutex_lock_chk_, MHD_mutex_unlock_chk_, MHD_USE_INTERNAL_POLLING_THREAD, MHD_USE_THREAD_PER_CONNECTION, MHD_Daemon::normal_timeout_head, MHD_Daemon::normal_timeout_tail, NULL, MHD_Daemon::options, MHD_Connection::pid, MHD_Connection::response, MHD_Connection::resuming, MHD_Connection::suspended, MHD_Daemon::suspended_connections_head, MHD_Daemon::suspended_connections_tail, and XDLL_remove.
|
static |
Add an entry to the HTTP headers of a connection. If this fails, transmit an error response (request too big).
connection | the connection for which a value should be set |
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 1799 of file connection.c.
References 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(), try_grow_read_buffer(), and MHD_Connection::url.
|
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 752 of file connection.c.
References MHD_Connection::daemon, MHD_connection_close_(), MHD_REQUEST_TERMINATED_WITH_ERROR, and NULL.
|
static |
Produce HTTP time stamp.
date | where to write the header, with at least 128 bytes available space. |
date_len | number of bytes in date |
Definition at line 1043 of file connection.c.
References NULL.
|
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.
connection | connection we're processing | |
[out] | line_len | pointer to variable that receive length of line or NULL |
Definition at line 1799 of file connection.c.
|
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 (which is conservative for HTTP 1.0, but might be a bit optimistic for HTTP 1.1).
connection | the connection to check for keepalive |
Definition at line 752 of file connection.c.
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 643 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_USE_INTERNAL_POLLING_THREAD, MHD_Daemon::notify_completed, MHD_Daemon::notify_completed_cls, NULL, MHD_Daemon::options, MHD_Connection::pid, and MHD_Connection::response.
Referenced by connection_close_error(), and MHD_connection_handle_read().
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.
connection | connection to handle |
Definition at line 3154 of file connection.c.
void MHD_connection_handle_read | ( | struct MHD_Connection * | connection | ) |
This function handles a particular connection when it has been determined that there is data to be read off a socket.
connection | connection to handle |
Definition at line 2738 of file connection.c.
References _, CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, 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_HEADER_PART_RECEIVED, MHD_CONNECTION_HEADERS_PROCESSED, MHD_CONNECTION_HEADERS_RECEIVED, MHD_CONNECTION_INIT, MHD_CONNECTION_URL_RECEIVED, MHD_ERR_AGAIN_, MHD_ERR_CONNRESET_, MHD_pool_reallocate(), MHD_REQUEST_TERMINATED_CLIENT_ABORT, MHD_REQUEST_TERMINATED_READ_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::state, MHD_Connection::suspended, and try_grow_read_buffer().
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.
connection | connection to handle |
Definition at line 2851 of file connection.c.
References _, check_write_done(), CONNECTION_CLOSE_ERROR, MHD_Connection::continue_message_write_offset, MHD_Response::crc, MHD_Connection::daemon, MHD_Response::data, MHD_Response::data_size, MHD_Response::data_start, MHD_Connection::have_chunked_upload, HTTP_100_CONTINUE, 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_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_URL_RECEIVED, MHD_ERR_AGAIN_, 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_SIZE_UNKNOWN, MHD_STATICSTR_LEN_, MHD_TLS_CONN_CONNECTED, MHD_TLS_CONN_NO_TLS, MHD_update_last_activity_(), MHD_Response::mutex, NULL, MHD_Connection::response, MHD_Connection::response_write_position, 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.
void MHD_connection_mark_closed_ | ( | struct MHD_Connection * | connection | ) |
Mark connection as "closed".
connection | connection to close |
Definition at line 605 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_().
|
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 1630 of file connection.c.
References _, CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, 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_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_URL_RECEIVED, MHD_EVENT_LOOP_INFO_BLOCK, MHD_EVENT_LOOP_INFO_CLEANUP, MHD_EVENT_LOOP_INFO_READ, MHD_EVENT_LOOP_INFO_WRITE, 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(), try_grow_read_buffer(), and MHD_Connection::url.
|
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 524 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.
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 3776 of file connection.c.
References MHD_Connection::recv_cls, and recv_param_adapter().
Referenced by internal_add_connection().
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 2699 of file connection.c.
References MHD_Daemon::cleanup_connection_mutex, MHD_Connection::connection_timeout, MHD_Daemon::connection_timeout, MHD_Connection::daemon, MHD_Connection::last_activity, MHD_monotonic_sec_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(), and MHD_connection_handle_write().
|
static |
Do we (still) need to send a 100 continue message for this connection?
connection | connection to test |
Definition at line 579 of file connection.c.
References MHD_HEADER_KIND, MHD_HTTP_HEADER_EXPECT, MHD_HTTP_VERSION_1_1, MHD_lookup_connection_value_n(), MHD_NO, MHD_STATICSTR_LEN_, MHD_str_equal_caseless_(), NULL, and MHD_Connection::version.
|
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 2591 of file connection.c.
References _, CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_Connection::have_chunked_upload, mhd_assert, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_create_response_from_buffer(), MHD_destroy_response(), MHD_HEADER_KIND, MHD_HTTP_BAD_REQUEST, MHD_HTTP_HEADER_CONTENT_LENGTH, MHD_HTTP_HEADER_HOST, MHD_HTTP_HEADER_TRANSFER_ENCODING, MHD_HTTP_VERSION_1_1, MHD_lookup_connection_value_n(), MHD_NO, MHD_queue_response(), MHD_RESPMEM_PERSISTENT, MHD_SIZE_UNKNOWN, MHD_STATICSTR_LEN_, MHD_str_equal_caseless_(), MHD_str_to_uint64_(), NULL, parse_cookie_header(), MHD_Connection::read_closed, MHD_Connection::remaining_upload_size, REQUEST_LACKS_HOST, MHD_Connection::response, MHD_Connection::state, MHD_Daemon::strict_for_client, and MHD_Connection::version.
|
static |
Parse the cookie header (see RFC 2109).
connection | connection to parse header of |
Definition at line 1799 of file connection.c.
Referenced by parse_connection_headers().
|
static |
Parse the first line of the HTTP HEADER.
connection | the connection (updated) |
line | the first line, not 0-terminated |
line_len | length of the first line |
Definition at line 1799 of file connection.c.
|
static |
Process a header value that spans multiple lines. The previous line(s) are in connection->last.
connection | connection we're processing |
line | the current input line |
kind | if the line is complete, add a header of the given kind |
Definition at line 2168 of file connection.c.
|
static |
We have received (possibly the beginning of) a line in the header (or footer). Validate (check for ":") and prepare to process.
connection | connection we're processing |
line | line from the header to process |
Definition at line 2168 of file connection.c.
|
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 2168 of file connection.c.
|
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 138 of file connection.c.
References MHD_CONNECTION_CLOSED, MHD_EPOLL_STATE_READ_READY, MHD_ERR_AGAIN_, MHD_ERR_CONNRESET_, MHD_ERR_NOTCONN_, MHD_INVALID_SOCKET, MHD_recv_, MHD_SCKT_ECONNRESET_, MHD_SCKT_ERR_IS_, MHD_SCKT_ERR_IS_EAGAIN_, MHD_SCKT_ERR_IS_EINTR_, MHD_SCKT_SEND_MAX_SIZE_, MHD_socket_get_error_, MHD_Connection::socket_fd, and MHD_Connection::state.
Referenced by MHD_set_http_callbacks_().
|
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 |
Definition at line 1546 of file connection.c.
References _, build_header_response(), CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_Connection::keepalive, mhd_assert, MHD_CONN_MUST_CLOSE, MHD_CONNECTION_CLOSED, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_HEADERS_SENDING, MHD_create_response_from_buffer(), MHD_destroy_response(), MHD_HTTP_VERSION_1_0, MHD_NO, MHD_pool_reallocate(), MHD_queue_response(), MHD_RESPMEM_PERSISTENT, NULL, MHD_Connection::pool, MHD_Connection::read_buffer, MHD_Connection::read_buffer_size, MHD_Connection::read_closed, MHD_Connection::response, MHD_Connection::state, MHD_Response::status_code, and MHD_Connection::version.
Referenced by connection_add_header(), and MHD_connection_update_event_loop_info().
|
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 1106 of file connection.c.
Referenced by connection_add_header(), MHD_connection_handle_read(), and MHD_connection_update_event_loop_info().
|
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 752 of file connection.c.
|
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 752 of file connection.c.
Referenced by MHD_connection_handle_write().