#include "internal.h"
#include <limits.h>
#include "connection.h"
#include "memorypool.h"
#include "response.h"
#include "reason_phrase.h"
Include dependency graph for connection.c:
Go to the source code of this file.
Defines | |
#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 | DEBUG_CLOSE MHD_NO |
#define | DEBUG_SEND_DATA MHD_NO |
#define | CONNECTION_CLOSE_ERROR(c, emsg) connection_close_error (c, NULL) |
Functions | |
int | MHD_get_connection_values (struct MHD_Connection *connection, enum MHD_ValueKind kind, MHD_KeyValueIterator iterator, void *iterator_cls) |
int | MHD_set_connection_value (struct MHD_Connection *connection, enum MHD_ValueKind kind, const char *key, const char *value) |
const char * | MHD_lookup_connection_value (struct MHD_Connection *connection, enum MHD_ValueKind kind, const char *key) |
int | MHD_queue_response (struct MHD_Connection *connection, unsigned int status_code, struct MHD_Response *response) |
static int | need_100_continue (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 int | try_ready_normal_body (struct MHD_Connection *connection) |
static int | try_ready_chunked_body (struct MHD_Connection *connection) |
static void | add_extra_headers (struct MHD_Connection *connection) |
static void | get_date_string (char *date) |
static int | try_grow_read_buffer (struct MHD_Connection *connection) |
static int | 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 | add_to_fd_set (int fd, fd_set *set, int *max_fd) |
int | MHD_connection_get_fdset (struct MHD_Connection *connection, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *except_fd_set, int *max_fd) |
int | MHD_connection_get_pollfd (struct MHD_Connection *connection, struct MHD_Pollfd *p) |
static char * | get_next_header_line (struct MHD_Connection *connection) |
static int | connection_add_header (struct MHD_Connection *connection, char *key, char *value, enum MHD_ValueKind kind) |
static int | parse_arguments (enum MHD_ValueKind kind, struct MHD_Connection *connection, char *args) |
static int | parse_cookie_header (struct MHD_Connection *connection) |
static int | parse_initial_message_line (struct MHD_Connection *connection, char *line) |
static void | call_connection_handler (struct MHD_Connection *connection) |
static void | process_request_body (struct MHD_Connection *connection) |
static int | do_read (struct MHD_Connection *connection) |
static int | do_write (struct MHD_Connection *connection) |
static int | check_write_done (struct MHD_Connection *connection, enum MHD_CONNECTION_STATE next_state) |
static int | process_header_line (struct MHD_Connection *connection, char *line) |
static int | process_broken_line (struct MHD_Connection *connection, char *line, enum MHD_ValueKind kind) |
static void | parse_connection_headers (struct MHD_Connection *connection) |
int | MHD_connection_handle_read (struct MHD_Connection *connection) |
int | MHD_connection_handle_write (struct MHD_Connection *connection) |
int | MHD_connection_handle_idle (struct MHD_Connection *connection) |
void | MHD_set_http_callbacks_ (struct MHD_Connection *connection) |
MHD_ConnectionInfo * | MHD_get_connection_info (struct MHD_Connection *connection, enum MHD_ConnectionInfoType infoType,...) |
int | MHD_set_connection_option (struct MHD_Connection *connection, enum MHD_CONNECTION_OPTION option,...) |
Christian Grothoff
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 350 of file connection.c.
Referenced by call_connection_handler(), do_read(), do_write(), MHD_connection_get_pollfd(), MHD_connection_handle_idle(), MHD_connection_handle_write(), parse_connection_headers(), process_header_line(), process_request_body(), transmit_error_response(), try_ready_chunked_body(), and try_ready_normal_body().
#define DEBUG_CLOSE MHD_NO |
Add extra debug messages with reasons for closing connections (non-error reasons).
Definition at line 100 of file connection.c.
#define DEBUG_SEND_DATA MHD_NO |
Should all data send be printed to stderr?
Definition at line 105 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 43 of file connection.c.
Referenced by MHD_connection_handle_idle(), MHD_connection_handle_write(), and need_100_continue().
#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 93 of file connection.c.
Referenced by MHD_connection_get_pollfd().
#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 68 of file connection.c.
Referenced by parse_connection_headers().
#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 81 of file connection.c.
Referenced by MHD_connection_handle_idle(), and process_broken_line().
#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 55 of file connection.c.
Referenced by connection_add_header(), get_next_header_line(), MHD_connection_get_pollfd(), parse_cookie_header(), and process_broken_line().
static void add_extra_headers | ( | struct MHD_Connection * | connection | ) | [static] |
Check if we need to set some additional headers for http-compiliance.
connection | connection to check (and possibly modify) |
Definition at line 530 of file connection.c.
References MHD_Connection::have_chunked_upload, MHD_add_response_header(), MHD_get_response_header(), MHD_HTTP_HEADER_CONNECTION, MHD_HTTP_HEADER_CONTENT_LENGTH, MHD_HTTP_HEADER_TRANSFER_ENCODING, MHD_HTTP_VERSION_1_1, MHD_LONG_LONG, MHD_LONG_LONG_PRINTF, MHD_NO, MHD_SIZE_UNKNOWN, MHD_YES, NULL, MHD_Connection::response, SPRINTF, MHD_Response::total_size, and MHD_Connection::version.
Referenced by build_header_response().
Here is the call graph for this function:
Here is the caller graph for this function:
static void add_to_fd_set | ( | int | fd, | |
fd_set * | set, | |||
int * | max_fd | |||
) | [static] |
Add "fd" to the "fd_set". If "fd" is greater than "*max", set "*max" to fd.
fd | file descriptor to add to the set | |
set | set to modify | |
max_fd | maximum value to potentially update |
Definition at line 807 of file connection.c.
References NULL.
Referenced by MHD_connection_get_fdset().
Here is the caller graph for this function:
static int build_header_response | ( | struct MHD_Connection * | connection | ) | [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.
connection | the connection |
Definition at line 635 of file connection.c.
References add_extra_headers(), MHD_Connection::daemon, EXTRA_CHECK, MHD_Response::first_header, get_date_string(), MHD_HTTP_Header::header, MHD_HTTP_Header::kind, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_FOOTER_KIND, MHD_get_reason_phrase_for(), MHD_get_response_header(), MHD_HEADER_KIND, MHD_HTTP_HEADER_CONNECTION, MHD_HTTP_HEADER_DATE, MHD_HTTP_VERSION_1_0, MHD_HTTP_VERSION_1_1, MHD_ICY_FLAG, MHD_NO, mhd_panic, mhd_panic_cls, MHD_pool_allocate(), MHD_SUPPRESS_DATE_NO_CLOCK, MHD_YES, MHD_HTTP_Header::next, NULL, MHD_Daemon::options, MHD_Connection::pool, MHD_Connection::read_closed, MHD_Connection::response, MHD_Connection::responseCode, SPRINTF, MHD_Connection::state, MHD_HTTP_Header::value, 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(), and transmit_error_response().
Here is the call graph for this function:
Here is the caller graph for this function:
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.
Definition at line 1343 of file connection.c.
References MHD_Connection::client_aware, MHD_Connection::client_context, CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_Daemon::default_handler, MHD_Connection::method, MHD_NO, MHD_YES, 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:
static int 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".
Definition at line 1646 of file connection.c.
References MHD_NO, MHD_pool_reallocate(), MHD_YES, NULL, MHD_Connection::pool, 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 MHD_connection_handle_write().
Here is the call graph for this function:
Here is the caller graph for this function:
static int connection_add_header | ( | struct MHD_Connection * | connection, | |
char * | key, | |||
char * | value, | |||
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).
connection | the connection for which a value should be set | |
kind | kind of the value | |
key | key for the value | |
value | the value itself |
Definition at line 1088 of file connection.c.
References MHD_HTTP_REQUEST_ENTITY_TOO_LARGE, MHD_NO, MHD_set_connection_value(), MHD_YES, REQUEST_TOO_BIG, and transmit_error_response().
Referenced by parse_arguments(), parse_cookie_header(), and process_broken_line().
Here is the call graph for this function:
Here is the caller graph for this function:
static void connection_close_error | ( | struct MHD_Connection * | connection, | |
const char * | emsg | |||
) | [static] |
A serious error occured, close the connection (and notify the application).
connection | connection to close with error | |
emsg | error message (can be NULL) |
Definition at line 332 of file connection.c.
References MHD_Connection::daemon, MHD_connection_close(), MHD_REQUEST_TERMINATED_WITH_ERROR, and NULL.
Here is the call graph for this function:
static int do_read | ( | struct MHD_Connection * | connection | ) | [static] |
Try reading data from the socket into the read buffer of the connection.
Definition at line 1553 of file connection.c.
References CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_NO, MHD_USE_SSL, MHD_YES, NULL, MHD_Daemon::options, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Connection::read_closed, MHD_Connection::recv_cls, SHUTDOWN, MHD_Connection::socket_fd, and STRERROR.
Referenced by MHD_connection_handle_read().
Here is the caller graph for this function:
static int do_write | ( | struct MHD_Connection * | connection | ) | [static] |
Try writing data to the socket from the write buffer of the connection.
Definition at line 1602 of file connection.c.
References CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, FPRINTF, MHD_NO, MHD_USE_SSL, MHD_YES, NULL, MHD_Daemon::options, MHD_Connection::send_cls, STRERROR, MHD_Connection::write_buffer, 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:
static void get_date_string | ( | char * | date | ) | [static] |
Produce HTTP "Date:" header.
date | where to write the header, with at least 128 bytes available space. |
Definition at line 579 of file connection.c.
References SPRINTF.
Referenced by build_header_response().
Here is the caller graph for this function:
static char* get_next_header_line | ( | struct MHD_Connection * | connection | ) | [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.
Definition at line 1026 of file connection.c.
References MHD_BUF_INC_SIZE, MHD_HTTP_REQUEST_ENTITY_TOO_LARGE, MHD_HTTP_REQUEST_URI_TOO_LONG, MHD_pool_reallocate(), NULL, MHD_Connection::pool, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, REQUEST_TOO_BIG, and transmit_error_response().
Referenced by MHD_connection_handle_idle().
Here is the call graph for this function:
Here is the caller graph for this function:
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 305 of file connection.c.
References MHD_Connection::client_aware, MHD_Connection::client_context, MHD_Connection::daemon, MHD_CONNECTION_CLOSED, MHD_NO, MHD_YES, MHD_Daemon::notify_completed, MHD_Daemon::notify_completed_cls, NULL, MHD_Connection::read_closed, SHUTDOWN, MHD_Connection::socket_fd, and MHD_Connection::state.
Referenced by close_all_connections(), connection_close_error(), MHD_connection_handle_idle(), MHD_connection_handle_read(), MHD_handle_connection(), MHD_tls_connection_handle_idle(), and run_tls_handshake().
Here is the caller graph for this function:
int MHD_connection_get_fdset | ( | struct MHD_Connection * | connection, | |
fd_set * | read_fd_set, | |||
fd_set * | write_fd_set, | |||
fd_set * | except_fd_set, | |||
int * | max_fd | |||
) |
Obtain the select sets for this connection. The given sets (and the maximum) are updated and must have already been initialized.
connection | connetion to get select sets for | |
read_fd_set | read set to initialize | |
write_fd_set | write set to initialize | |
except_fd_set | except set to initialize (never changed) | |
max_fd | where to store largest FD put into any set |
Definition at line 831 of file connection.c.
References add_to_fd_set(), MHD_Pollfd::events, MHD_Pollfd::fd, MHD_connection_get_pollfd(), MHD_POLL_ACTION_IN, MHD_POLL_ACTION_OUT, and MHD_YES.
Referenced by MHD_get_fdset(), and MHD_handle_connection().
Here is the call graph for this function:
Here is the caller graph for this function:
int MHD_connection_get_pollfd | ( | struct MHD_Connection * | connection, | |
struct MHD_Pollfd * | p | |||
) |
Obtain the pollfd for this connection
connection | connetion to get poll set for | |
p | where to store the polling information |
Definition at line 863 of file connection.c.
References CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, MHD_Pollfd::events, EXTRA_CHECK, MHD_Pollfd::fd, INTERNAL_ERROR, 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_HTTP_INTERNAL_SERVER_ERROR, MHD_HTTP_REQUEST_ENTITY_TOO_LARGE, MHD_HTTP_REQUEST_URI_TOO_LONG, MHD_NO, MHD_POLL_ACTION_IN, MHD_POLL_ACTION_OUT, MHD_pool_create(), MHD_TLS_CONNECTION_INIT, MHD_USE_SELECT_INTERNALLY, MHD_USE_THREAD_PER_CONNECTION, MHD_YES, NULL, MHD_Connection::pool, MHD_Daemon::pool_size, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Connection::read_closed, REQUEST_TOO_BIG, MHD_Connection::socket_fd, MHD_Connection::state, transmit_error_response(), and try_grow_read_buffer().
Referenced by MHD_connection_get_fdset(), and MHD_handle_connection().
Here is the call graph for this function:
Here is the caller graph for this function:
int 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 2075 of file connection.c.
References build_header_response(), call_connection_handler(), MHD_Daemon::cleanup_connection_mutex, MHD_Daemon::cleanup_head, MHD_Daemon::cleanup_tail, CONNECTION_CLOSE_ERROR, MHD_Connection::connection_timeout, MHD_Daemon::connections_head, MHD_Daemon::connections_tail, MHD_Connection::daemon, DLL_insert, DLL_remove, EXTRA_CHECK, get_next_header_line(), HTTP_100_CONTINUE, MHD_Connection::last_activity, 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_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_destroy_response(), MHD_FOOTER_KIND, MHD_get_response_header(), MHD_HEADER_KIND, MHD_HTTP_BAD_REQUEST, MHD_HTTP_HEADER_CONNECTION, MHD_HTTP_VERSION_1_1, MHD_lookup_connection_value(), MHD_monotonic_time(), MHD_NO, MHD_PANIC, MHD_pool_destroy(), MHD_pool_reset(), MHD_REQUEST_TERMINATED_COMPLETED_OK, MHD_REQUEST_TERMINATED_TIMEOUT_REACHED, MHD_SIZE_UNKNOWN, MHD_YES, need_100_continue(), MHD_Daemon::notify_completed_cls, NULL, parse_connection_headers(), parse_initial_message_line(), process_broken_line(), process_header_line(), process_request_body(), MHD_Connection::read_closed, REQUEST_MALFORMED, MHD_Connection::state, transmit_error_response(), try_ready_chunked_body(), and try_ready_normal_body().
Referenced by MHD_set_http_callbacks_(), and MHD_tls_connection_handle_idle().
Here is the call graph for this function:
Here is the caller graph for this function:
int 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. All implementations (multithreaded, external select, internal select) call this function to handle reads.
connection | connection to handle |
Definition at line 1853 of file connection.c.
References do_read(), MHD_Connection::last_activity, MHD_BUF_INC_SIZE, 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_monotonic_time(), MHD_NO, MHD_pool_reallocate(), MHD_REQUEST_TERMINATED_READ_ERROR, MHD_YES, MHD_Connection::read_buffer_offset, MHD_Connection::read_buffer_size, MHD_Connection::state, and try_grow_read_buffer().
Referenced by MHD_set_http_callbacks_(), and MHD_tls_connection_handle_read().
Here is the call graph for this function:
Here is the caller graph for this function:
int 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 1917 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, do_write(), EXTRA_CHECK, FPRINTF, HTTP_100_CONTINUE, MHD_Connection::last_activity, 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_monotonic_time(), MHD_TLS_CONNECTION_INIT, MHD_YES, MHD_Response::mutex, NULL, MHD_Connection::response, MHD_Connection::send_cls, MHD_Connection::state, STRERROR, and try_ready_normal_body().
Referenced by MHD_set_http_callbacks_(), and MHD_tls_connection_handle_write().
Here is the call graph for this function:
Here is the caller graph for this function:
union MHD_ConnectionInfo* MHD_get_connection_info | ( | struct MHD_Connection * | connection, | |
enum MHD_ConnectionInfoType | infoType, | |||
... | ||||
) |
Obtain information about the given connection.
connection | what connection to get information about | |
infoType | what information is desired? | |
... | depends on infoType |
Definition at line 2471 of file connection.c.
References MHD_Connection::addr, MHD_Connection::daemon, MHD_CONNECTION_INFO_CIPHER_ALGO, MHD_CONNECTION_INFO_CLIENT_ADDRESS, MHD_CONNECTION_INFO_DAEMON, MHD_CONNECTION_INFO_GNUTLS_SESSION, MHD_CONNECTION_INFO_PROTOCOL, and NULL.
int MHD_get_connection_values | ( | struct MHD_Connection * | connection, | |
enum MHD_ValueKind | kind, | |||
MHD_KeyValueIterator | iterator, | |||
void * | iterator_cls | |||
) |
Get all of the headers from the request.
connection | connection to get values from | |
kind | types of values to iterate over | |
iterator | callback to call on each header; maybe NULL (then just count headers) | |
iterator_cls | extra argument to iterator |
Definition at line 119 of file connection.c.
References MHD_HTTP_Header::header, MHD_Connection::headers_received, MHD_HTTP_Header::kind, MHD_YES, MHD_HTTP_Header::next, NULL, and MHD_HTTP_Header::value.
const char* MHD_lookup_connection_value | ( | struct MHD_Connection * | connection, | |
enum MHD_ValueKind | kind, | |||
const char * | key | |||
) |
Get a particular header value. If multiple values match the kind, return any one of them.
connection | connection to get values from | |
kind | what kind of value are we looking for | |
key | the header to look for, NULL to lookup 'trailing' value without a key |
Definition at line 211 of file connection.c.
References MHD_HTTP_Header::header, MHD_Connection::headers_received, MHD_HTTP_Header::kind, MHD_HTTP_Header::next, NULL, and MHD_HTTP_Header::value.
Referenced by MHD_basic_auth_get_username_password(), MHD_connection_handle_idle(), MHD_create_post_processor(), MHD_digest_auth_check(), MHD_digest_auth_get_username(), need_100_continue(), parse_connection_headers(), and parse_cookie_header().
Here is the caller graph for this function:
int MHD_queue_response | ( | struct MHD_Connection * | connection, | |
unsigned int | status_code, | |||
struct MHD_Response * | response | |||
) |
Queue a response to be transmitted to the client (as soon as possible but after MHD_AccessHandlerCallback returns).
connection | the connection identifying the client | |
status_code | HTTP status code (i.e. 200 for OK) | |
response | response to transmit |
Definition at line 240 of file connection.c.
References MHD_Connection::method, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_HEADERS_PROCESSED, MHD_HTTP_METHOD_HEAD, MHD_increment_response_rc(), MHD_NO, MHD_YES, NULL, MHD_Connection::read_closed, MHD_Connection::response, MHD_Connection::response_write_position, MHD_Connection::responseCode, SHUTDOWN, MHD_Connection::socket_fd, MHD_Connection::state, and MHD_Response::total_size.
Referenced by MHD_queue_auth_fail_response(), MHD_queue_basic_auth_fail_response(), parse_connection_headers(), and transmit_error_response().
Here is the call graph for this function:
Here is the caller graph for this function:
int MHD_set_connection_option | ( | struct MHD_Connection * | connection, | |
enum MHD_CONNECTION_OPTION | option, | |||
... | ||||
) |
Set a custom option for the given connection, overriding defaults.
connection | connection to modify | |
option | option to set | |
... | arguments to the option, depending on the option type |
Definition at line 2511 of file connection.c.
References MHD_Connection::connection_timeout, MHD_CONNECTION_OPTION_TIMEOUT, MHD_NO, and MHD_YES.
int MHD_set_connection_value | ( | struct MHD_Connection * | connection, | |
enum MHD_ValueKind | kind, | |||
const char * | key, | |||
const char * | value | |||
) |
This function can be used to append an entry to the list of HTTP headers of a connection (so that the MHD_get_connection_values function will return them -- and the MHD PostProcessor will also see them). This maybe required in certain situations (see Mantis #1399) where (broken) HTTP implementations fail to supply values needed by the post processor (or other parts of the application).
This function MUST only be called from within the MHD_AccessHandlerCallback (otherwise, access maybe improperly synchronized). Furthermore, the client must guarantee that the key and value arguments are 0-terminated strings that are NOT freed until the connection is closed. (The easiest way to do this is by passing only arguments to permanently allocated strings.).
connection | the connection for which a value should be set | |
kind | kind of the value | |
key | key for the value | |
value | the value itself |
Definition at line 172 of file connection.c.
References MHD_HTTP_Header::header, MHD_Connection::headers_received, MHD_Connection::headers_received_tail, MHD_HTTP_Header::kind, MHD_NO, MHD_pool_allocate(), MHD_YES, MHD_HTTP_Header::next, NULL, MHD_Connection::pool, and MHD_HTTP_Header::value.
Referenced by connection_add_header().
Here is the call graph for this function:
Here is the caller graph for this function:
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 2453 of file connection.c.
References MHD_Connection::idle_handler, MHD_connection_handle_idle(), MHD_connection_handle_read(), MHD_connection_handle_write(), MHD_Connection::read_handler, and MHD_Connection::write_handler.
Referenced by MHD_add_connection().
Here is the call graph for this function:
Here is the caller graph for this function:
static int need_100_continue | ( | struct MHD_Connection * | connection | ) | [static] |
Do we (still) need to send a 100 continue message for this connection?
connection | connection to test |
Definition at line 280 of file connection.c.
References MHD_Connection::continue_message_write_offset, HTTP_100_CONTINUE, MHD_HEADER_KIND, MHD_HTTP_HEADER_EXPECT, MHD_HTTP_VERSION_1_1, MHD_lookup_connection_value(), NULL, MHD_Connection::response, 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:
static int parse_arguments | ( | enum MHD_ValueKind | kind, | |
struct MHD_Connection * | connection, | |||
char * | args | |||
) | [static] |
Parse and unescape the arguments given by the client as part of the HTTP request URI.
kind | header kind to use for adding to the connection | |
connection | connection to add headers to | |
args | argument URI string (after "?" in URI) |
Definition at line 1117 of file connection.c.
References connection_add_header(), MHD_Connection::daemon, MHD_NO, MHD_YES, NULL, MHD_Daemon::unescape_callback, and MHD_Daemon::unescape_callback_cls.
Referenced by parse_initial_message_line().
Here is the call graph for this function:
Here is the caller graph for this function:
static void parse_connection_headers | ( | struct MHD_Connection * | connection | ) | [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.
Definition at line 1769 of file connection.c.
References CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, EXTRA_CHECK, MHD_Connection::have_chunked_upload, 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_LONG_LONG, MHD_lookup_connection_value(), MHD_queue_response(), MHD_RESPMEM_PERSISTENT, MHD_SIZE_UNKNOWN, MHD_USE_PEDANTIC_CHECKS, MHD_YES, NULL, MHD_Daemon::options, parse_cookie_header(), MHD_Connection::read_closed, MHD_Connection::remaining_upload_size, REQUEST_LACKS_HOST, MHD_Connection::response, MHD_Connection::state, 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:
static int parse_cookie_header | ( | struct MHD_Connection * | connection | ) | [static] |
Parse the cookie header (see RFC 2109).
Definition at line 1198 of file connection.c.
References connection_add_header(), MHD_Connection::daemon, MHD_COOKIE_KIND, MHD_HEADER_KIND, MHD_HTTP_HEADER_COOKIE, MHD_HTTP_REQUEST_ENTITY_TOO_LARGE, MHD_lookup_connection_value(), MHD_NO, MHD_pool_allocate(), MHD_YES, NULL, MHD_Connection::pool, REQUEST_TOO_BIG, and transmit_error_response().
Referenced by parse_connection_headers().
Here is the call graph for this function:
Here is the caller graph for this function:
static int parse_initial_message_line | ( | struct MHD_Connection * | connection, | |
char * | line | |||
) | [static] |
Parse the first line of the HTTP HEADER.
connection | the connection (updated) | |
line | the first line |
Definition at line 1294 of file connection.c.
References MHD_Connection::client_context, MHD_Connection::daemon, MHD_Connection::method, MHD_GET_ARGUMENT_KIND, MHD_NO, MHD_YES, NULL, parse_arguments(), MHD_Daemon::unescape_callback, MHD_Daemon::unescape_callback_cls, MHD_Daemon::uri_log_callback, 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:
static int 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.
line | the current input line | |
kind | if the line is complete, add a header of the given kind |
Definition at line 1707 of file connection.c.
References MHD_Connection::colon, connection_add_header(), EXTRA_CHECK, MHD_Connection::last, MHD_HTTP_BAD_REQUEST, MHD_HTTP_REQUEST_ENTITY_TOO_LARGE, MHD_NO, MHD_pool_reallocate(), MHD_YES, NULL, MHD_Connection::pool, process_header_line(), REQUEST_MALFORMED, REQUEST_TOO_BIG, and transmit_error_response().
Referenced by MHD_connection_handle_idle().
Here is the call graph for this function:
Here is the caller graph for this function:
static int 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.
Definition at line 1668 of file connection.c.
References MHD_Connection::colon, CONNECTION_CLOSE_ERROR, MHD_Connection::last, MHD_NO, MHD_YES, and NULL.
Referenced by MHD_connection_handle_idle(), and process_broken_line().
Here is the caller graph for this function:
static void process_request_body | ( | struct MHD_Connection * | connection | ) | [static] |
Call the handler of the application for this connection. Handles chunking of the upload as well as normal uploads.
1. no chunked encoding, give all to the client 2. client may send large chunked data, but only a smaller part is available at one time.
Definition at line 1375 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_Connection::have_chunked_upload, MHD_Connection::method, MHD_NO, mhd_panic, mhd_panic_cls, MHD_SIZE_UNKNOWN, MHD_YES, NULL, MHD_Connection::read_buffer, MHD_Connection::read_buffer_offset, MHD_Connection::remaining_upload_size, MHD_Connection::response, MHD_Connection::url, and MHD_Connection::version.
Referenced by MHD_connection_handle_idle().
Here is the caller graph for this function:
static void transmit_error_response | ( | struct MHD_Connection * | connection, | |
unsigned int | status_code, | |||
const char * | message | |||
) | [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 759 of file connection.c.
References build_header_response(), CONNECTION_CLOSE_ERROR, MHD_Connection::daemon, EXTRA_CHECK, MHD_CONNECTION_FOOTERS_RECEIVED, MHD_CONNECTION_HEADERS_SENDING, MHD_create_response_from_buffer(), MHD_destroy_response(), MHD_HTTP_VERSION_1_0, MHD_NO, MHD_queue_response(), MHD_RESPMEM_PERSISTENT, MHD_YES, NULL, MHD_Connection::read_closed, MHD_Connection::response, MHD_Connection::state, and MHD_Connection::version.
Referenced by connection_add_header(), get_next_header_line(), MHD_connection_get_pollfd(), MHD_connection_handle_idle(), parse_cookie_header(), and process_broken_line().
Here is the call graph for this function:
Here is the caller graph for this function:
static int try_grow_read_buffer | ( | struct MHD_Connection * | connection | ) | [static] |
Try growing the read buffer
connection | the connection |
Definition at line 608 of file connection.c.
References MHD_BUF_INC_SIZE, MHD_NO, MHD_pool_reallocate(), MHD_YES, NULL, MHD_Connection::pool, MHD_Connection::read_buffer, and MHD_Connection::read_buffer_size.
Referenced by MHD_connection_get_pollfd(), and MHD_connection_handle_read().
Here is the call graph for this function:
Here is the caller graph for this function:
static int try_ready_chunked_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).
connection | the connection |
Definition at line 434 of file connection.c.
References CONNECTION_CLOSE_ERROR, MHD_Response::crc, MHD_Response::crc_cls, MHD_Connection::daemon, MHD_Response::data, MHD_Response::data_size, MHD_Response::data_start, EXTRA_CHECK, MHD_CONNECTION_CHUNKED_BODY_UNREADY, MHD_CONTENT_READER_END_OF_STREAM, MHD_CONTENT_READER_END_WITH_ERROR, MHD_NO, MHD_pool_allocate(), MHD_YES, NULL, MHD_Connection::pool, MHD_Daemon::pool_size, 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:
static int 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).
connection | the connection |
Definition at line 365 of file connection.c.
References CONNECTION_CLOSE_ERROR, MHD_Response::crc, MHD_Response::crc_cls, MHD_Connection::daemon, MHD_Response::data, MHD_Response::data_buffer_size, MHD_Response::data_size, MHD_Response::data_start, MHD_Response::fd, MHD_CONNECTION_NORMAL_BODY_UNREADY, MHD_CONTENT_READER_END_OF_STREAM, MHD_CONTENT_READER_END_WITH_ERROR, MHD_MIN, MHD_NO, mhd_panic, mhd_panic_cls, MHD_USE_SELECT_INTERNALLY, MHD_USE_SSL, MHD_YES, NULL, MHD_Daemon::options, MHD_Connection::response, MHD_Connection::response_write_position, MHD_Connection::state, and MHD_Response::total_size.
Referenced by MHD_connection_handle_idle(), and MHD_connection_handle_write().
Here is the caller graph for this function: