Просмотр исходного кода

make MHD_http_unescape() part of API (#3585)

Christian Grothoff 11 лет назад
Родитель
Сommit
b2a041e934

+ 5 - 0
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

+ 133 - 0
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 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 

+ 21 - 8
src/include/microhttpd.h

@@ -1685,6 +1685,19 @@ _MHD_EXTERN void
 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

+ 21 - 1
src/microhttpd/daemon.c

@@ -2742,6 +2742,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_;

+ 1 - 5
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;

+ 0 - 16
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.

+ 2 - 2
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 */