34 #include <gnutls/gnutls.h>
35 #if GNUTLS_VERSION_MAJOR >= 3
36 #include <gnutls/abstract.h>
40 #include <sys/epoll.h>
42 #if HAVE_NETINET_TCP_H
44 #include <netinet/tcp.h>
52 #define EXTRA_CHECKS MHD_NO
54 #define MHD_MAX(a,b) ((a)<(b)) ? (b) : (a)
55 #define MHD_MIN(a,b) ((a)<(b)) ? (a) : (b)
65 #define MHD_BUF_INC_SIZE 1024
79 #if defined(__clang__) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
80 #define BUILTIN_NOT_REACHED __builtin_unreachable()
82 #define BUILTIN_NOT_REACHED
92 #define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, msg); BUILTIN_NOT_REACHED; } while (0)
99 #define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, NULL); BUILTIN_NOT_REACHED; } while (0)
177 #define MAX_NONCE_LENGTH 129
191 unsigned long int nc;
207 const char *format, ...);
472 #define DEBUG_STATES MHD_NO
491 void *write_to,
size_t max_bytes);
503 const void *write_to,
size_t max_bytes);
829 gnutls_session_t tls_session;
867 typedef void * (*LogCallback)(
void * cls,
1031 void (*custom_error_log) (
void *cls,
const char *fmt, va_list va);
1036 void *custom_error_log_cls;
1113 int listen_socket_in_epoll;
1171 gnutls_priority_t priority_cache;
1177 gnutls_credentials_type_t cred_type;
1182 gnutls_certificate_credentials_t x509_cred;
1187 gnutls_dh_params_t dh_params;
1189 #if GNUTLS_VERSION_MAJOR >= 3
1194 gnutls_certificate_retrieve_function2 *cert_callback;
1200 const char *https_mem_key;
1205 const char *https_mem_cert;
1210 const char *https_mem_trust;
1215 gnutls_dh_params_t https_mem_dhparams;
1228 unsigned int num_tls_read_ready;
1232 #ifdef DAUTH_SUPPORT
1237 const char *digest_auth_random;
1247 MHD_mutex_ nnc_lock;
1252 size_t digest_auth_rand_size;
1257 unsigned int nonce_nc_size;
1265 unsigned int fastopen_queue_size;
1271 #define EXTRA_CHECK(a) do { if (!(a)) abort(); } while (0)
1273 #define EXTRA_CHECK(a)
1285 #define DLL_insert(head,tail,element) do { \
1286 EXTRA_CHECK (NULL == (element)->next); \
1287 EXTRA_CHECK (NULL == (element)->prev); \
1288 (element)->next = (head); \
1289 (element)->prev = NULL; \
1290 if ((tail) == NULL) \
1293 (head)->prev = element; \
1294 (head) = (element); } while (0)
1306 #define DLL_remove(head,tail,element) do { \
1307 EXTRA_CHECK ( (NULL != (element)->next) || ((element) == (tail))); \
1308 EXTRA_CHECK ( (NULL != (element)->prev) || ((element) == (head))); \
1309 if ((element)->prev == NULL) \
1310 (head) = (element)->next; \
1312 (element)->prev->next = (element)->next; \
1313 if ((element)->next == NULL) \
1314 (tail) = (element)->prev; \
1316 (element)->next->prev = (element)->prev; \
1317 (element)->next = NULL; \
1318 (element)->prev = NULL; } while (0)
1330 #define XDLL_insert(head,tail,element) do { \
1331 EXTRA_CHECK (NULL == (element)->nextX); \
1332 EXTRA_CHECK (NULL == (element)->prevX); \
1333 (element)->nextX = (head); \
1334 (element)->prevX = NULL; \
1335 if (NULL == (tail)) \
1338 (head)->prevX = element; \
1339 (head) = (element); } while (0)
1351 #define XDLL_remove(head,tail,element) do { \
1352 EXTRA_CHECK ( (NULL != (element)->nextX) || ((element) == (tail))); \
1353 EXTRA_CHECK ( (NULL != (element)->prevX) || ((element) == (head))); \
1354 if (NULL == (element)->prevX) \
1355 (head) = (element)->nextX; \
1357 (element)->prevX->nextX = (element)->nextX; \
1358 if (NULL == (element)->nextX) \
1359 (tail) = (element)->prevX; \
1361 (element)->nextX->prevX = (element)->prevX; \
1362 (element)->nextX = NULL; \
1363 (element)->prevX = NULL; } while (0)
1374 #define EDLL_insert(head,tail,element) do { \
1375 (element)->nextE = (head); \
1376 (element)->prevE = NULL; \
1377 if ((tail) == NULL) \
1380 (head)->prevE = element; \
1381 (head) = (element); } while (0)
1393 #define EDLL_remove(head,tail,element) do { \
1394 if ((element)->prevE == NULL) \
1395 (head) = (element)->nextE; \
1397 (element)->prevE->nextE = (element)->nextE; \
1398 if ((element)->nextE == NULL) \
1399 (tail) = (element)->prevE; \
1401 (element)->nextE->prevE = (element)->prevE; \
1402 (element)->nextE = NULL; \
1403 (element)->prevE = NULL; } while (0)
unsigned int per_ip_connection_limit
void * unescape_callback_cls
void MHD_unescape_plus(char *arg)
ssize_t(* TransmitCallback)(struct MHD_Connection *conn, const void *write_to, size_t max_bytes)
int(* write_handler)(struct MHD_Connection *connection)
enum MHD_CONNECTION_STATE state
int(* idle_handler)(struct MHD_Connection *connection)
uint64_t response_write_position
public interface to libmicrohttpd
enum MHD_ConnectionEventLoopInfo event_loop_info
size_t current_chunk_size
MHD_ContentReaderFreeCallback crfc
void(* MHD_ContentReaderFreeCallback)(void *cls)
struct MHD_Response * response
void(* MHD_RequestCompletedCallback)(void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe)
struct MHD_Connection * normal_timeout_tail
void *(* LogCallback)(void *cls, const char *uri, struct MHD_Connection *con)
struct MHD_HTTP_Header * first_header
MHD_AccessHandlerCallback default_handler
size_t current_chunk_offset
uint64_t remaining_upload_size
unsigned int responseCode
void * uri_log_callback_cls
int(* read_handler)(struct MHD_Connection *connection)
struct MHD_Daemon * daemon
int listening_address_reuse
MHD_mutex_ per_ip_connection_mutex
struct MHD_Connection * manual_timeout_head
struct MHD_Connection * cleanup_head
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
size_t continue_message_write_offset
unsigned int connection_limit
char nonce[MAX_NONCE_LENGTH]
unsigned int worker_pool_size
time_t MHD_monotonic_time(void)
LogCallback uri_log_callback
unsigned int reference_count
int(* MHD_AcceptPolicyCallback)(void *cls, const struct sockaddr *addr, socklen_t addrlen)
ssize_t(* MHD_ContentReaderCallback)(void *cls, uint64_t pos, char *buf, size_t max)
size_t(* UnescapeCallback)(void *cls, struct MHD_Connection *conn, char *uri)
ssize_t(* ReceiveCallback)(struct MHD_Connection *conn, void *write_to, size_t max_bytes)
struct MHD_Connection * normal_timeout_head
UnescapeCallback unescape_callback
struct MHD_Connection * connections_head
struct MHD_Daemon * master
struct MHD_Connection * next
MHD_AcceptPolicyCallback apc
unsigned int connection_timeout
enum MHD_ResponseFlags flags
size_t write_buffer_append_offset
MHD_RequestCompletedCallback notify_completed
struct MHD_Connection * prevX
void * notify_completed_cls
TransmitCallback send_cls
MHD_ContentReaderCallback crc
struct MHD_Connection * suspended_connections_tail
MHD_PanicCallback mhd_panic
MHD_ConnectionEventLoopInfo
void * per_ip_connection_count
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)
size_t read_buffer_offset
void * default_handler_cls
unsigned int connection_timeout
MHD_mutex_ cleanup_connection_mutex
struct MHD_HTTP_Header * headers_received
struct MHD_Connection * connections_tail
struct MHD_HTTP_Header * headers_received_tail
struct MHD_Connection * suspended_connections_head
void(* MHD_PanicCallback)(void *cls, const char *file, unsigned int line, const char *reason)