libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 52a658759112e0ccf705d55ac6874df146d33cba
parent 3bc4813f5232d5d36b3e813fde5139eefc22ac68
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Sat, 29 Mar 2014 15:13:33 +0000

Added new function MHD_is_feature_supported()

Diffstat:
MChangeLog | 3+++
Mconfigure.ac | 4++++
Msrc/include/microhttpd.h | 114+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/microhttpd/daemon.c | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 220 insertions(+), 0 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,6 @@ +Sat Mar 29 16:12:03 CET 2014 + Added MHD_is_feature_supported() function. -EG + Thu Mar 27 14:47:54 CET 2014 Used larger FD_SETSIZE internally on W32. Extended API to work with non-default FD_SETSIZE. -EG diff --git a/configure.ac b/configure.ac @@ -491,6 +491,10 @@ AC_ARG_ENABLE([postprocessor], test "x$enable_postprocessor" = "xno" || enable_postprocessor=yes AC_MSG_RESULT([[$enable_postprocessor]]) AM_CONDITIONAL([HAVE_POSTPROCESSOR],test "x$enable_postprocessor" != "xno") +if test "x$enable_postprocessor" != "xno" +then + AC_DEFINE([HAVE_POSTPROCESSOR],[1],[define to 1 if MHD was build with postprocessor.c]) +fi # optional: have zzuf, socat? diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h @@ -2353,6 +2353,120 @@ _MHD_EXTERN const char* MHD_get_version (void); +/** +* Types of information about MHD features, +* used by #MHD_is_feature_supported. +*/ +enum MHD_FEATURE +{ + /** + * Get whether messages are supported. If supported then in debug + * mode messages can be printed to stderr or to external logger. + */ + MHD_FEATURE_MESSGES = 1, + + /** + * Get whether HTTPS is supported. If supported then flag + * #MHD_USE_SSL and options #MHD_OPTION_HTTPS_MEM_KEY, + * #MHD_OPTION_HTTPS_MEM_CERT, #MHD_OPTION_HTTPS_MEM_TRUST + * #MHD_OPTION_HTTPS_CRED_TYPE, #MHD_OPTION_HTTPS_PRIORITIES + * can be used. + */ + MHD_FEATURE_SSL = 2, + + /** + * Get whether option #MHD_OPTION_HTTPS_CERT_CALLBACK is + * supported. + */ + MHD_FEATURE_HTTPS_CERT_CALLBACK = 3, + + /** + * Get whether IPv6 is supported. If supported then flag + * #MHD_USE_IPv6 can be used. + */ + MHD_FEATURE_IPv6 = 4, + + /** + * Get whether IPv6 without IPv4 is supported. If not supported + * then IPv4 is always enabled in IPv6 sockets and + * flag #MHD_USE_DUAL_STACK if always used when #MHD_USE_IPv6 is + * specified. + */ + MHD_FEATURE_IPv6_ONLY = 5, + + /** + * Get whether `poll()` is supported. If supported then flag + * #MHD_USE_POLL can be used. + */ + MHD_FEATURE_POLL = 6, + + /** + * Get whether `epoll()` is supported. If supported then Flags + * #MHD_USE_EPOLL_LINUX_ONLY and + * #MHD_USE_EPOLL_INTERNALLY_LINUX_ONLY can be used. + */ + MHD_FEATURE_EPOLL = 7, + + /** + * Get whether shutdown on listen socket to signal other + * threads is supported. If not supported flag + * MHD_USE_PIPE_FOR_SHUTDOWN is automatically forced. + */ + MHD_FEATURE_SHUTDOWN_LISTEN_SOCKET = 8, + + /** + * Get whether socketpair is used internally instead of pipe to + * signal other threads. + */ + MHD_FEATURE_SOCKETPAIR = 9, + + /** + * Get whether TCP Fast Open is supported. If supported then + * flag #MHD_USE_TCP_FASTOPEN and option + * #MHD_OPTION_TCP_FASTOPEN_QUEUE_SIZE can be used. + */ + MHD_FEATURE_TCP_FASTOPEN = 10, + + /** + * Get whether HTTP Basic authorization is supported. If supported + * then functions #MHD_basic_auth_get_username_password and + * #MHD_queue_basic_auth_fail_response can be used. + */ + MHD_FEATURE_BASIC_AUTH = 11, + + /** + * Get whether HTTP Digest authorization is supported. If + * supported then options #MHD_OPTION_DIGEST_AUTH_RANDOM, + * #MHD_OPTION_NONCE_NC_SIZE and functions #MHD_digest_auth_check, + * #MHD_digest_auth_check can be used. + */ + MHD_FEATURE_DIGEST_AUTH = 12, + + /** + * Get whether postprocessor is supported. If supported then + * functions #MHD_create_post_processor, #MHD_post_process, + * #MHD_destroy_post_processor, #MHD_destroy_post_processor can + * be used. + */ + MHD_FEATURE_POSTPROCESSOR = 13, +}; + + +/** + * Get information about supported MHD features. + * Indicate that MHD was compiled with or without support for + * particular feature. Some features require additional support + * by kernel. Kernel support is not checked by this function. + * + * @param feature type of requested information + * @return #MHD_YES if feature is supported by MHD, #MHD_NO if + * feature is not supported or feature is unknown. + * @ingroup specialized + */ +_MHD_EXTERN int +MHD_is_feature_supported(enum MHD_FEATURE feature); + + #if 0 /* keep Emacsens' auto-indent happy */ { #endif diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c @@ -4235,6 +4235,105 @@ MHD_get_version (void) } +/** + * Get information about supported MHD features. + * Indicate that MHD was compiled with or without support for + * particular feature. Some features require additional support + * by kernel. Kernel support is not checked by this function. + * + * @param feature type of requested information + * @return #MHD_YES if feature is supported by MHD, #MHD_NO if + * feature is not supported or feature is unknown. + * @ingroup specialized + */ +_MHD_EXTERN int +MHD_is_feature_supported(enum MHD_FEATURE feature) +{ + switch(feature) + { + case MHD_FEATURE_MESSGES: +#if HAVE_MESSAGES + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_SSL: +#if HTTPS_SUPPORT + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_HTTPS_CERT_CALLBACK: +#if HTTPS_SUPPORT && GNUTLS_VERSION_MAJOR >= 3 + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_IPv6: +#ifdef HAVE_INET6 + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_IPv6_ONLY: +#if defined(IPPROTO_IPV6) && defined(IPV6_V6ONLY) + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_POLL: +#ifdef HAVE_POLL_H + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_EPOLL: +#if EPOLL_SUPPORT + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_SHUTDOWN_LISTEN_SOCKET: +#ifdef HAVE_LISTEN_SHUTDOWN + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_SOCKETPAIR: +#ifdef MHD_DONT_USE_PIPES + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_TCP_FASTOPEN: +#ifdef TCP_FASTOPEN + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_BASIC_AUTH: +#if BAUTH_SUPPORT + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_DIGEST_AUTH: +#if DAUTH_SUPPORT + return MHD_YES; +#else + return MHD_NO; +#endif + case MHD_FEATURE_POSTPROCESSOR: +#if HAVE_POSTPROCESSOR + return MHD_YES; +#else + return MHD_NO; +#endif + } + return MHD_NO; +} + + #ifdef __GNUC__ #define FUNC_CONSTRUCTOR(f) static void __attribute__ ((constructor)) f #define FUNC_DESTRUCTOR(f) static void __attribute__ ((destructor)) f