36 #include <gnutls/gnutls.h> 37 #if GNUTLS_VERSION_MAJOR >= 3 38 #include <gnutls/abstract.h> 58 #define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, msg); BUILTIN_NOT_REACHED; } while (0) 65 #define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, NULL); BUILTIN_NOT_REACHED; } while (0) 68 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS) 69 #include "mhd_threads.h" 70 #include "mhd_locks.h" 80 #define MHD_fd_close_chk_(fd) do { \ 81 if ( (0 != close ((fd)) && (EBADF == errno)) ) \ 82 MHD_PANIC(_("Failed to close FD.\n")); \ 89 #define EXTRA_CHECKS MHD_NO 91 #define MHD_MAX(a,b) (((a)<(b)) ? (b) : (a)) 92 #define MHD_MIN(a,b) (((a)<(b)) ? (a) : (b)) 102 #define MHD_BUF_INC_SIZE 1024 116 #if defined(__clang__) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) 117 #define BUILTIN_NOT_REACHED __builtin_unreachable() 118 #elif defined(_MSC_FULL_VER) 119 #define BUILTIN_NOT_REACHED __assume(0) 121 #define BUILTIN_NOT_REACHED 124 #ifndef MHD_STATICSTR_LEN_ 128 #define MHD_STATICSTR_LEN_(macro) (sizeof(macro)/sizeof(char) - 1) 209 #define MHD_TEST_ALLOW_SUSPEND_RESUME 8192 217 #define MAX_NONCE_LENGTH 129 334 #ifdef UPGRADE_SUPPORT 345 void *upgrade_handler_cls;
348 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS) 524 #ifdef UPGRADE_SUPPORT 529 MHD_CONNECTION_UPGRADE
555 #define DEBUG_STATES MHD_NO 589 const void *read_from,
685 struct MemoryPool *
pool;
764 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS) 769 MHD_thread_handle_ID_
pid;
821 #if defined(_MHD_HAVE_SENDFILE) 822 enum MHD_resp_sender_
824 MHD_resp_sender_std = 0,
825 MHD_resp_sender_sendfile
896 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS) 971 #ifdef UPGRADE_SUPPORT 978 struct MHD_UpgradeResponseHandle *urh;
986 gnutls_session_t tls_session;
1027 #ifdef UPGRADE_SUPPORT 1037 #define RESERVE_EBUF_SIZE 8 1045 struct UpgradeEpollHandle
1051 struct MHD_UpgradeResponseHandle *urh;
1083 struct MHD_UpgradeResponseHandle
1092 #ifdef HTTPS_SUPPORT 1096 struct MHD_UpgradeResponseHandle *next;
1101 struct MHD_UpgradeResponseHandle *prev;
1103 #ifdef EPOLL_SUPPORT 1107 struct MHD_UpgradeResponseHandle *nextE;
1112 struct MHD_UpgradeResponseHandle *prevE;
1117 bool in_eready_list;
1139 size_t in_buffer_size;
1146 size_t out_buffer_size;
1155 size_t in_buffer_used;
1164 size_t out_buffer_used;
1169 struct UpgradeEpollHandle app;
1175 struct UpgradeEpollHandle mhd;
1181 char e_buf[RESERVE_EBUF_SIZE];
1195 volatile bool was_closed;
1232 (*LogCallback)(
void *cls,
1301 #ifdef EPOLL_SUPPORT 1312 #ifdef UPGRADE_SUPPORT 1316 struct MHD_UpgradeResponseHandle *eready_urh_head;
1321 struct MHD_UpgradeResponseHandle *eready_urh_tail;
1420 #ifdef HAVE_MESSAGES 1430 void *custom_error_log_cls;
1438 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS) 1460 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS) 1464 size_t thread_stack_size;
1474 MHD_thread_handle_ID_
pid;
1504 #ifdef EPOLL_SUPPORT 1514 bool listen_socket_in_epoll;
1516 #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) 1521 int epoll_upgrade_fd;
1527 bool upgrade_fd_in_epoll;
1536 struct MHD_itc_
itc;
1612 #ifdef HTTPS_SUPPORT 1613 #ifdef UPGRADE_SUPPORT 1619 struct MHD_UpgradeResponseHandle *urh_head;
1626 struct MHD_UpgradeResponseHandle *urh_tail;
1632 gnutls_priority_t priority_cache;
1638 gnutls_credentials_type_t cred_type;
1643 gnutls_certificate_credentials_t x509_cred;
1648 gnutls_dh_params_t dh_params;
1653 gnutls_psk_server_credentials_t psk_cred;
1655 #if GNUTLS_VERSION_MAJOR >= 3 1660 gnutls_certificate_retrieve_function2 *cert_callback;
1670 void *cred_callback_cls;
1676 const char *https_mem_key;
1681 const char *https_mem_cert;
1686 const char *https_key_password;
1691 const char *https_mem_trust;
1696 gnutls_dh_params_t https_mem_dhparams;
1705 #ifdef DAUTH_SUPPORT 1710 const char *digest_auth_random;
1717 #if defined(MHD_USE_POSIX_THREADS) || defined(MHD_USE_W32_THREADS) 1721 MHD_mutex_ nnc_lock;
1727 size_t digest_auth_rand_size;
1732 unsigned int nonce_nc_size;
1740 unsigned int fastopen_queue_size;
1758 #define DLL_insert(head,tail,element) do { \ 1759 mhd_assert (NULL == (element)->next); \ 1760 mhd_assert (NULL == (element)->prev); \ 1761 (element)->next = (head); \ 1762 (element)->prev = NULL; \ 1763 if ((tail) == NULL) \ 1766 (head)->prev = element; \ 1767 (head) = (element); } while (0) 1779 #define DLL_remove(head,tail,element) do { \ 1780 mhd_assert ( (NULL != (element)->next) || ((element) == (tail))); \ 1781 mhd_assert ( (NULL != (element)->prev) || ((element) == (head))); \ 1782 if ((element)->prev == NULL) \ 1783 (head) = (element)->next; \ 1785 (element)->prev->next = (element)->next; \ 1786 if ((element)->next == NULL) \ 1787 (tail) = (element)->prev; \ 1789 (element)->next->prev = (element)->prev; \ 1790 (element)->next = NULL; \ 1791 (element)->prev = NULL; } while (0) 1803 #define XDLL_insert(head,tail,element) do { \ 1804 mhd_assert (NULL == (element)->nextX); \ 1805 mhd_assert (NULL == (element)->prevX); \ 1806 (element)->nextX = (head); \ 1807 (element)->prevX = NULL; \ 1808 if (NULL == (tail)) \ 1811 (head)->prevX = element; \ 1812 (head) = (element); } while (0) 1824 #define XDLL_remove(head,tail,element) do { \ 1825 mhd_assert ( (NULL != (element)->nextX) || ((element) == (tail))); \ 1826 mhd_assert ( (NULL != (element)->prevX) || ((element) == (head))); \ 1827 if (NULL == (element)->prevX) \ 1828 (head) = (element)->nextX; \ 1830 (element)->prevX->nextX = (element)->nextX; \ 1831 if (NULL == (element)->nextX) \ 1832 (tail) = (element)->prevX; \ 1834 (element)->nextX->prevX = (element)->prevX; \ 1835 (element)->nextX = NULL; \ 1836 (element)->prevX = NULL; } while (0) 1847 #define EDLL_insert(head,tail,element) do { \ 1848 (element)->nextE = (head); \ 1849 (element)->prevE = NULL; \ 1850 if ((tail) == NULL) \ 1853 (head)->prevE = element; \ 1854 (head) = (element); } while (0) 1866 #define EDLL_remove(head,tail,element) do { \ 1867 if ((element)->prevE == NULL) \ 1868 (head) = (element)->nextE; \ 1870 (element)->prevE->nextE = (element)->nextE; \ 1871 if ((element)->nextE == NULL) \ 1872 (tail) = (element)->prevE; \ 1874 (element)->nextE->prevE = (element)->prevE; \ 1875 (element)->nextE = NULL; \ 1876 (element)->prevE = NULL; } while (0) 1929 unsigned int *num_headers);
1966 #define MHD_check_response_header_s_token_ci(r,k,tkn) \ 1967 MHD_check_response_header_token_ci((r),(k),MHD_STATICSTR_LEN_(k),\ 1968 (tkn),MHD_STATICSTR_LEN_(tkn))
unsigned int per_ip_connection_limit
void * unescape_callback_cls
additional automatic macros for MHD_config.h
uint64_t current_chunk_offset
bool data_already_pending
int(* MHD_PskServerCredentialsCallback)(void *cls, const struct MHD_Connection *connection, const char *username, void **psk, size_t *psk_size)
struct MHD_Connection * cleanup_head
enum MHD_CONNECTION_STATE state
uint64_t response_write_position
public interface to libmicrohttpd
enum MHD_ConnKeepAlive keepalive
ssize_t(* ReceiveCallback)(struct MHD_Connection *conn, void *write_to, size_t max_bytes)
enum MHD_ConnectionEventLoopInfo event_loop_info
struct MHD_Connection * prevX
MHD_thread_handle_ID_ pid
time_t connection_timeout
MHD_ContentReaderFreeCallback crfc
MHD_PanicCallback mhd_panic
void(* MHD_ContentReaderFreeCallback)(void *cls)
struct MHD_Response * response
volatile bool was_quiesced
struct MHD_Connection * manual_timeout_head
void *(* LogCallback)(void *cls, const char *uri, struct MHD_Connection *con)
MHD_thread_handle_ID_ pid
MHD_AccessHandlerCallback default_handler
uint64_t remaining_upload_size
unsigned int responseCode
void * uri_log_callback_cls
struct MHD_Daemon * daemon
void(* MHD_PanicCallback)(void *cls, const char *file, unsigned int line, const char *reason)
Types for platform-independent inter-thread communication.
void(* MHD_LogCallback)(void *cls, const char *fm, va_list ap)
int listening_address_reuse
MHD_mutex_ per_ip_connection_mutex
MHD_NotifyConnectionCallback notify_connection
struct MHD_Connection * next
struct MHD_HTTP_Header * first_header
bool MHD_check_response_header_token_ci(const struct MHD_Response *response, const char *key, size_t key_len, const char *token, size_t token_len)
size_t write_buffer_send_offset
struct MHD_Connection * connections_tail
struct MHD_Daemon * worker_pool
bool sk_tcp_cork_nopush_on
size_t continue_message_write_offset
bool MHD_parse_arguments_(struct MHD_Request *request, enum MHD_ValueKind kind, char *args, MHD_ArgumentIterator_ cb, unsigned int *num_headers)
unsigned int connection_limit
char nonce[MAX_NONCE_LENGTH]
unsigned int worker_pool_size
struct MHD_Connection * connections_head
void internal_suspend_connection_(struct MHD_Connection *connection)
LogCallback uri_log_callback
ssize_t(* MHD_ContentReaderCallback)(void *cls, uint64_t pos, char *buf, size_t max)
unsigned int reference_count
time_t connection_timeout
ssize_t(* TransmitCallback)(struct MHD_Connection *conn, const void *read_from, size_t max_bytes)
struct MHD_Daemon * master
struct MHD_Connection * manual_timeout_tail
struct MHD_Connection * prev
struct MHD_Connection * normal_timeout_head
struct MHD_Connection * nextX
UnescapeCallback unescape_callback
unsigned int listen_backlog_size
unsigned int connection_timeout_dummy
struct MHD_Connection * suspended_connections_tail
MHD_AcceptPolicyCallback apc
struct MHD_Connection * cleanup_tail
int(* MHD_AccessHandlerCallback)(void *cls, struct MHD_Connection *connection, const char *url, const char *method, const char *version, const char *upload_data, size_t *upload_data_size, void **con_cls)
enum MHD_ResponseFlags flags
void(* MHD_RequestCompletedCallback)(void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe)
size_t write_buffer_append_offset
struct MHD_Connection * normal_timeout_tail
MHD_RequestCompletedCallback notify_completed
void(* MHD_UpgradeHandler)(void *cls, struct MHD_Connection *connection, void *con_cls, const char *extra_in, size_t extra_in_size, MHD_socket sock, struct MHD_UpgradeResponseHandle *urh)
void * notify_completed_cls
TransmitCallback send_cls
bool(* MHD_ArgumentIterator_)(struct MHD_Request *request, const char *key, const char *value, enum MHD_ValueKind kind)
size_t(* UnescapeCallback)(void *cls, struct MHD_Connection *conn, char *uri)
void * notify_connection_cls
MHD_ContentReaderCallback crc
MHD_ConnectionEventLoopInfo
struct MHD_Connection * suspended_connections_head
void * per_ip_connection_count
size_t read_buffer_offset
void * default_handler_cls
MHD_mutex_ cleanup_connection_mutex
uint64_t current_chunk_size
int(* MHD_AcceptPolicyCallback)(void *cls, const struct sockaddr *addr, socklen_t addrlen)
void(* MHD_NotifyConnectionCallback)(void *cls, struct MHD_Connection *connection, void **socket_context, enum MHD_ConnectionNotificationCode toe)
struct MHD_HTTP_Header * headers_received
MHD_FLAG
Flags for the struct MHD_Daemon.
struct MHD_HTTP_Header * headers_received_tail
void MHD_unescape_plus(char *arg)