32 #include "microhttpd2.h" 41 #include <gnutls/gnutls.h> 42 #if GNUTLS_VERSION_MAJOR >= 3 43 #include <gnutls/abstract.h> 61 #define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, msg); \ 62 BUILTIN_NOT_REACHED; } while (0) 69 #define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, NULL); \ 70 BUILTIN_NOT_REACHED; } while (0) 87 enum MHD_StatusCode sc,
97 #define MHD_fd_close_chk_(fd) do { \ 98 if ( (0 != close ((fd)) && (EBADF == errno)) ) \ 99 MHD_PANIC (_ ("Failed to close FD.\n")); \ 106 #define EXTRA_CHECKS MHD_NO 108 #define MHD_MAX(a,b) (((a)<(b)) ? (b) : (a)) 109 #define MHD_MIN(a,b) (((a)<(b)) ? (a) : (b)) 119 #define MHD_BUF_INC_SIZE 1024 133 #if defined(__clang__) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= \ 135 #define BUILTIN_NOT_REACHED __builtin_unreachable () 136 #elif defined(_MSC_FULL_VER) 137 #define BUILTIN_NOT_REACHED __assume (0) 139 #define BUILTIN_NOT_REACHED 142 #ifndef MHD_STATICSTR_LEN_ 146 #define MHD_STATICSTR_LEN_(macro) (sizeof(macro) / sizeof(char) - 1) 197 const void *read_from,
323 #ifdef UPGRADE_SUPPORT 458 #ifdef UPGRADE_SUPPORT 465 struct MHD_UpgradeResponseHandle *urh;
531 #if defined(_MHD_HAVE_SENDFILE) 533 enum MHD_resp_sender_
535 MHD_resp_sender_std = 0,
536 MHD_resp_sender_sendfile
700 struct MHD_TLS_ConnectionState *tls_cs;
723 MHD_thread_handle_ID_
pid;
797 #ifdef UPGRADE_SUPPORT 807 #define RESERVE_EBUF_SIZE 8 815 struct UpgradeEpollHandle
821 struct MHD_UpgradeResponseHandle *urh;
853 struct MHD_UpgradeResponseHandle
866 struct MHD_UpgradeResponseHandle *next;
871 struct MHD_UpgradeResponseHandle *prev;
877 struct MHD_UpgradeResponseHandle *nextE;
882 struct MHD_UpgradeResponseHandle *prevE;
909 size_t in_buffer_size;
916 size_t out_buffer_size;
925 size_t in_buffer_used;
934 size_t out_buffer_used;
939 struct UpgradeEpollHandle app;
945 struct UpgradeEpollHandle mhd;
951 char e_buf[RESERVE_EBUF_SIZE];
965 volatile bool was_closed;
1077 #ifdef UPGRADE_SUPPORT 1083 struct MHD_UpgradeResponseHandle *urh_head;
1090 struct MHD_UpgradeResponseHandle *urh_tail;
1098 void *tls_backend_lib;
1111 const void *digest_auth_random_buf;
1189 #ifdef EPOLL_SUPPORT 1203 const char *epoll_itc_marker;
1204 #ifdef UPGRADE_SUPPORT 1208 struct MHD_UpgradeResponseHandle *eready_urh_head;
1213 struct MHD_UpgradeResponseHandle *eready_urh_tail;
1217 #ifdef DAUTH_SUPPORT 1222 const char *digest_auth_random;
1232 MHD_mutex_ nnc_lock;
1237 size_t digest_auth_rand_size;
1242 unsigned int nonce_nc_size;
1276 #define POOL_SIZE_DEFAULT (32 * 1024) 1290 #define BUF_INC_SIZE_DEFAULT 1024 1309 size_t digest_auth_random_buf_size;
1314 #define DIGEST_NC_LENGTH_DEFAULT 4 1320 size_t digest_nc_length;
1327 #define LISTEN_BACKLOG_DEFAULT SOMAXCONN 1329 #define LISTEN_BACKLOG_DEFAULT 511 1341 #define FO_QUEUE_LENGTH_DEFAULT 50 1379 #ifdef EPOLL_SUPPORT 1389 bool listen_socket_in_epoll;
1391 #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) 1396 int epoll_upgrade_fd;
1402 bool upgrade_fd_in_epoll;
1539 typedef enum MHD_StatusCode
1619 #ifdef UPGRADE_SUPPORT 1630 void *upgrade_handler_cls;
1733 unsigned int *num_headers);
1745 #define DLL_insert(head,tail,element) do { \ 1746 mhd_assert (NULL == (element)->next); \ 1747 mhd_assert (NULL == (element)->prev); \ 1748 (element)->next = (head); \ 1749 (element)->prev = NULL; \ 1750 if ((tail) == NULL) \ 1753 (head)->prev = element; \ 1754 (head) = (element); } while (0) 1765 #define DLL_remove(head,tail,element) do { \ 1766 mhd_assert ( (NULL != (element)->next) || ((element) == (tail))); \ 1767 mhd_assert ( (NULL != (element)->prev) || ((element) == (head))); \ 1768 if ((element)->prev == NULL) \ 1769 (head) = (element)->next; \ 1771 (element)->prev->next = (element)->next; \ 1772 if ((element)->next == NULL) \ 1773 (tail) = (element)->prev; \ 1775 (element)->next->prev = (element)->prev; \ 1776 (element)->next = NULL; \ 1777 (element)->prev = NULL; } while (0) 1789 #define XDLL_insert(head,tail,element) do { \ 1790 mhd_assert (NULL == (element)->nextX); \ 1791 mhd_assert (NULL == (element)->prevX); \ 1792 (element)->nextX = (head); \ 1793 (element)->prevX = NULL; \ 1794 if (NULL == (tail)) \ 1797 (head)->prevX = element; \ 1798 (head) = (element); } while (0) 1809 #define XDLL_remove(head,tail,element) do { \ 1810 mhd_assert ( (NULL != (element)->nextX) || ((element) == (tail))); \ 1811 mhd_assert ( (NULL != (element)->prevX) || ((element) == (head))); \ 1812 if (NULL == (element)->prevX) \ 1813 (head) = (element)->nextX; \ 1815 (element)->prevX->nextX = (element)->nextX; \ 1816 if (NULL == (element)->nextX) \ 1817 (tail) = (element)->prevX; \ 1819 (element)->nextX->prevX = (element)->prevX; \ 1820 (element)->nextX = NULL; \ 1821 (element)->prevX = NULL; } while (0) 1832 #define EDLL_insert(head,tail,element) do { \ 1833 (element)->nextE = (head); \ 1834 (element)->prevE = NULL; \ 1835 if ((tail) == NULL) \ 1838 (head)->prevE = element; \ 1839 (head) = (element); } while (0) 1850 #define EDLL_remove(head,tail,element) do { \ 1851 if ((element)->prevE == NULL) \ 1852 (head) = (element)->nextE; \ 1854 (element)->prevE->nextE = (element)->nextE; \ 1855 if ((element)->nextE == NULL) \ 1856 (tail) = (element)->prevE; \ 1858 (element)->nextE->prevE = (element)->prevE; \ 1859 (element)->nextE = NULL; \ 1860 (element)->prevE = NULL; } while (0) 1867 #define MHD_ERR_AGAIN_ (-3073) 1872 #define MHD_ERR_CONNRESET_ (-3074) 1878 #define MHD_ERR_NOTCONN_ (-3075) 1883 #define MHD_ERR_NOMEM_ (-3076) 1888 #define MHD_ERR_BADF_ (-3077) 1893 #define MHD_ERR_INVAL_ (-3078)
size_t continue_message_write_offset
struct MHD_Request request
enum MHD_EventLoopSyscall event_loop_syscall
additional automatic macros for MHD_config.h
bool data_already_pending
size_t connection_memory_limit_b
unsigned int ip_connection_limit
MHD_EarlyUriLogCallback early_uri_logger_cb
struct sockaddr_storage addr
struct MHD_Connection * cleanup_head
ssize_t(* ReceiveCallback)(struct MHD_Connection *conn, void *write_to, size_t max_bytes)
struct MHD_Connection * prevX
MHD_thread_handle_ID_ pid
size_t read_buffer_offset
unsigned int global_connection_limit
MHD_ContentReaderFreeCallback crfc
MHD_PanicCallback mhd_panic
MHD_AcceptPolicyCallback accept_policy_cb
void * termination_cb_cls
void(* MHD_ContentReaderFreeCallback)(void *cls)
size_t thread_stack_limit_b
uint64_t current_chunk_size
enum MHD_ProtocolStrictLevel protocol_strict_level
MHD_RequestTerminationCallback termination_cb
struct MHD_HTTP_Header * headers_received_tail
struct MHD_Connection * manual_timeout_head
MHD_thread_handle_ID_ pid
uint64_t current_chunk_offset
struct MHD_Daemon * daemon
void(* MHD_PanicCallback)(void *cls, const char *file, unsigned int line, const char *reason)
MHD_NotifyConnectionCallback notify_connection_cb
MHD_mutex_ per_ip_connection_mutex
time_t connection_default_timeout
enum MHD_REQUEST_STATE state
enum MHD_ConnKeepAlive keepalive
struct MHD_Daemon * daemon
struct MHD_Connection * next
struct MHD_HTTP_Header * first_header
struct MHD_Connection * connections_tail
struct MHD_Daemon * worker_pool
MHD_UnescapeCallback unescape_cb
enum MHD_FastOpenMethod fast_open_method
bool MHD_parse_arguments_(struct MHD_Request *request, enum MHD_ValueKind kind, char *args, MHD_ArgumentIterator_ cb, unsigned int *num_headers)
enum MHD_HTTP_StatusCode status_code
size_t connection_memory_increment_b
unsigned int worker_pool_size
struct MHD_Connection * connections_head
ssize_t(* MHD_ContentReaderCallback)(void *cls, uint64_t pos, char *buf, size_t max)
unsigned int reference_count
uint64_t remaining_upload_size
time_t connection_timeout
ssize_t(* TransmitCallback)(struct MHD_Connection *conn, const void *read_from, size_t max_bytes)
enum MHD_RequestEventLoopInfo event_loop_info
struct MHD_Daemon * master
struct MHD_Connection * manual_timeout_tail
struct MHD_Connection * prev
void * accept_policy_cb_cls
struct MHD_Connection * normal_timeout_head
struct MHD_Connection * nextX
MHD_LoggingCallback logger
struct MHD_Connection * suspended_connections_tail
struct MHD_Connection * cleanup_tail
struct MHD_HTTP_Header * headers_received
interface for TLS plugins of libmicrohttpd
size_t write_buffer_send_offset
struct MHD_Connection * normal_timeout_tail
struct MHD_Response * response
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 * early_uri_logger_cb_cls
enum MHD_StatusCode(* ActionCallback)(void *cls, struct MHD_Request *request)
TransmitCallback send_cls
enum MHD_AddressFamily listen_af
bool(* MHD_ArgumentIterator_)(struct MHD_Request *request, const char *key, const char *value, enum MHD_ValueKind kind)
uint64_t response_write_position
MHD_ContentReaderCallback crc
size_t write_buffer_append_offset
struct MHD_Connection * connection
bool disallow_suspend_resume
struct MHD_Connection * suspended_connections_head
void * per_ip_connection_count
void * notify_connection_cb_cls
enum MHD_ThreadingMode threading_mode
struct sockaddr_storage listen_sa
MHD_mutex_ cleanup_connection_mutex
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)
unsigned int fo_queue_length