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); BUILTIN_NOT_REACHED; } while (0) 68 #define MHD_PANIC(msg) do { mhd_panic (mhd_panic_cls, __FILE__, __LINE__, NULL); BUILTIN_NOT_REACHED; } while (0) 85 enum MHD_StatusCode sc,
95 #define MHD_fd_close_chk_(fd) do { \ 96 if (0 == close ((fd)) && (EBADF == errno)) \ 97 MHD_PANIC(_("Failed to close FD.\n")); \ 104 #define EXTRA_CHECKS MHD_NO 106 #define MHD_MAX(a,b) (((a)<(b)) ? (b) : (a)) 107 #define MHD_MIN(a,b) (((a)<(b)) ? (a) : (b)) 117 #define MHD_BUF_INC_SIZE 1024 131 #if defined(__clang__) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) 132 #define BUILTIN_NOT_REACHED __builtin_unreachable() 133 #elif defined(_MSC_FULL_VER) 134 #define BUILTIN_NOT_REACHED __assume(0) 136 #define BUILTIN_NOT_REACHED 139 #ifndef MHD_STATICSTR_LEN_ 143 #define MHD_STATICSTR_LEN_(macro) (sizeof(macro)/sizeof(char) - 1) 194 const void *read_from,
320 #ifdef UPGRADE_SUPPORT 455 #ifdef UPGRADE_SUPPORT 462 struct MHD_UpgradeResponseHandle *urh;
528 #if defined(_MHD_HAVE_SENDFILE) 530 enum MHD_resp_sender_
532 MHD_resp_sender_std = 0,
533 MHD_resp_sender_sendfile
697 struct MHD_TLS_ConnectionState *tls_cs;
720 MHD_thread_handle_ID_
pid;
794 #ifdef UPGRADE_SUPPORT 804 #define RESERVE_EBUF_SIZE 8 812 struct UpgradeEpollHandle
818 struct MHD_UpgradeResponseHandle *urh;
850 struct MHD_UpgradeResponseHandle
863 struct MHD_UpgradeResponseHandle *next;
868 struct MHD_UpgradeResponseHandle *prev;
874 struct MHD_UpgradeResponseHandle *nextE;
879 struct MHD_UpgradeResponseHandle *prevE;
906 size_t in_buffer_size;
913 size_t out_buffer_size;
922 size_t in_buffer_used;
931 size_t out_buffer_used;
936 struct UpgradeEpollHandle app;
942 struct UpgradeEpollHandle mhd;
948 char e_buf[RESERVE_EBUF_SIZE];
962 volatile bool was_closed;
1074 #ifdef UPGRADE_SUPPORT 1080 struct MHD_UpgradeResponseHandle *urh_head;
1087 struct MHD_UpgradeResponseHandle *urh_tail;
1095 void *tls_backend_lib;
1108 const void *digest_auth_random_buf;
1186 #ifdef EPOLL_SUPPORT 1200 const char *epoll_itc_marker;
1201 #ifdef UPGRADE_SUPPORT 1205 struct MHD_UpgradeResponseHandle *eready_urh_head;
1210 struct MHD_UpgradeResponseHandle *eready_urh_tail;
1214 #ifdef DAUTH_SUPPORT 1219 const char *digest_auth_random;
1229 MHD_mutex_ nnc_lock;
1234 size_t digest_auth_rand_size;
1239 unsigned int nonce_nc_size;
1273 #define POOL_SIZE_DEFAULT (32 * 1024) 1287 #define BUF_INC_SIZE_DEFAULT 1024 1306 size_t digest_auth_random_buf_size;
1311 #define DIGEST_NC_LENGTH_DEFAULT 4 1317 size_t digest_nc_length;
1324 #define LISTEN_BACKLOG_DEFAULT SOMAXCONN 1326 #define LISTEN_BACKLOG_DEFAULT 511 1338 #define FO_QUEUE_LENGTH_DEFAULT 50 1376 #ifdef EPOLL_SUPPORT 1386 bool listen_socket_in_epoll;
1388 #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) 1393 int epoll_upgrade_fd;
1399 bool upgrade_fd_in_epoll;
1536 typedef enum MHD_StatusCode
1616 #ifdef UPGRADE_SUPPORT 1627 void *upgrade_handler_cls;
1730 unsigned int *num_headers);
1742 #define DLL_insert(head,tail,element) do { \ 1743 mhd_assert (NULL == (element)->next); \ 1744 mhd_assert (NULL == (element)->prev); \ 1745 (element)->next = (head); \ 1746 (element)->prev = NULL; \ 1747 if ((tail) == NULL) \ 1750 (head)->prev = element; \ 1751 (head) = (element); } while (0) 1762 #define DLL_remove(head,tail,element) do { \ 1763 mhd_assert ( (NULL != (element)->next) || ((element) == (tail))); \ 1764 mhd_assert ( (NULL != (element)->prev) || ((element) == (head))); \ 1765 if ((element)->prev == NULL) \ 1766 (head) = (element)->next; \ 1768 (element)->prev->next = (element)->next; \ 1769 if ((element)->next == NULL) \ 1770 (tail) = (element)->prev; \ 1772 (element)->next->prev = (element)->prev; \ 1773 (element)->next = NULL; \ 1774 (element)->prev = NULL; } while (0) 1786 #define XDLL_insert(head,tail,element) do { \ 1787 mhd_assert (NULL == (element)->nextX); \ 1788 mhd_assert (NULL == (element)->prevX); \ 1789 (element)->nextX = (head); \ 1790 (element)->prevX = NULL; \ 1791 if (NULL == (tail)) \ 1794 (head)->prevX = element; \ 1795 (head) = (element); } while (0) 1806 #define XDLL_remove(head,tail,element) do { \ 1807 mhd_assert ( (NULL != (element)->nextX) || ((element) == (tail))); \ 1808 mhd_assert ( (NULL != (element)->prevX) || ((element) == (head))); \ 1809 if (NULL == (element)->prevX) \ 1810 (head) = (element)->nextX; \ 1812 (element)->prevX->nextX = (element)->nextX; \ 1813 if (NULL == (element)->nextX) \ 1814 (tail) = (element)->prevX; \ 1816 (element)->nextX->prevX = (element)->prevX; \ 1817 (element)->nextX = NULL; \ 1818 (element)->prevX = NULL; } while (0) 1829 #define EDLL_insert(head,tail,element) do { \ 1830 (element)->nextE = (head); \ 1831 (element)->prevE = NULL; \ 1832 if ((tail) == NULL) \ 1835 (head)->prevE = element; \ 1836 (head) = (element); } while (0) 1847 #define EDLL_remove(head,tail,element) do { \ 1848 if ((element)->prevE == NULL) \ 1849 (head) = (element)->nextE; \ 1851 (element)->prevE->nextE = (element)->nextE; \ 1852 if ((element)->nextE == NULL) \ 1853 (tail) = (element)->prevE; \ 1855 (element)->nextE->prevE = (element)->prevE; \ 1856 (element)->nextE = NULL; \ 1857 (element)->prevE = NULL; } while (0) 1864 #define MHD_ERR_AGAIN_ (-3073) 1869 #define MHD_ERR_CONNRESET_ (-3074) 1875 #define MHD_ERR_NOTCONN_ (-3075) 1880 #define MHD_ERR_NOMEM_ (-3076) 1885 #define MHD_ERR_BADF_ (-3077) 1890 #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