libmicrohttpd

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

commit b2a041e934bd33a033668d2d94053a4e6085c570
parent 00a5e292872468b37bbfe3be2fefdad680f82cfd
Author: Christian Grothoff <christian@grothoff.org>
Date:   Fri, 19 Dec 2014 23:38:18 +0000

make MHD_http_unescape() part of API (#3585)

Diffstat:
MChangeLog | 5+++++
Mdoc/libmicrohttpd.texi | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/include/microhttpd.h | 29+++++++++++++++++++++--------
Msrc/microhttpd/daemon.c | 22+++++++++++++++++++++-
Msrc/microhttpd/internal.c | 6+-----
Msrc/microhttpd/internal.h | 16----------------
Msrc/microhttpd/postprocessor.c | 4++--
7 files changed, 183 insertions(+), 32 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,8 @@ +Sat Dec 20 00:35:40 CET 2014 + Adding MHD_http_unescape() to public API (#3585). -CG + Updating documentation to document + MHD_is_feature_supported(). -CG + Thu Dec 4 00:43:10 CET 2014 If "Connection: upgrade" is requested, do not add "Connection: Keep-Alive" in the response. -GJ diff --git a/doc/libmicrohttpd.texi b/doc/libmicrohttpd.texi @@ -65,6 +65,7 @@ Free Documentation License". * microhttpd-dauth:: Utilizing Authentication. * microhttpd-post:: Adding a @code{POST} processor. * microhttpd-info:: Obtaining and modifying status information. +* microhttpd-util:: Utilities. Appendices @@ -2575,6 +2576,138 @@ zero for no timeout. @end deftp + +@c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +@c ------------------------------------------------------------ +@node microhttpd-util +@chapter Utility functions. + + +@menu +* microhttpd-util feature:: Test supported MHD features +* microhttpd-util unescape:: Unescape strings +@end menu + + +@c ------------------------------------------------------------ +@node microhttpd-util feature +@section Testing for supported MHD features + + +@deftp {Enumeration} MHD_FEATURE +Values of this enum are used to specify what +information about a daemon is desired. +@table @code +@item MHD_FEATURE_MESSAGES +Get whether messages are supported. If supported then in debug +mode messages can be printed to stderr or to external logger. + +@item MHD_FEATURE_SSL +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_MEM_DHPARAMS, MHD_OPTION_HTTPS_CRED_TYPE, +MHD_OPTION_HTTPS_PRIORITIES can be used. + +@item MHD_FEATURE_HTTPS_CERT_CALLBACK +Get whether option #MHD_OPTION_HTTPS_CERT_CALLBACK is +supported. + +@item MHD_FEATURE_IPv6 +Get whether IPv6 is supported. If supported then flag +MHD_USE_IPv6 can be used. + +@item MHD_FEATURE_IPv6_ONLY +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. + +@item MHD_FEATURE_POLL +Get whether @code{poll()} is supported. If supported then flag +MHD_USE_POLL can be used. + +@item MHD_FEATURE_EPOLL +Get whether @code{epoll()} is supported. If supported then Flags +MHD_USE_EPOLL_LINUX_ONLY and +MHD_USE_EPOLL_INTERNALLY_LINUX_ONLY can be used. + +@item MHD_FEATURE_SHUTDOWN_LISTEN_SOCKET +Get whether shutdown on listen socket to signal other +threads is supported. If not supported flag +MHD_USE_PIPE_FOR_SHUTDOWN is automatically forced. + +@item MHD_FEATURE_SOCKETPAIR +Get whether a @code{socketpair()} is used internally instead of +a @code{pipe()} to signal other threads. + +@item MHD_FEATURE_TCP_FASTOPEN +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. + +@item MHD_FEATURE_BASIC_AUTH +Get whether HTTP Basic authorization is supported. If supported +then functions @code{MHD_basic_auth_get_username_password()} and +@code{MHD_queue_basic_auth_fail_response()} can be used. + +@item MHD_FEATURE_DIGEST_AUTH +Get whether HTTP Digest authorization is supported. If +supported then options MHD_OPTION_DIGEST_AUTH_RANDOM, +MHD_OPTION_NONCE_NC_SIZE and functions @code{MHD_digest_auth_check()}, +can be used. + +@item MHD_FEATURE_POSTPROCESSOR +Get whether postprocessor is supported. If supported then +functions @code{MHD_create_post_processor()}, +@code{MHD_post_process()}, @code{MHD_destroy_post_processor()} +can be used. + +@end table +@end deftp + + + +@deftypefun {int} MHD_is_feature_supported (enum MHD_FEATURE feature) +Get information about supported MHD features. Indicate that MHD was +compiled with or without support for particular feature. Some features +require additional support by the kernel. However, kernel support is not +checked by this function. + +@table @var +@item feature +type of requested information +@end table + +Returns @code{MHD_YES} if the feature is supported, +and @code{MHD_NO} if not. +@end deftypefun + + +@c ------------------------------------------------------------ +@node microhttpd-util unescape +@section Unescape strings + +@deftypefun {size_t} MHD_http_unescape (char *val) +Process escape sequences ('%HH') Updates val in place; the result +should be UTF-8 encoded and cannot be larger than the input. The +result must also still be 0-terminated. + +@table @var +@item val +value to unescape (modified in the process), must be +a 0-terminated UTF-8 string. +@end table + +Returns length of the resulting val (@code{strlen(val)} may be +shorter afterwards due to elimination of escape sequences). + +@end deftypefun + + + + @c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h @@ -1686,6 +1686,19 @@ MHD_set_panic_func (MHD_PanicCallback cb, void *cls); /** + * Process escape sequences ('%HH') Updates val in place; the + * result should be UTF-8 encoded and cannot be larger than the input. + * The result must also still be 0-terminated. + * + * @param val value to unescape (modified in the process) + * @return length of the resulting val (`strlen(val)` may be + * shorter afterwards due to elimination of escape sequences) + */ +_MHD_EXTERN size_t +MHD_http_unescape (char *val); + + +/** * Get a particular header value. If multiple * values match the kind, return any one of them. * @@ -2439,9 +2452,9 @@ MHD_get_version (void); /** -* Types of information about MHD features, -* used by #MHD_is_feature_supported. -*/ + * Types of information about MHD features, + * used by #MHD_is_feature_supported(). + */ enum MHD_FEATURE { /** @@ -2495,7 +2508,7 @@ enum MHD_FEATURE /** * 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_USE_PIPE_FOR_SHUTDOWN is automatically forced. */ MHD_FEATURE_SHUTDOWN_LISTEN_SOCKET = 8, @@ -2522,15 +2535,15 @@ enum MHD_FEATURE /** * 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_OPTION_NONCE_NC_SIZE and + * #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 + * functions #MHD_create_post_processor(), #MHD_post_process() and + * #MHD_destroy_post_processor() can * be used. */ MHD_FEATURE_POSTPROCESSOR = 13 diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c @@ -2743,6 +2743,26 @@ MHD_select_thread (void *cls) /** + * Process escape sequences ('%HH') Updates val in place; the + * result should be UTF-8 encoded and cannot be larger than the input. + * The result must also still be 0-terminated. + * + * @param cls closure (use NULL) + * @param connection handle to connection, not used + * @param val value to unescape (modified in the process) + * @return length of the resulting val (strlen(val) maybe + * shorter afterwards due to elimination of escape sequences) + */ +static size_t +unescape_wrapper (void *cls, + struct MHD_Connection *connection, + char *val) +{ + return MHD_http_unescape (val); +} + + +/** * Start a webserver on the given port. Variadic version of * #MHD_start_daemon_va. * @@ -3410,7 +3430,7 @@ MHD_start_daemon_va (unsigned int flags, daemon->connection_limit = MHD_MAX_CONNECTIONS_DEFAULT; daemon->pool_size = MHD_POOL_SIZE_DEFAULT; daemon->pool_increment = MHD_BUF_INC_SIZE; - daemon->unescape_callback = &MHD_http_unescape; + daemon->unescape_callback = &unescape_wrapper; daemon->connection_timeout = 0; /* no timeout */ daemon->wpipe[0] = MHD_INVALID_PIPE_; daemon->wpipe[1] = MHD_INVALID_PIPE_; diff --git a/src/microhttpd/internal.c b/src/microhttpd/internal.c @@ -124,16 +124,12 @@ MHD_unescape_plus (char *arg) * result should be UTF-8 encoded and cannot be larger than the input. * The result must also still be 0-terminated. * - * @param cls closure (use NULL) - * @param connection handle to connection, not used * @param val value to unescape (modified in the process) * @return length of the resulting val (strlen(val) maybe * shorter afterwards due to elimination of escape sequences) */ size_t -MHD_http_unescape (void *cls, - struct MHD_Connection *connection, - char *val) +MHD_http_unescape (char *val) { char *rpos = val; char *wpos = val; diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h @@ -199,22 +199,6 @@ MHD_DLOG (const struct MHD_Daemon *daemon, const char *format, ...); #endif -/** - * Process escape sequences ('+'=space, %HH) Updates val in place; the - * result should be UTF-8 encoded and cannot be larger than the input. - * The result must also still be 0-terminated. - * - * @param cls closure (use NULL) - * @param connection handle to connection, not used - * @param val value to unescape (modified in the process) - * @return length of the resulting val (strlen(val) maybe - * shorter afterwards due to elimination of escape sequences) - */ -size_t -MHD_http_unescape (void *cls, - struct MHD_Connection *connection, - char *val); - /** * Header or cookie in HTTP request or response. diff --git a/src/microhttpd/postprocessor.c b/src/microhttpd/postprocessor.c @@ -382,7 +382,7 @@ post_process_urlencoded (struct MHD_PostProcessor *pp, buf[pp->buffer_pos] = '\0'; /* 0-terminate key */ pp->buffer_pos = 0; /* reset for next key */ MHD_unescape_plus (buf); - MHD_http_unescape (NULL, NULL, buf); + MHD_http_unescape (buf); poff += equals + 1; pp->state = PP_ProcessValue; pp->value_offset = 0; @@ -443,7 +443,7 @@ post_process_urlencoded (struct MHD_PostProcessor *pp, /* unescape */ xbuf[xoff] = '\0'; /* 0-terminate in preparation */ MHD_unescape_plus (xbuf); - xoff = MHD_http_unescape (NULL, NULL, xbuf); + xoff = MHD_http_unescape (xbuf); /* finally: call application! */ pp->must_ikvi = MHD_NO; if (MHD_NO == pp->ikvi (pp->cls, MHD_POSTDATA_KIND, (const char *) &pp[1], /* key */