diff --git a/src/include/microhttpd2.h b/src/include/microhttpd2.h index 23286bcf..40b26b70 100644 --- a/src/include/microhttpd2.h +++ b/src/include/microhttpd2.h @@ -18,127 +18,128 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/** - * Main goals for the libmicrohttpd 2.0 API: - * - * - simplify application callbacks by splitting header/upload/post - * functionality currently provided by calling the same - * MHD_AccessHandlerCallback 3+ times into separate callbacks. - * - keep the API very simple for simple requests, but allow - * more complex logic to be incrementally introduced - * (via new struct MHD_Action construction) - * - avoid repeated scans for URL matches via the new - * struct MHD_Action construction - * - better types, in particular avoid varargs for options - * - make it harder to pass inconsistent options - * - combine options and flags into more uniform API (at least - * exterally!) - * - simplify API use by using sane defaults (benefiting from - * breaking backwards compatibility) and making all options - * really optional, and where applicable avoid having options - * where the default works if nothing is specified - * - simplify API by moving rarely used http_version into - * MHD_request_get_info_fixed() - * - avoid 'int' for MHD_YES/MHD_NO by introducing `enum MHD_Bool` - * - improve terminology by eliminating confusion between - * 'request' and 'connection'; add 'session' for HTTP2/3; - * use clear separation between connection and request. Do not mix the kind - * data in the callbacks. Currently we are mixing things in - * MHD_AccessHandlerCallback and MHD_RequestCompletedCallback. Instead of - * pointers to struct MHD_Connection we should use pointers to (new) struct - * MHD_Request. - * - prepare API for having multiple TLS backends - * - use more consistent prefixes for related functions - * by using MHD_subject_verb_object naming convention, also - * at the same time avoid symbol conflict with legacy names - * (so we can have one binary implementing old and new - * library API at the same time via compatibility layer). - * - make it impossible to queue a response at the wrong time - * - make it impossible to suspend a connection/request at the - * wrong time (improves thread-safety) - * - make it clear which response status codes are "properly" - * supported (include the descriptive string) by using an enum; - * - simplify API for common-case of one-shot responses by - * eliminating need for destroy response in most cases; - * - avoid fixed types, like uint32_t. They may not exist on some - * platforms. Instead use uint_fast32_t. - * It is also better for future-proof. - * - check portability for embedded platforms. Some of them support - * 64 bits, but 'int' could be just 16 bits resulting of silently - * dropping enum values higher than 65535. - * => in general, more functions, fewer enums for setup - * - Avoid returning pointers to internal members. It is not thread-safe and - * even in single thread the value could change over the time. Prefer pointers to - * app-allocated memory with the size, like MHD_daemon_get_static_info(enum - * MHD_enum_name info_type, void *buf, size_t buf_size). - * => Except in cases where zero-copy matters. - * - Use separate app calls/functions for data the will not change for the - * lifetime of the object and dynamic data. The only difference should be the - * name. Like MHD_daemon_get_static_info(enum MHD_enum_name info_type, void *buf, - * size_t buf_size) MHD_daemon_get_dynamic_info(enum MHD_enum_name info_type, - * void *buf, size_t buf_size) Examples of static data: listen socket, number of - * workers, daemon flags. Examples of dynamic data: number of connections, - * quiesce status. It should give a clear idea whether the data could be changed - * over the time (could be not obvious for some data) and thus may change the - * approach how to use the data in app. The same for: library, daemon, - * connection, request. Not sure that dynamic data makes sense for the library. - * - Define response code in response object. There are a very little - * chance that response body designed for 404 or 403 codes will be used with - * 200 code. However, the responses body for 307 and 308 could be the same. So: - * Add default response code in response object. - * - Make responses unmodifiable after first use. It is not thread-safe. - * MHD-generated headers (Date, Connection/Keep-Alive) are again - * part of the *request* and do not count as part of the "response" here. - * - Remove "footers" from responses. With unmodifiable responses everything should - * be "headers". Add footers to *requests* instead. - * - Add API for adding request-specific response headers and footers. To - * simplify the things it should just copy the strings (to avoid dealing with - * complicated deinit of possible dynamic strings). After this change it should - * be possible to simplify DAuth handling as response could be reused (currently - * 403 responses are modified for each reply). - * - Control response behaviour mainly by response flags, not by additional - * headers (like MHD_RF_FORCE_CLOSE instead of "Connection: close"). - * It is easier&faster for both: app and MHD. - * - Move response codes from MHD_HTTP_xxx namespace to MHD_HTTP_CODE_xxx - * namespace. It already may clash with other HTTP values. - * - Postprocessor is unusable night-mare when doing "stream processing" - * for tiny values where the application basically has to copy together - * the stream back into a single compact heap value, just making the - * parsing highly more complicated (see examples in Challenger) - * - non-stream processing variant for request bodies, give apps a - * way to request the full body in one buffer; give apps a way - * to request a 'large new allocation' for such buffers; give apps - * a way to specify a global quota for large allocations to ensure - * memory usage has a hard bound - * - * - Internals: carefully check where locking is really required. Probably - * separate locks. Check out-of-thread value reading. Currently code assumes - * atomic reading of values used in other threads, which mostly true on x86, - * but not OK on other arches. Probably use read/write locking to minimize - * the threads interference. - * - Internals: figure out how to do portable variant of cork/uncork - * - Internals: remove request data from memory pool when response is queued - * (IF no callbacks and thus data cannot be used anymore, or IF - * application permits explictly per daemon) to get more space - * for building response; - * - Internals: Fix TCP FIN graceful closure issue for upgraded - * connections (API implications?) - * - * - Enable providing default logarithmic implementation of URL scan - * => reduce strcmp(url) from >= 3n operations to "log n" - * per request. Match on method + URL (longest-prefix /foo/bar/* /foo/ /foo /fo, etc). - * "GET /foo/$ARG/$BAR/match" - * struct MHD_Dispatcher; - * - * struct MHD_Dispatcher * - * MHD_dispatcher_create (...); - * enum {no_url, no_method, found} - * MHD_dispatcher_dispatch (dispatcher, url, method, *result); - * MHD_RequestCallback - * MHD_dispatcher_get_callback (struct MHD_Dispatcher *dispatcher); - * struct MHD_dispatcher_destroy (*dispatcher); - * +/* + Main goals for the libmicrohttpd 2.0 API: + + - simplify application callbacks by splitting header/upload/post + functionality currently provided by calling the same + MHD_AccessHandlerCallback 3+ times into separate callbacks. + - keep the API very simple for simple requests, but allow + more complex logic to be incrementally introduced + (via new struct MHD_Action construction) + - avoid repeated scans for URL matches via the new + struct MHD_Action construction + - better types, in particular avoid varargs for options + - make it harder to pass inconsistent options + - combine options and flags into more uniform API (at least + exterally!) + - simplify API use by using sane defaults (benefiting from + breaking backwards compatibility) and making all options + really optional, and where applicable avoid having options + where the default works if nothing is specified + - simplify API by moving rarely used http_version into + MHD_request_get_info_fixed() + - avoid 'int' for MHD_YES/MHD_NO by introducing `enum MHD_Bool` + - improve terminology by eliminating confusion between + 'request' and 'connection'; add 'session' for HTTP2/3; + use clear separation between connection and request. Do not mix the kind + data in the callbacks. Currently we are mixing things in + MHD_AccessHandlerCallback and MHD_RequestCompletedCallback. Instead of + pointers to struct MHD_Connection we should use pointers to (new) struct + MHD_Request. + - prepare API for having multiple TLS backends + - use more consistent prefixes for related functions + by using MHD_subject_verb_object naming convention, also + at the same time avoid symbol conflict with legacy names + (so we can have one binary implementing old and new + library API at the same time via compatibility layer). + - make it impossible to queue a response at the wrong time + - make it impossible to suspend a connection/request at the + wrong time (improves thread-safety) + - make it clear which response status codes are "properly" + supported (include the descriptive string) by using an enum; + - simplify API for common-case of one-shot responses by + eliminating need for destroy response in most cases; + - avoid fixed types, like uint32_t. They may not exist on some + platforms. Instead use uint_fast32_t. + It is also better for future-proof. + - check portability for embedded platforms. Some of them support + 64 bits, but 'int' could be just 16 bits resulting of silently + dropping enum values higher than 65535. + => in general, more functions, fewer enums for setup + - Avoid returning pointers to internal members. It is not thread-safe and + even in single thread the value could change over the time. Prefer pointers to + app-allocated memory with the size, like MHD_daemon_get_static_info(enum + MHD_enum_name info_type, void *buf, size_t buf_size). + => Except in cases where zero-copy matters. + - Use separate app calls/functions for data the will not change for the + lifetime of the object and dynamic data. The only difference should be the + name. Like MHD_daemon_get_static_info(enum MHD_enum_name info_type, void *buf, + size_t buf_size) MHD_daemon_get_dynamic_info(enum MHD_enum_name info_type, + void *buf, size_t buf_size) Examples of static data: listen socket, number of + workers, daemon flags. Examples of dynamic data: number of connections, + quiesce status. It should give a clear idea whether the data could be changed + over the time (could be not obvious for some data) and thus may change the + approach how to use the data in app. The same for: library, daemon, + connection, request. Not sure that dynamic data makes sense for the library. + - Define response code in response object. There are a very little + chance that response body designed for 404 or 403 codes will be used with + 200 code. However, the responses body for 307 and 308 could be the same. So: + Add default response code in response object. + - Make responses unmodifiable after first use. It is not thread-safe. + MHD-generated headers (Date, Connection/Keep-Alive) are again + part of the *request* and do not count as part of the "response" here. + - Remove "footers" from responses. With unmodifiable responses everything should + be "headers". Add footers to *requests* instead. + - Add API for adding request-specific response headers and footers. To + simplify the things it should just copy the strings (to avoid dealing with + complicated deinit of possible dynamic strings). After this change it should + be possible to simplify DAuth handling as response could be reused (currently + 403 responses are modified for each reply). + - Control response behaviour mainly by response flags, not by additional + headers (like MHD_RF_FORCE_CLOSE instead of "Connection: close"). + It is easier&faster for both: app and MHD. + - Move response codes from MHD_HTTP_xxx namespace to MHD_HTTP_CODE_xxx + namespace. It already may clash with other HTTP values. + - Postprocessor is unusable night-mare when doing "stream processing" + for tiny values where the application basically has to copy together + the stream back into a single compact heap value, just making the + parsing highly more complicated (see examples in Challenger) + - non-stream processing variant for request bodies, give apps a + way to request the full body in one buffer; give apps a way + to request a 'large new allocation' for such buffers; give apps + a way to specify a global quota for large allocations to ensure + memory usage has a hard bound + + - Internals: carefully check where locking is really required. Probably + separate locks. Check out-of-thread value reading. Currently code assumes + atomic reading of values used in other threads, which mostly true on x86, + but not OK on other arches. Probably use read/write locking to minimize + the threads interference. + - Internals: figure out how to do portable variant of cork/uncork + - Internals: remove request data from memory pool when response is queued + (IF no callbacks and thus data cannot be used anymore, or IF + application permits explictly per daemon) to get more space + for building response; + - Internals: Fix TCP FIN graceful closure issue for upgraded + connections (API implications?) + + - Enable providing default logarithmic implementation of URL scan + => reduce strcmp(url) from >= 3n operations to "log n" + per request. Match on method + URL (longest-prefix /foo/bar/* /foo/ /foo /fo, etc). + "GET /foo/$ARG/$BAR/match" + struct MHD_Dispatcher; + + struct MHD_Dispatcher * + MHD_dispatcher_create (...); + enum {no_url, no_method, found} + MHD_dispatcher_dispatch (dispatcher, url, method, *result); + MHD_RequestCallback + MHD_dispatcher_get_callback (struct MHD_Dispatcher *dispatcher); + struct MHD_dispatcher_destroy (*dispatcher); + */ + #ifndef MICROHTTPD2_H #define MICROHTTPD2_H @@ -187,9 +188,9 @@ MHD_C_DECLRATIONS_START_HERE_ /** * Current version of the library. - * 0x01093001 = 1.9.30-1. + * Packed BCD: 0x01093001 = 1.9.30-1. */ -#define MHD_VERSION 0x02000001 +#define MHD_VERSION 0x01990001 /** * Representation of 'bool' in the public API as stdbool.h may not @@ -1122,6 +1123,18 @@ struct MHD_Request; */ struct MHD_Action; +/** + * @defgroup general Primary MHD functions and data + */ + +/** + * @defgroup specialized Introspection and other special control + */ + +/** + * @defgroup authentication Digest and other HTTP authentications + */ + /** * Return values for reporting errors, also used for logging. @@ -2545,7 +2558,6 @@ MHD_FN_PAR_NONNULL_ (1) MHD_FN_PAR_IN_ (1); * @param[in,out] daemon daemon to start; you can no longer set * options on this daemon after this call! * @return #MHD_SC_OK on success - * @ingroup event * @ingroup daemon */ MHD_EXTERN_ enum MHD_StatusCode @@ -2566,7 +2578,6 @@ MHD_FN_PAR_NONNULL_ (1); * @return the old listen socket on success, #MHD_INVALID_SOCKET if * the daemon was already not listening anymore, or * was never started, or has no listen socket. - * @ingroup specialized * @ingroup daemon */ MHD_EXTERN_ MHD_socket @@ -2578,7 +2589,6 @@ MHD_FN_PAR_NONNULL_ALL_ MHD_FN_PAR_INOUT_ (1); * Shutdown and destroy an HTTP daemon. * * @param[in] daemon daemon to stop - * @ingroup event * @ingroup daemon */ MHD_EXTERN_ void @@ -2587,6 +2597,10 @@ MHD_FN_PAR_NONNULL_ALL_; /* ******************* External event loop ************************ */ +/** + * @defgroup event External network events processing + */ + /** * The network status of the socket. * When set by MHD (by #MHD_get_watched_fds(), #MHD_get_watched_fds_update() and @@ -2735,11 +2749,6 @@ enum MHD_FIXED_ENUM_ MHD_FdState MHD_FD_STATE_CLEAR ((var),MHD_FD_STATE_EXCEPT) -/* Changes: - * + status update callback replaced with function - * + status update accepts array of updates - */ - /** * The context data to be used for updates of the socket state */ @@ -2787,15 +2796,15 @@ typedef MHD_APP_SOCKET_CNTX_TYPE * /** * Update the sockets state. * Must be called for every socket that got state updated. - * For #MHD_TM_EXTERNAL_EVENT_LOOP_CB_LEVEL mode should be called for each - * socket. - * Available only for daemons stated in #MHD_TM_EXTERNAL_EVENT_LOOP_CB_LEVEL or - * #MHD_TM_EXTERNAL_EVENT_LOOP_CB_EDGE modes. + * For #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL() mode + * should be called for each socket. + * Available only for daemons stated in + * #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL or + * #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_EDGE modes. * @param daemon the daemon handle * @param ecb_cntx the context handle provided * for #MHD_SocketRegistrationUpdateCallback * @param fd_current_state the current state of the socket - * @ingroup daemon * @ingroup event */ MHD_EXTERN_ void @@ -2822,7 +2831,6 @@ MHD_FN_PAR_NONNULL_ (1) MHD_FN_PAR_NONNULL_ (2); * polling function, can be NULL * @return #MHD_SC_OK on success, * error code otherwise - * @ingroup daemon * @ingroup event */ MHD_EXTERN_ enum MHD_StatusCode @@ -2843,6 +2851,8 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_WorkMode * The application periodically calls #MHD_daemon_process_blocking(), where * MHD internally checks all sockets automatically. * This is the default mode. + * Use helper macro #MHD_D_OPTION_WM_EXTERNAL_PERIODIC() to enable + * this mode. */ MHD_WM_EXTERNAL_PERIODIC = 0 , @@ -2850,6 +2860,8 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_WorkMode * Work mode with an external event loop with level triggers. * Application uses #MHD_SocketRegistrationUpdateCallback, level triggered * sockets polling (like select() or poll()) and #MHD_daemon_event_update(). + * Use helper macro #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL() to enable + * this mode. */ MHD_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL = 8 , @@ -2857,6 +2869,8 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_WorkMode * Work mode with an external event loop with edge triggers. * Application uses #MHD_SocketRegistrationUpdateCallback, edge triggered * sockets polling (like epoll with EPOLLET) and #MHD_daemon_event_update(). + * Use helper macro #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_EDGE() to enable + * this mode. */ MHD_WM_EXTERNAL_EVENT_LOOP_CB_EDGE = 9 , @@ -2869,17 +2883,21 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_WorkMode * GNU/Linux only), see #MHD_LIB_INFO_FIXED_HAS_AGGREGATE_FD. * When the FD is triggered, #MHD_daemon_process_nonblocking() should * be called. + * Use helper macro #MHD_D_OPTION_WM_EXTERNAL_SINGLE_FD_WATCH() to enable + * this mode. */ MHD_WM_EXTERNAL_SINGLE_FD_WATCH = 16 , /** * Work mode with one or more worker threads. - * If #MHD_DAEMON_OPTION_UINT_NUM_WORKERS is not specified + * If #MHD_D_OPTION_UINT_NUM_WORKERS is not specified * then daemon starts with single worker thread that process * all connections. - * If #MHD_DAEMON_OPTION_UINT_NUM_WORKERS used with value more + * If #MHD_D_OPTION_UINT_NUM_WORKERS used with value more * than one, then that number of worker threads and distributed * processing of requests among the workers. + * Use helper macro #MHD_D_OPTION_WM_WORKER_THREADS() to enable + * this mode. */ MHD_WM_WORKER_THREADS = 24 , @@ -2888,6 +2906,8 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_WorkMode * per every connection. Use this if handling requests is CPU-intensive or * blocking, your application is thread-safe and you have plenty of * memory (per connection). + * Use helper macro #MHD_D_OPTION_WM_THREAD_PER_CONNECTION() to enable + * this mode. */ MHD_WM_THREAD_PER_CONNECTION = 32 }; @@ -3199,6 +3219,10 @@ MHD_WM_OPTION_THREAD_PER_CONNECTION (void) MHD_RESTORE_WARN_UNUSED_FUNC_ #endif /* !MHD_USE_COMPOUND_LITERALS || !MHD_USE_DESIG_NEST_INIT */ +/** + * @defgroup logging Log events and control + */ + /** * Type of a callback function used for logging by MHD. @@ -3226,19 +3250,19 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOptionBindType * The listen socket bind to the networks address without sharing the address. * Default. */ - MHD_DAEMON_OPTION_BIND_TYPE_NOT_SHARED = 0 + MHD_D_OPTION_BIND_TYPE_NOT_SHARED = 0 , /** * The listen socket bind to the networks address with sharing the address. * Several sockets can bind to the same address. */ - MHD_DAEMON_OPTION_BIND_TYPE_SHARED = 1 + MHD_D_OPTION_BIND_TYPE_SHARED = 1 , /** * The list socket bind to the networks address in explicit exclusive mode. * Ignored on platforms without support for the explicit exclusive socket use. */ - MHD_DAEMON_OPTION_BIND_TYPE_EXCLUSIVE = 2 + MHD_D_OPTION_BIND_TYPE_EXCLUSIVE = 2 }; @@ -3494,12 +3518,12 @@ enum MHD_FIXED_FLAGS_ENUM_APP_SET_ MHD_DaemonOptionValueDAuthBindNonce * when clients' requests are intensive. * This value cannot be biwise-OR combined with other values. */ - MHD_DAEMON_OPTION_VALUE_DAUTH_BIND_NONCE_NONE = 0 + MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_NONE = 0 , /** * Generated nonces are valid only for the same realm. */ - MHD_DAEMON_OPTION_VALUE_DAUTH_BIND_NONCE_REALM = (1 << 0) + MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_REALM = (1 << 0) , /** * Generated nonces are valid only for the same URI (excluding parameters @@ -3508,10 +3532,8 @@ enum MHD_FIXED_FLAGS_ENUM_APP_SET_ MHD_DaemonOptionValueDAuthBindNonce * RFC 7616 allows clients to re-use server-generated nonces for any URI * in the same "protection space" which by default consists of all server * URIs. - * Before #MHD_VERSION 0x00097701 this was default (and only supported) - * nonce bind type. */ - MHD_DAEMON_OPTION_VALUE_DAUTH_BIND_NONCE_URI = (1 << 1) + MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_URI = (1 << 1) , /** @@ -3520,7 +3542,7 @@ enum MHD_FIXED_FLAGS_ENUM_APP_SET_ MHD_DaemonOptionValueDAuthBindNonce * This value implies #MHD_DAUTH_BIND_NONCE_URI. * Not recommended for that same reasons as #MHD_DAUTH_BIND_NONCE_URI. */ - MHD_DAEMON_OPTION_VALUE_DAUTH_BIND_NONCE_URI_PARAMS = (1 << 2) + MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_URI_PARAMS = (1 << 2) , /** @@ -3530,7 +3552,7 @@ enum MHD_FIXED_FLAGS_ENUM_APP_SET_ MHD_DaemonOptionValueDAuthBindNonce * Multi-NAT, different proxy chain and other reasons), while IP address * spoofing could be used relatively easily. */ - MHD_DAEMON_OPTION_VALUE_DAUTH_BIND_NONCE_CLIENT_IP = (1 << 3) + MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_CLIENT_IP = (1 << 3) }; @@ -3794,13 +3816,13 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOption /* = MHD Daemon Option enum values below are generated automatically = */ /** * Set MHD work (threading and polling) mode. - * Consider use of #MHD_DAEMON_OPTION_WM_EXTERNAL_PERIODIC(), - * #MHD_DAEMON_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL(), - * #MHD_DAEMON_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_EDGE(), - * #MHD_DAEMON_OPTION_WM_EXTERNAL_SINGLE_FD_WATCH(), - * #MHD_DAEMON_OPTION_WM_WORKER_THREADS() or - * #MHD_DAEMON_OPTION_WM_THREAD_PER_CONNECTION() instead of direct use of - * this parameter. + * Consider use of #MHD_D_OPTION_WM_EXTERNAL_PERIODIC(), + * #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL(), + * #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_EDGE(), + * #MHD_D_OPTION_WM_EXTERNAL_SINGLE_FD_WATCH(), + * #MHD_D_OPTION_WM_WORKER_THREADS() or + * #MHD_D_OPTION_WM_THREAD_PER_CONNECTION() instead of direct use of this + * parameter. * The parameter value must be placed to the * @a v_work_mode member. */ @@ -3823,12 +3845,12 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOption /** * Bind to the given TCP port and address family. * - * Does not work with #MHD_DAEMON_OPTION_BIND_SA() or - * #MHD_DAEMON_OPTION_LISTEN_SOCKET(). + * Does not work with #MHD_D_OPTION_BIND_SA() or + * #MHD_D_OPTION_LISTEN_SOCKET(). * - * If no listen socket optins (#MHD_DAEMON_OPTION_BIND_PORT(), - * #MHD_DAEMON_OPTION_BIND_SA(), #MHD_DAEMON_OPTION_LISTEN_SOCKET()) are - * used, MHD does not listen for incoming connection. + * If no listen socket optins (#MHD_D_OPTION_BIND_PORT(), + * #MHD_D_OPTION_BIND_SA(), #MHD_D_OPTION_LISTEN_SOCKET()) are used, MHD does + * not listen for incoming connection. * The parameter value must be placed to the * @a v_bind_port member. */ @@ -3837,12 +3859,12 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOption /** * Bind to the given socket address. * - * Does not work with #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_LISTEN_SOCKET(). + * Does not work with #MHD_D_OPTION_BIND_PORT() or + * #MHD_D_OPTION_LISTEN_SOCKET(). * - * If no listen socket optins (#MHD_DAEMON_OPTION_BIND_PORT(), - * #MHD_DAEMON_OPTION_BIND_SA(), #MHD_DAEMON_OPTION_LISTEN_SOCKET()) are - * used, MHD does not listen for incoming connection. + * If no listen socket optins (#MHD_D_OPTION_BIND_PORT(), + * #MHD_D_OPTION_BIND_SA(), #MHD_D_OPTION_LISTEN_SOCKET()) are used, MHD does + * not listen for incoming connection. * The parameter value must be placed to the * @a v_bind_sa member. */ @@ -3852,12 +3874,11 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOption * Accept connections from the given socket. Socket * must be a TCP or UNIX domain (SOCK_STREAM) socket. * - * Does not work with #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA(). + * Does not work with #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA(). * - * If no listen socket optins (#MHD_DAEMON_OPTION_BIND_PORT(), - * #MHD_DAEMON_OPTION_BIND_SA(), #MHD_DAEMON_OPTION_LISTEN_SOCKET()) are - * used, MHD does not listen for incoming connection. + * If no listen socket optins (#MHD_D_OPTION_BIND_PORT(), + * #MHD_D_OPTION_BIND_SA(), #MHD_D_OPTION_LISTEN_SOCKET()) are used, MHD does + * not listen for incoming connection. * The parameter value must be placed to the * @a v_listen_socket member. */ @@ -3866,8 +3887,8 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOption /** * Select mode of reusing address:port listen address. * - * Works only when #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA() are used. + * Works only when #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA() are + * used. * The parameter value must be placed to the * @a v_listen_addr_reuse member. */ @@ -3881,8 +3902,8 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOption * attack as the TCP stack has to now allocate resources for the SYN * packet along with its DATA. * - * Works only when #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA() are used. + * Works only when #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA() are + * used. * The parameter value must be placed to the * @a v_tcp_fastopen member. */ @@ -3891,8 +3912,8 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOption /** * Use the given backlog for the listen() call. * - * Works only when #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA() are used. + * Works only when #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA() are + * used. * The parameter value must be placed to the * @a v_listen_backlog member. */ @@ -4064,8 +4085,8 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOption /** * Desired size of the stack for the threads started by MHD. * Use 0 for system default, which is also MHD default. - * Works only with ##MHD_DAEMON_OPTION_WORKER_THREADS() or - * #MHD_DAEMON_OPTION_THREAD_PER_CONNECTION(). + * Works only with #MHD_D_OPTION_WM_WORKER_THREADS() or + * #MHD_D_OPTION_WM_THREAD_PER_CONNECTION(). * The parameter value must be placed to the * @a v_stack_size member. */ @@ -4080,8 +4101,8 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOption * connection is rejected. * Useful if application uses select() for polling the sockets, system * FD_SETSIZE is good value for this option in such case. - * Does not work with ##MHD_DAEMON_OPTION_WORKER_THREADS() or - * #MHD_DAEMON_OPTION_THREAD_PER_CONNECTION(). + * Does not work with #MHD_D_OPTION_WM_WORKER_THREADS() or + * #MHD_D_OPTION_WM_THREAD_PER_CONNECTION(). * Does not work on W32 (WinSock sockets). * The parameter value must be placed to the * @a v_fd_number_limit member. @@ -4197,7 +4218,7 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_DaemonOption * This option allows bitwise OR combination of * #MHD_DaemonOptionValueDAuthBindNonce values. * When this option is not used then default value is - * #MHD_DAEMON_OPTION_VALUE_DAUTH_BIND_NONCE_NONE. + * #MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_NONE. * The parameter value must be placed to the * @a v_dauth_nonce_bind_type member. */ @@ -4632,12 +4653,12 @@ struct MHD_DaemonOptionAndValue /* = MHD Daemon Option macros below are generated automatically = */ /** * Set MHD work (threading and polling) mode. - * Consider use of #MHD_DAEMON_OPTION_WM_EXTERNAL_PERIODIC(), - * #MHD_DAEMON_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL(), - * #MHD_DAEMON_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_EDGE(), - * #MHD_DAEMON_OPTION_WM_EXTERNAL_SINGLE_FD_WATCH(), - * #MHD_DAEMON_OPTION_WM_WORKER_THREADS() or - * #MHD_DAEMON_OPTION_WM_THREAD_PER_CONNECTION() instead of direct use of this + * Consider use of #MHD_D_OPTION_WM_EXTERNAL_PERIODIC(), + * #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL(), + * #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_EDGE(), + * #MHD_D_OPTION_WM_EXTERNAL_SINGLE_FD_WATCH(), + * #MHD_D_OPTION_WM_WORKER_THREADS() or + * #MHD_D_OPTION_WM_THREAD_PER_CONNECTION() instead of direct use of this * parameter. * @param wmp the object created by one of the next functions/macros: * #MHD_WM_OPTION_EXTERNAL_PERIODIC(), @@ -4694,12 +4715,11 @@ struct MHD_DaemonOptionAndValue /** * Bind to the given TCP port and address family. * - * Does not work with #MHD_DAEMON_OPTION_BIND_SA() or - * #MHD_DAEMON_OPTION_LISTEN_SOCKET(). + * Does not work with #MHD_D_OPTION_BIND_SA() or #MHD_D_OPTION_LISTEN_SOCKET(). * - * If no listen socket optins (#MHD_DAEMON_OPTION_BIND_PORT(), - * #MHD_DAEMON_OPTION_BIND_SA(), #MHD_DAEMON_OPTION_LISTEN_SOCKET()) are used, - * MHD does not listen for incoming connection. + * If no listen socket optins (#MHD_D_OPTION_BIND_PORT(), + * #MHD_D_OPTION_BIND_SA(), #MHD_D_OPTION_LISTEN_SOCKET()) are used, MHD does + * not listen for incoming connection. * @param af the address family to use, * the #MHD_AF_NONE to disable listen socket (the same effect as if * this option is not used) @@ -4721,12 +4741,12 @@ struct MHD_DaemonOptionAndValue /** * Bind to the given socket address. * - * Does not work with #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_LISTEN_SOCKET(). + * Does not work with #MHD_D_OPTION_BIND_PORT() or + * #MHD_D_OPTION_LISTEN_SOCKET(). * - * If no listen socket optins (#MHD_DAEMON_OPTION_BIND_PORT(), - * #MHD_DAEMON_OPTION_BIND_SA(), #MHD_DAEMON_OPTION_LISTEN_SOCKET()) are used, - * MHD does not listen for incoming connection. + * If no listen socket optins (#MHD_D_OPTION_BIND_PORT(), + * #MHD_D_OPTION_BIND_SA(), #MHD_D_OPTION_LISTEN_SOCKET()) are used, MHD does + * not listen for incoming connection. * @param sa_len the size of the socket address pointed by @a sa. * @param sa the address to bind to; can be IPv4 (AF_INET), IPv6 (AF_INET6) or * even a UNIX domain socket (AF_UNIX) @@ -4747,12 +4767,11 @@ struct MHD_DaemonOptionAndValue * Accept connections from the given socket. Socket * must be a TCP or UNIX domain (SOCK_STREAM) socket. * - * Does not work with #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA(). + * Does not work with #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA(). * - * If no listen socket optins (#MHD_DAEMON_OPTION_BIND_PORT(), - * #MHD_DAEMON_OPTION_BIND_SA(), #MHD_DAEMON_OPTION_LISTEN_SOCKET()) are used, - * MHD does not listen for incoming connection. + * If no listen socket optins (#MHD_D_OPTION_BIND_PORT(), + * #MHD_D_OPTION_BIND_SA(), #MHD_D_OPTION_LISTEN_SOCKET()) are used, MHD does + * not listen for incoming connection. * @param listen_fd the listen socket to use, ignored if set to * #MHD_INVALID_SOCKET * @return the object of struct MHD_DaemonOptionAndValue with the requested @@ -4770,8 +4789,8 @@ struct MHD_DaemonOptionAndValue /** * Select mode of reusing address:port listen address. * - * Works only when #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA() are used. + * Works only when #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA() are + * used. * @param reuse_type the value of the parameter * @return the object of struct MHD_DaemonOptionAndValue with the requested * values @@ -4793,8 +4812,8 @@ struct MHD_DaemonOptionAndValue * attack as the TCP stack has to now allocate resources for the SYN * packet along with its DATA. * - * Works only when #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA() are used. + * Works only when #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA() are + * used. * @param option the type use of of TCP FastOpen * @param queue_length the length of the queue, zero to use system or MHD * default, @@ -4816,8 +4835,8 @@ struct MHD_DaemonOptionAndValue /** * Use the given backlog for the listen() call. * - * Works only when #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA() are used. + * Works only when #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA() are + * used. * @param backlog_size the value of the parameter * @return the object of struct MHD_DaemonOptionAndValue with the requested * values @@ -5146,8 +5165,8 @@ struct MHD_DaemonOptionAndValue /** * Desired size of the stack for the threads started by MHD. * Use 0 for system default, which is also MHD default. - * Works only with ##MHD_DAEMON_OPTION_WORKER_THREADS() or - * #MHD_DAEMON_OPTION_THREAD_PER_CONNECTION(). + * Works only with #MHD_D_OPTION_WM_WORKER_THREADS() or + * #MHD_D_OPTION_WM_THREAD_PER_CONNECTION(). * @param sizet_val the value of the parameter * @return the object of struct MHD_DaemonOptionAndValue with the requested * values @@ -5170,8 +5189,8 @@ struct MHD_DaemonOptionAndValue * is rejected. * Useful if application uses select() for polling the sockets, system * FD_SETSIZE is good value for this option in such case. - * Does not work with ##MHD_DAEMON_OPTION_WORKER_THREADS() or - * #MHD_DAEMON_OPTION_THREAD_PER_CONNECTION(). + * Does not work with #MHD_D_OPTION_WM_WORKER_THREADS() or + * #MHD_D_OPTION_WM_THREAD_PER_CONNECTION(). * Does not work on W32 (WinSock sockets). * @param max_fd the value of the parameter * @return the object of struct MHD_DaemonOptionAndValue with the requested @@ -5375,7 +5394,7 @@ struct MHD_DaemonOptionAndValue * This option allows bitwise OR combination of * #MHD_DaemonOptionValueDAuthBindNonce values. * When this option is not used then default value is - * #MHD_DAEMON_OPTION_VALUE_DAUTH_BIND_NONCE_NONE. + * #MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_NONE. * @param bind_type the value of the parameter * @return the object of struct MHD_DaemonOptionAndValue with the requested * values @@ -5442,12 +5461,12 @@ MHD_NOWARN_UNUSED_FUNC_ /* = MHD Daemon Option static functions below are generated automatically = */ /** * Set MHD work (threading and polling) mode. - * Consider use of #MHD_DAEMON_OPTION_WM_EXTERNAL_PERIODIC(), - * #MHD_DAEMON_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL(), - * #MHD_DAEMON_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_EDGE(), - * #MHD_DAEMON_OPTION_WM_EXTERNAL_SINGLE_FD_WATCH(), - * #MHD_DAEMON_OPTION_WM_WORKER_THREADS() or - * #MHD_DAEMON_OPTION_WM_THREAD_PER_CONNECTION() instead of direct use of this + * Consider use of #MHD_D_OPTION_WM_EXTERNAL_PERIODIC(), + * #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL(), + * #MHD_D_OPTION_WM_EXTERNAL_EVENT_LOOP_CB_EDGE(), + * #MHD_D_OPTION_WM_EXTERNAL_SINGLE_FD_WATCH(), + * #MHD_D_OPTION_WM_WORKER_THREADS() or + * #MHD_D_OPTION_WM_THREAD_PER_CONNECTION() instead of direct use of this * parameter. * @param wmp the object created by one of the next functions/macros: * #MHD_WM_OPTION_EXTERNAL_PERIODIC(), @@ -5515,12 +5534,11 @@ MHD_D_OPTION_LOG_CALLBACK ( /** * Bind to the given TCP port and address family. * - * Does not work with #MHD_DAEMON_OPTION_BIND_SA() or - * #MHD_DAEMON_OPTION_LISTEN_SOCKET(). + * Does not work with #MHD_D_OPTION_BIND_SA() or #MHD_D_OPTION_LISTEN_SOCKET(). * - * If no listen socket optins (#MHD_DAEMON_OPTION_BIND_PORT(), - * #MHD_DAEMON_OPTION_BIND_SA(), #MHD_DAEMON_OPTION_LISTEN_SOCKET()) are used, - * MHD does not listen for incoming connection. + * If no listen socket optins (#MHD_D_OPTION_BIND_PORT(), + * #MHD_D_OPTION_BIND_SA(), #MHD_D_OPTION_LISTEN_SOCKET()) are used, MHD does + * not listen for incoming connection. * @param af the address family to use, * the #MHD_AF_NONE to disable listen socket (the same effect as if * this option is not used) @@ -5547,12 +5565,12 @@ MHD_D_OPTION_BIND_PORT ( /** * Bind to the given socket address. * - * Does not work with #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_LISTEN_SOCKET(). + * Does not work with #MHD_D_OPTION_BIND_PORT() or + * #MHD_D_OPTION_LISTEN_SOCKET(). * - * If no listen socket optins (#MHD_DAEMON_OPTION_BIND_PORT(), - * #MHD_DAEMON_OPTION_BIND_SA(), #MHD_DAEMON_OPTION_LISTEN_SOCKET()) are used, - * MHD does not listen for incoming connection. + * If no listen socket optins (#MHD_D_OPTION_BIND_PORT(), + * #MHD_D_OPTION_BIND_SA(), #MHD_D_OPTION_LISTEN_SOCKET()) are used, MHD does + * not listen for incoming connection. * @param sa_len the size of the socket address pointed by @a sa. * @param sa the address to bind to; can be IPv4 (AF_INET), IPv6 (AF_INET6) or * even a UNIX domain socket (AF_UNIX) @@ -5578,12 +5596,11 @@ MHD_D_OPTION_BIND_SA ( * Accept connections from the given socket. Socket * must be a TCP or UNIX domain (SOCK_STREAM) socket. * - * Does not work with #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA(). + * Does not work with #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA(). * - * If no listen socket optins (#MHD_DAEMON_OPTION_BIND_PORT(), - * #MHD_DAEMON_OPTION_BIND_SA(), #MHD_DAEMON_OPTION_LISTEN_SOCKET()) are used, - * MHD does not listen for incoming connection. + * If no listen socket optins (#MHD_D_OPTION_BIND_PORT(), + * #MHD_D_OPTION_BIND_SA(), #MHD_D_OPTION_LISTEN_SOCKET()) are used, MHD does + * not listen for incoming connection. * @param listen_fd the listen socket to use, ignored if set to * #MHD_INVALID_SOCKET * @return the object of struct MHD_DaemonOptionAndValue with the requested @@ -5604,8 +5621,8 @@ MHD_D_OPTION_LISTEN_SOCKET (MHD_socket listen_fd) /** * Select mode of reusing address:port listen address. * - * Works only when #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA() are used. + * Works only when #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA() are + * used. * @param reuse_type the value of the parameter * @return the object of struct MHD_DaemonOptionAndValue with the requested * values @@ -5630,8 +5647,8 @@ MHD_D_OPTION_LISTEN_ADDR_REUSE (enum MHD_DaemonOptionBindType reuse_type) * attack as the TCP stack has to now allocate resources for the SYN * packet along with its DATA. * - * Works only when #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA() are used. + * Works only when #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA() are + * used. * @param option the type use of of TCP FastOpen * @param queue_length the length of the queue, zero to use system or MHD * default, @@ -5658,8 +5675,8 @@ MHD_D_OPTION_TCP_FASTOPEN ( /** * Use the given backlog for the listen() call. * - * Works only when #MHD_DAEMON_OPTION_BIND_PORT() or - * #MHD_DAEMON_OPTION_BIND_SA() are used. + * Works only when #MHD_D_OPTION_BIND_PORT() or #MHD_D_OPTION_BIND_SA() are + * used. * @param backlog_size the value of the parameter * @return the object of struct MHD_DaemonOptionAndValue with the requested * values @@ -6053,8 +6070,8 @@ MHD_D_OPTION_LARGE_POOL_SIZE (size_t sizet_val) /** * Desired size of the stack for the threads started by MHD. * Use 0 for system default, which is also MHD default. - * Works only with ##MHD_DAEMON_OPTION_WORKER_THREADS() or - * #MHD_DAEMON_OPTION_THREAD_PER_CONNECTION(). + * Works only with #MHD_D_OPTION_WM_WORKER_THREADS() or + * #MHD_D_OPTION_WM_THREAD_PER_CONNECTION(). * @param sizet_val the value of the parameter * @return the object of struct MHD_DaemonOptionAndValue with the requested * values @@ -6080,8 +6097,8 @@ MHD_D_OPTION_STACK_SIZE (size_t sizet_val) * is rejected. * Useful if application uses select() for polling the sockets, system * FD_SETSIZE is good value for this option in such case. - * Does not work with ##MHD_DAEMON_OPTION_WORKER_THREADS() or - * #MHD_DAEMON_OPTION_THREAD_PER_CONNECTION(). + * Does not work with #MHD_D_OPTION_WM_WORKER_THREADS() or + * #MHD_D_OPTION_WM_THREAD_PER_CONNECTION(). * Does not work on W32 (WinSock sockets). * @param max_fd the value of the parameter * @return the object of struct MHD_DaemonOptionAndValue with the requested @@ -6323,7 +6340,7 @@ MHD_D_OPTION_DAUTH_MAP_SIZE (size_t size) * This option allows bitwise OR combination of * #MHD_DaemonOptionValueDAuthBindNonce values. * When this option is not used then default value is - * #MHD_DAEMON_OPTION_VALUE_DAUTH_BIND_NONCE_NONE. + * #MHD_D_OPTION_VALUE_DAUTH_BIND_NONCE_NONE. * @param bind_type the value of the parameter * @return the object of struct MHD_DaemonOptionAndValue with the requested * values @@ -7323,6 +7340,11 @@ MHD_FN_PAR_NONNULL_ALL_; /* ************** Action and Response manipulation functions **************** */ +/** + * @defgroup response Response objects control + */ + + /** * Name with value pair as C strings */ @@ -8331,9 +8353,6 @@ MHD_FN_RETURNS_NONNULL_; * the sum of all data sizes provided by this callback * @param[out] buf where to copy the data * @param max maximum number of bytes to copy to @a buf (size of @a buf) - * @param[out] action the action to set, - * the pointer is only valid until - * the callback returns * @return action to use, * NULL in case of any error (the response will be aborted) */ @@ -9346,7 +9365,6 @@ MHD_FN_PAR_CSTR_ (3) MHD_FN_PAR_OUT_SIZE_ (4,3); * @return MHD_SC_OK on success, * error code otherwise * @sa #MHD_digest_auth_calc_userhash() - * @note Available since #MHD_VERSION 0x00097701 * @ingroup authentication */ MHD_EXTERN_ enum MHD_StatusCode @@ -9957,7 +9975,6 @@ MHD_FN_PAR_CSTR_ (4); * @return pointer to the action on success, * NULL on failure * @ingroup authentication - * @ingroup action */ MHD_EXTERN_ const struct MHD_Action * MHD_action_digest_auth_required_response ( @@ -10024,7 +10041,6 @@ struct MHD_BasicAuthInfo * @return pointer to the action on success, * NULL on failure * @ingroup authentication - * @ingroup action */ MHD_EXTERN_ const struct MHD_Action * MHD_action_basic_auth_required_response ( @@ -10127,8 +10143,7 @@ enum MHD_FIXED_ENUM_APP_SET_ MHD_LibInfoFixed /** * Get whether the early version the Digest Authorization (RFC 2069) is * supported (digest authorisation without QOP parameter). - * Since #MHD_VERSION 0x00097701 it is always supported if Digest Auth - * module is built. + * Currently it is always supported if Digest Auth module is built. * The result is placed in @a v_bool member. */ MHD_LIB_INFO_FIXED_HAS_DIGEST_AUTH_RFC2069 = 22 @@ -10599,7 +10614,7 @@ enum MHD_DaemonInfoFixedType /** * Request the port number of daemon's listen socket. * No extra arguments should be passed. - * Note: if port '0' was specified for #MHD_option_port(), returned + * Note: if port '0' was specified for #MHD_D_OPTION_BIND_PORT(), returned * value will be real port number. * The result is placed in @a v_port member. */ @@ -10703,9 +10718,9 @@ enum MHD_DaemonInfoDynamicType * If resulting value is zero then daemon data processing function should be * called as soon as possible as some data processing is already pending. * The data processing function can also be called earlier as well. - * Available only for daemons stated in #MHD_TM_EXTERNAL_PERIODIC, - * #MHD_TM_EXTERNAL_EVENT_LOOP_CB_LEVEL, #MHD_TM_EXTERNAL_EVENT_LOOP_CB_EDGE - * or #MHD_TM_EXTERNAL_SINGLE_FD_WATCH modes. + * Available only for daemons stated in #MHD_WM_EXTERNAL_PERIODIC, + * #MHD_WM_EXTERNAL_EVENT_LOOP_CB_LEVEL, #MHD_WM_EXTERNAL_EVENT_LOOP_CB_EDGE + * or #MHD_WM_EXTERNAL_SINGLE_FD_WATCH modes. * The result is placed in @a v_uint64 member. */ MHD_DAEMON_INFO_DYNAMIC_MAX_TIME_TO_WAIT = 1 @@ -10713,9 +10728,9 @@ enum MHD_DaemonInfoDynamicType /** * Request the number of current connections handled by the daemon. * No extra arguments should be passed. - * Note: when using MHD in external polling mode, this type of request - * could be used only when #MHD_run()/#MHD_run_from_select is not - * working in other thread at the same time. + * Note: when using MHD without internal threads, this type of request + * could be used only when MHD is is not processing the connection data + * in other thread at the same time. * The result is placed in @a v_uint member. */ MHD_DAEMON_INFO_DYNAMIC_CURRENT_CONNECTIONS = 20