33 #include <gnutls/gnutls.h> 34 #if GNUTLS_VERSION_MAJOR >= 3 35 #include <gnutls/abstract.h> 52 #define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, msg); BUILTIN_NOT_REACHED; } while (0) 59 #define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, NULL); BUILTIN_NOT_REACHED; } while (0) 72 #define MHD_fd_close_chk_(fd) do { \ 73 if (0 == close ((fd)) && (EBADF == errno)) \ 74 MHD_PANIC(_("Failed to close FD.\n")); \ 81 #define EXTRA_CHECKS MHD_NO 83 #define MHD_MAX(a,b) (((a)<(b)) ? (b) : (a)) 84 #define MHD_MIN(a,b) (((a)<(b)) ? (a) : (b)) 94 #define MHD_BUF_INC_SIZE 1024 108 #if defined(__clang__) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) 109 #define BUILTIN_NOT_REACHED __builtin_unreachable() 110 #elif defined(_MSC_FULL_VER) 111 #define BUILTIN_NOT_REACHED __assume(0) 113 #define BUILTIN_NOT_REACHED 191 #define MAX_NONCE_LENGTH 129 518 #define DEBUG_STATES MHD_NO 552 const void *write_to,
897 gnutls_session_t tls_session;
937 #define RESERVE_EBUF_SIZE 8 1020 size_t in_buffer_size;
1025 size_t out_buffer_size;
1030 size_t in_buffer_off;
1035 size_t out_buffer_off;
1073 (*LogCallback)(
void *cls,
1142 #ifdef EPOLL_SUPPORT 1249 #ifdef HAVE_MESSAGES 1254 void (*custom_error_log) (
void *cls,
const char *fmt, va_list va);
1259 void *custom_error_log_cls;
1326 #ifdef EPOLL_SUPPORT 1336 int listen_socket_in_epoll;
1343 int epoll_upgrade_fd;
1349 int upgrade_fd_in_epoll;
1357 struct MHD_itc_ itc;
1424 gnutls_priority_t priority_cache;
1430 gnutls_credentials_type_t cred_type;
1435 gnutls_certificate_credentials_t x509_cred;
1440 gnutls_dh_params_t dh_params;
1442 #if GNUTLS_VERSION_MAJOR >= 3 1447 gnutls_certificate_retrieve_function2 *cert_callback;
1453 const char *https_mem_key;
1458 const char *https_mem_cert;
1463 const char *https_key_password;
1468 const char *https_mem_trust;
1473 gnutls_dh_params_t https_mem_dhparams;
1486 unsigned int num_tls_read_ready;
1490 #ifdef DAUTH_SUPPORT 1495 const char *digest_auth_random;
1505 MHD_mutex_ nnc_lock;
1510 size_t digest_auth_rand_size;
1515 unsigned int nonce_nc_size;
1523 unsigned int fastopen_queue_size;
1534 #define EXTRA_CHECK(a) do { if (!(a)) abort(); } while (0) 1536 #define EXTRA_CHECK(a) 1548 #define DLL_insert(head,tail,element) do { \ 1549 EXTRA_CHECK (NULL == (element)->next); \ 1550 EXTRA_CHECK (NULL == (element)->prev); \ 1551 (element)->next = (head); \ 1552 (element)->prev = NULL; \ 1553 if ((tail) == NULL) \ 1556 (head)->prev = element; \ 1557 (head) = (element); } while (0) 1569 #define DLL_remove(head,tail,element) do { \ 1570 EXTRA_CHECK ( (NULL != (element)->next) || ((element) == (tail))); \ 1571 EXTRA_CHECK ( (NULL != (element)->prev) || ((element) == (head))); \ 1572 if ((element)->prev == NULL) \ 1573 (head) = (element)->next; \ 1575 (element)->prev->next = (element)->next; \ 1576 if ((element)->next == NULL) \ 1577 (tail) = (element)->prev; \ 1579 (element)->next->prev = (element)->prev; \ 1580 (element)->next = NULL; \ 1581 (element)->prev = NULL; } while (0) 1593 #define XDLL_insert(head,tail,element) do { \ 1594 EXTRA_CHECK (NULL == (element)->nextX); \ 1595 EXTRA_CHECK (NULL == (element)->prevX); \ 1596 (element)->nextX = (head); \ 1597 (element)->prevX = NULL; \ 1598 if (NULL == (tail)) \ 1601 (head)->prevX = element; \ 1602 (head) = (element); } while (0) 1614 #define XDLL_remove(head,tail,element) do { \ 1615 EXTRA_CHECK ( (NULL != (element)->nextX) || ((element) == (tail))); \ 1616 EXTRA_CHECK ( (NULL != (element)->prevX) || ((element) == (head))); \ 1617 if (NULL == (element)->prevX) \ 1618 (head) = (element)->nextX; \ 1620 (element)->prevX->nextX = (element)->nextX; \ 1621 if (NULL == (element)->nextX) \ 1622 (tail) = (element)->prevX; \ 1624 (element)->nextX->prevX = (element)->prevX; \ 1625 (element)->nextX = NULL; \ 1626 (element)->prevX = NULL; } while (0) 1637 #define EDLL_insert(head,tail,element) do { \ 1638 (element)->nextE = (head); \ 1639 (element)->prevE = NULL; \ 1640 if ((tail) == NULL) \ 1643 (head)->prevE = element; \ 1644 (head) = (element); } while (0) 1656 #define EDLL_remove(head,tail,element) do { \ 1657 if ((element)->prevE == NULL) \ 1658 (head) = (element)->nextE; \ 1660 (element)->prevE->nextE = (element)->nextE; \ 1661 if ((element)->nextE == NULL) \ 1662 (tail) = (element)->prevE; \ 1664 (element)->nextE->prevE = (element)->prevE; \ 1665 (element)->nextE = NULL; \ 1666 (element)->prevE = NULL; } while (0) 1715 unsigned int *num_headers);
unsigned int per_ip_connection_limit
void * unescape_callback_cls
additional automatic macros for MHD_config.h
size_t(* UnescapeCallback)(void *cls, struct MHD_Connection *conn, char *uri)
struct MHD_UpgradeResponseHandle * urh
uint64_t response_write_position
public interface to libmicrohttpd
ssize_t(* ReceiveCallback)(struct MHD_Connection *conn, void *write_to, size_t max_bytes)
size_t current_chunk_size
MHD_ContentReaderFreeCallback crfc
void(* MHD_ContentReaderFreeCallback)(void *cls)
struct MHD_Response * response
struct MHD_Connection * normal_timeout_tail
ssize_t(* TransmitCallback)(struct MHD_Connection *conn, const void *write_to, size_t max_bytes)
#define RESERVE_EBUF_SIZE
struct MHD_HTTP_Header * first_header
MHD_AccessHandlerCallback default_handler
size_t current_chunk_offset
uint64_t remaining_upload_size
unsigned int responseCode
struct MHD_UpgradeResponseHandle * urh
void * uri_log_callback_cls
void(* MHD_PanicCallback)(void *cls, const char *file, unsigned int line, const char *reason)
struct MHD_Daemon * daemon
int(* idle_handler)(struct MHD_Connection *connection)
int listening_address_reuse
MHD_mutex_ per_ip_connection_mutex
struct MHD_Connection * manual_timeout_head
MHD_NotifyConnectionCallback notify_connection
struct MHD_Connection * cleanup_head
MHD_PanicCallback mhd_panic
struct MHD_Connection * cleanup_tail
struct MHD_Connection * prev
size_t write_buffer_send_offset
struct MHD_Daemon * worker_pool
struct MHD_Connection * nextX
struct MHD_Connection * manual_timeout_tail
void MHD_cleanup_upgraded_connection_(struct MHD_Connection *connection)
size_t continue_message_write_offset
MHD_UpgradeHandler upgrade_handler
unsigned int connection_limit
char nonce[MAX_NONCE_LENGTH]
unsigned int worker_pool_size
LogCallback uri_log_callback
ssize_t(* MHD_ContentReaderCallback)(void *cls, uint64_t pos, char *buf, size_t max)
unsigned int reference_count
struct MHD_Connection * connection
struct MHD_Connection * normal_timeout_head
Header for platform-independent threads abstraction.
UnescapeCallback unescape_callback
int(* write_handler)(struct MHD_Connection *connection)
unsigned int listen_backlog_size
struct MHD_Connection * connections_head
struct MHD_Daemon * master
struct MHD_Connection * next
MHD_AcceptPolicyCallback apc
void *(* LogCallback)(void *cls, const char *uri, struct MHD_Connection *con)
unsigned int connection_timeout
int(* MHD_ArgumentIterator_)(struct MHD_Connection *connection, const char *key, const char *value, enum MHD_ValueKind kind)
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)
void(* MHD_RequestCompletedCallback)(void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe)
size_t write_buffer_append_offset
MHD_RequestCompletedCallback notify_completed
struct MHD_Connection * prevX
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
void * notify_connection_cls
MHD_ContentReaderCallback crc
Types for platform-independent inter-thread communication.
void MHD_unescape_plus(char *arg)
struct MHD_Connection * suspended_connections_tail
int MHD_parse_arguments_(struct MHD_Connection *connection, enum MHD_ValueKind kind, char *args, MHD_ArgumentIterator_ cb, unsigned int *num_headers)
void * per_ip_connection_count
size_t read_buffer_offset
void * default_handler_cls
MHD_ConnectionEventLoopInfo
unsigned int connection_timeout
MHD_mutex_ cleanup_connection_mutex
Header for platform-independent locks abstraction.
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
struct MHD_Connection * connections_tail
void * upgrade_handler_cls
MHD_FLAG
Flags for the struct MHD_Daemon.
struct MHD_HTTP_Header * headers_received_tail
struct MHD_Connection * suspended_connections_head