Browse Source

Alternative to mg_upload (Step 50/?)

bel 9 years ago
parent
commit
20f3965f2c
4 changed files with 169 additions and 152 deletions
  1. 3 38
      examples/embedded_c/embedded_c.c
  2. 4 0
      examples/upload/upload.c
  3. 160 8
      include/civetweb.h
  4. 2 106
      src/handle_form.inl

+ 3 - 38
examples/embedded_c/embedded_c.c

@@ -1,5 +1,5 @@
 /*
 /*
-* Copyright (c) 2013-2015 the CivetWeb developers
+* Copyright (c) 2013-2016 the CivetWeb developers
 * Copyright (c) 2013 No Face Press, LLC
 * Copyright (c) 2013 No Face Press, LLC
 * License http://opensource.org/licenses/mit-license.php MIT License
 * License http://opensource.org/licenses/mit-license.php MIT License
 */
 */
@@ -155,41 +155,6 @@ FileHandler(struct mg_connection *conn, void *cbdata)
 }
 }
 
 
 
 
-/**********************/
-/* proposed interface - will be moved to the header once it is ready for release
- */
-
-enum {
-	FORM_FIELD_STORAGE_SKIP = 0x0,
-	FORM_FIELD_STORAGE_GET = 0x1,
-	FORM_FIELD_STORAGE_STORE = 0x2,
-	/*	FORM_FIELD_STORAGE_READ = 0x3, not in the first step */
-	FORM_FIELD_STORAGE_ABORT = 0x10
-};
-
-
-struct mg_form_data_handler {
-	int (*field_found)(const char *key,
-	                   const char *filename,
-	                   char *path,
-	                   size_t pathlen,
-	                   void *user_data);
-	int (*field_get)(const char *key,
-	                 const char *value,
-	                 size_t valuelen,
-	                 void *user_data);
-	int (*field_stored)(const char *path, size_t file_size, void *user_data);
-	void *user_data;
-};
-
-
-extern int mg_handle_form_data(struct mg_connection *conn,
-                               struct mg_form_data_handler *fdh);
-
-/* end of interface */
-/********************/
-
-
 int
 int
 field_found(const char *key,
 field_found(const char *key,
             const char *filename,
             const char *filename,
@@ -248,14 +213,14 @@ FormHandler(struct mg_connection *conn, void *cbdata)
 	int ret;
 	int ret;
 	struct mg_form_data_handler fdh = {field_found, field_get, field_stored, 0};
 	struct mg_form_data_handler fdh = {field_found, field_get, field_stored, 0};
 
 
-	/* TODO: Checks before calling handle_form_data ? */
+	/* TODO: Checks before calling mg_handle_form_request ? */
 	(void)req_info;
 	(void)req_info;
 
 
 	mg_printf(conn, "HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\n\r\n");
 	mg_printf(conn, "HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\n\r\n");
 	fdh.user_data = (void *)conn;
 	fdh.user_data = (void *)conn;
 
 
 	/* TODO: Handle the return value */
 	/* TODO: Handle the return value */
-	ret = mg_handle_form_data(conn, &fdh);
+	ret = mg_handle_form_request(conn, &fdh);
 
 
 	return 1;
 	return 1;
 }
 }

+ 4 - 0
examples/upload/upload.c

@@ -3,6 +3,10 @@
  * This file is a part of civetweb project, http://github.com/bel2125/civetweb
  * This file is a part of civetweb project, http://github.com/bel2125/civetweb
  */
  */
 
 
+/* This example is deprecated and no longer maintained.
+ * All relevant parts have been merged into the embedded_c example. */
+
+
 #ifdef _WIN32
 #ifdef _WIN32
 #define _CRT_SECURE_NO_WARNINGS
 #define _CRT_SECURE_NO_WARNINGS
 #include <windows.h>
 #include <windows.h>

+ 160 - 8
include/civetweb.h

@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2015 the Civetweb developers
+/* Copyright (c) 2013-2016 the Civetweb developers
  * Copyright (c) 2004-2013 Sergey Lyubka
  * Copyright (c) 2004-2013 Sergey Lyubka
  *
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -48,9 +48,11 @@
 extern "C" {
 extern "C" {
 #endif /* __cplusplus */
 #endif /* __cplusplus */
 
 
+
 struct mg_context;    /* Handle for the HTTP service itself */
 struct mg_context;    /* Handle for the HTTP service itself */
 struct mg_connection; /* Handle for the individual connection */
 struct mg_connection; /* Handle for the individual connection */
 
 
+
 /* This structure contains information about the HTTP request. */
 /* This structure contains information about the HTTP request. */
 struct mg_request_info {
 struct mg_request_info {
 	const char *request_method; /* "GET", "POST", etc */
 	const char *request_method; /* "GET", "POST", etc */
@@ -86,6 +88,7 @@ struct mg_request_info {
 	} http_headers[64];    /* Maximum 64 headers */
 	} http_headers[64];    /* Maximum 64 headers */
 };
 };
 
 
+
 /* This structure needs to be passed to mg_start(), to let civetweb know
 /* This structure needs to be passed to mg_start(), to let civetweb know
    which callbacks to invoke. For a detailed description, see
    which callbacks to invoke. For a detailed description, see
    https://github.com/civetweb/civetweb/blob/master/docs/UserManual.md */
    https://github.com/civetweb/civetweb/blob/master/docs/UserManual.md */
@@ -131,12 +134,12 @@ struct mg_callbacks {
 	   Return value:
 	   Return value:
 	     0: civetweb proceeds with websocket handshake.
 	     0: civetweb proceeds with websocket handshake.
 	     1: connection is closed immediately.
 	     1: connection is closed immediately.
-	   This callback is deprecated, use mg_set_websocket_handler instead. */
+	   This callback is deprecated: Use mg_set_websocket_handler instead. */
 	int (*websocket_connect)(const struct mg_connection *);
 	int (*websocket_connect)(const struct mg_connection *);
 
 
 	/* Called when websocket handshake is successfully completed, and
 	/* Called when websocket handshake is successfully completed, and
 	   connection is ready for data exchange.
 	   connection is ready for data exchange.
-	   This callback is deprecated, use mg_set_websocket_handler instead. */
+	   This callback is deprecated: Use mg_set_websocket_handler instead. */
 	void (*websocket_ready)(struct mg_connection *);
 	void (*websocket_ready)(struct mg_connection *);
 
 
 	/* Called when data frame has been received from the client.
 	/* Called when data frame has been received from the client.
@@ -147,7 +150,7 @@ struct mg_callbacks {
 	   Return value:
 	   Return value:
 	     1: keep this websocket connection open.
 	     1: keep this websocket connection open.
 	     0: close this websocket connection.
 	     0: close this websocket connection.
-	   This callback is deprecated, use mg_set_websocket_handler instead. */
+	   This callback is deprecated: Use mg_set_websocket_handler instead. */
 	int (*websocket_data)(struct mg_connection *,
 	int (*websocket_data)(struct mg_connection *,
 	                      int bits,
 	                      int bits,
 	                      char *data,
 	                      char *data,
@@ -158,7 +161,7 @@ struct mg_callbacks {
 	   locked when this is invoked.  This is primarily useful for noting when
 	   locked when this is invoked.  This is primarily useful for noting when
 	   a websocket is closing and removing it from any application-maintained
 	   a websocket is closing and removing it from any application-maintained
 	   list of clients.
 	   list of clients.
-	   Using this callback for websocket connections is deprecated, use
+	   Using this callback for websocket connections is deprecated: Use
 	   mg_set_websocket_handler instead. */
 	   mg_set_websocket_handler instead. */
 	void (*connection_close)(const struct mg_connection *);
 	void (*connection_close)(const struct mg_connection *);
 
 
@@ -209,6 +212,7 @@ struct mg_callbacks {
 	void (*exit_context)(const struct mg_context *ctx);
 	void (*exit_context)(const struct mg_context *ctx);
 };
 };
 
 
+
 /* Start web server.
 /* Start web server.
 
 
    Parameters:
    Parameters:
@@ -238,6 +242,7 @@ CIVETWEB_API struct mg_context *mg_start(const struct mg_callbacks *callbacks,
                                          void *user_data,
                                          void *user_data,
                                          const char **configuration_options);
                                          const char **configuration_options);
 
 
+
 /* Stop the web server.
 /* Stop the web server.
 
 
    Must be called last, when an application wants to stop the web server and
    Must be called last, when an application wants to stop the web server and
@@ -245,6 +250,7 @@ CIVETWEB_API struct mg_context *mg_start(const struct mg_callbacks *callbacks,
    threads are stopped. Context pointer becomes invalid. */
    threads are stopped. Context pointer becomes invalid. */
 CIVETWEB_API void mg_stop(struct mg_context *);
 CIVETWEB_API void mg_stop(struct mg_context *);
 
 
+
 /* mg_request_handler
 /* mg_request_handler
 
 
    Called when a new request comes in.  This callback is URI based
    Called when a new request comes in.  This callback is URI based
@@ -259,6 +265,7 @@ CIVETWEB_API void mg_stop(struct mg_context *);
                stored as a HTTP status code for the access log. */
                stored as a HTTP status code for the access log. */
 typedef int (*mg_request_handler)(struct mg_connection *conn, void *cbdata);
 typedef int (*mg_request_handler)(struct mg_connection *conn, void *cbdata);
 
 
+
 /* mg_set_request_handler
 /* mg_set_request_handler
 
 
    Sets or removes a URI mapping for a request handler.
    Sets or removes a URI mapping for a request handler.
@@ -285,6 +292,7 @@ CIVETWEB_API void mg_set_request_handler(struct mg_context *ctx,
                                          mg_request_handler handler,
                                          mg_request_handler handler,
                                          void *cbdata);
                                          void *cbdata);
 
 
+
 /* Callback types for websocket handlers in C/C++.
 /* Callback types for websocket handlers in C/C++.
 
 
    mg_websocket_connect_handler
    mg_websocket_connect_handler
@@ -321,6 +329,7 @@ typedef int (*mg_websocket_data_handler)(struct mg_connection *,
 typedef void (*mg_websocket_close_handler)(const struct mg_connection *,
 typedef void (*mg_websocket_close_handler)(const struct mg_connection *,
                                            void *);
                                            void *);
 
 
+
 /* mg_set_websocket_handler
 /* mg_set_websocket_handler
 
 
    Set or remove handler functions for websocket connections.
    Set or remove handler functions for websocket connections.
@@ -334,6 +343,7 @@ mg_set_websocket_handler(struct mg_context *ctx,
                          mg_websocket_close_handler close_handler,
                          mg_websocket_close_handler close_handler,
                          void *cbdata);
                          void *cbdata);
 
 
+
 /* mg_authorization_handler
 /* mg_authorization_handler
 
 
    Some description here
    Some description here
@@ -348,6 +358,7 @@ mg_set_websocket_handler(struct mg_context *ctx,
 typedef int (*mg_authorization_handler)(struct mg_connection *conn,
 typedef int (*mg_authorization_handler)(struct mg_connection *conn,
                                         void *cbdata);
                                         void *cbdata);
 
 
+
 /* mg_set_auth_handler
 /* mg_set_auth_handler
 
 
    Sets or removes a URI mapping for an authorization handler.
    Sets or removes a URI mapping for an authorization handler.
@@ -357,6 +368,7 @@ CIVETWEB_API void mg_set_auth_handler(struct mg_context *ctx,
                                       mg_authorization_handler handler,
                                       mg_authorization_handler handler,
                                       void *cbdata);
                                       void *cbdata);
 
 
+
 /* Get the value of particular configuration parameter.
 /* Get the value of particular configuration parameter.
    The value returned is read-only. Civetweb does not allow changing
    The value returned is read-only. Civetweb does not allow changing
    configuration at run time.
    configuration at run time.
@@ -366,21 +378,26 @@ CIVETWEB_API void mg_set_auth_handler(struct mg_context *ctx,
 CIVETWEB_API const char *mg_get_option(const struct mg_context *ctx,
 CIVETWEB_API const char *mg_get_option(const struct mg_context *ctx,
                                        const char *name);
                                        const char *name);
 
 
+
 /* Get context from connection. */
 /* Get context from connection. */
 CIVETWEB_API struct mg_context *
 CIVETWEB_API struct mg_context *
 mg_get_context(const struct mg_connection *conn);
 mg_get_context(const struct mg_connection *conn);
 
 
+
 /* Get user data passed to mg_start from context. */
 /* Get user data passed to mg_start from context. */
 CIVETWEB_API void *mg_get_user_data(const struct mg_context *ctx);
 CIVETWEB_API void *mg_get_user_data(const struct mg_context *ctx);
 
 
+
 /* Set user data for the current connection. */
 /* Set user data for the current connection. */
 CIVETWEB_API void mg_set_user_connection_data(const struct mg_connection *conn,
 CIVETWEB_API void mg_set_user_connection_data(const struct mg_connection *conn,
                                               void *data);
                                               void *data);
 
 
+
 /* Get user data set for the current connection. */
 /* Get user data set for the current connection. */
 CIVETWEB_API void *
 CIVETWEB_API void *
 mg_get_user_connection_data(const struct mg_connection *conn);
 mg_get_user_connection_data(const struct mg_connection *conn);
 
 
+
 #if defined(MG_LEGACY_INTERFACE)
 #if defined(MG_LEGACY_INTERFACE)
 /* Return array of strings that represent valid configuration options.
 /* Return array of strings that represent valid configuration options.
    For each option, option name and default value is returned, i.e. the
    For each option, option name and default value is returned, i.e. the
@@ -390,12 +407,14 @@ mg_get_user_connection_data(const struct mg_connection *conn);
 CIVETWEB_API const char **mg_get_valid_option_names(void);
 CIVETWEB_API const char **mg_get_valid_option_names(void);
 #endif
 #endif
 
 
+
 struct mg_option {
 struct mg_option {
 	const char *name;
 	const char *name;
 	int type;
 	int type;
 	const char *default_value;
 	const char *default_value;
 };
 };
 
 
+
 enum {
 enum {
 	CONFIG_TYPE_UNKNOWN = 0x0,
 	CONFIG_TYPE_UNKNOWN = 0x0,
 	CONFIG_TYPE_NUMBER = 0x1,
 	CONFIG_TYPE_NUMBER = 0x1,
@@ -406,11 +425,13 @@ enum {
 	CONFIG_TYPE_EXT_PATTERN = 0x6
 	CONFIG_TYPE_EXT_PATTERN = 0x6
 };
 };
 
 
+
 /* Return array of struct mg_option, representing all valid configuration
 /* Return array of struct mg_option, representing all valid configuration
    options of civetweb.c.
    options of civetweb.c.
    The array is terminated by a NULL name option. */
    The array is terminated by a NULL name option. */
 CIVETWEB_API const struct mg_option *mg_get_valid_options(void);
 CIVETWEB_API const struct mg_option *mg_get_valid_options(void);
 
 
+
 struct mg_server_ports {
 struct mg_server_ports {
 	int protocol;    /* 1 = IPv4, 2 = IPv6, 3 = both */
 	int protocol;    /* 1 = IPv4, 2 = IPv6, 3 = both */
 	int port;        /* port number */
 	int port;        /* port number */
@@ -422,6 +443,7 @@ struct mg_server_ports {
 	int _reserved4;
 	int _reserved4;
 };
 };
 
 
+
 /* Get the list of ports that civetweb is listening on.
 /* Get the list of ports that civetweb is listening on.
    The parameter size is the size of the ports array in elements.
    The parameter size is the size of the ports array in elements.
    The caller is responsibility to allocate the required memory.
    The caller is responsibility to allocate the required memory.
@@ -431,10 +453,12 @@ CIVETWEB_API int mg_get_server_ports(const struct mg_context *ctx,
                                      int size,
                                      int size,
                                      struct mg_server_ports *ports);
                                      struct mg_server_ports *ports);
 
 
-/* Deprecated. Use mg_get_server_ports instead. */
+
+/* Deprecated: Use mg_get_server_ports instead. */
 CIVETWEB_API size_t
 CIVETWEB_API size_t
 mg_get_ports(const struct mg_context *ctx, size_t size, int *ports, int *ssl);
 mg_get_ports(const struct mg_context *ctx, size_t size, int *ports, int *ssl);
 
 
+
 /* Add, edit or delete the entry in the passwords file.
 /* Add, edit or delete the entry in the passwords file.
 
 
    This function allows an application to manipulate .htpasswd files on the
    This function allows an application to manipulate .htpasswd files on the
@@ -452,10 +476,12 @@ CIVETWEB_API int mg_modify_passwords_file(const char *passwords_file_name,
                                           const char *user,
                                           const char *user,
                                           const char *password);
                                           const char *password);
 
 
+
 /* Return information associated with the request. */
 /* Return information associated with the request. */
 CIVETWEB_API const struct mg_request_info *
 CIVETWEB_API const struct mg_request_info *
 mg_get_request_info(const struct mg_connection *);
 mg_get_request_info(const struct mg_connection *);
 
 
+
 /* Send data to the client.
 /* Send data to the client.
    Return:
    Return:
     0   when the connection has been closed
     0   when the connection has been closed
@@ -463,6 +489,7 @@ mg_get_request_info(const struct mg_connection *);
     >0  number of bytes written on success */
     >0  number of bytes written on success */
 CIVETWEB_API int mg_write(struct mg_connection *, const void *buf, size_t len);
 CIVETWEB_API int mg_write(struct mg_connection *, const void *buf, size_t len);
 
 
+
 /* Send data to a websocket client wrapped in a websocket frame.  Uses
 /* Send data to a websocket client wrapped in a websocket frame.  Uses
    mg_lock_connection to ensure that the transmission is not interrupted,
    mg_lock_connection to ensure that the transmission is not interrupted,
    i.e., when the application is proactively communicating and responding to
    i.e., when the application is proactively communicating and responding to
@@ -480,6 +507,7 @@ CIVETWEB_API int mg_websocket_write(struct mg_connection *conn,
                                     const char *data,
                                     const char *data,
                                     size_t data_len);
                                     size_t data_len);
 
 
+
 /* Send data to a websocket server wrapped in a masked websocket frame.  Uses
 /* Send data to a websocket server wrapped in a masked websocket frame.  Uses
    mg_lock_connection to ensure that the transmission is not interrupted,
    mg_lock_connection to ensure that the transmission is not interrupted,
    i.e., when the application is proactively communicating and responding to
    i.e., when the application is proactively communicating and responding to
@@ -497,6 +525,7 @@ CIVETWEB_API int mg_websocket_client_write(struct mg_connection *conn,
                                            const char *data,
                                            const char *data,
                                            size_t data_len);
                                            size_t data_len);
 
 
+
 /* Blocks until unique access is obtained to this connection. Intended for use
 /* Blocks until unique access is obtained to this connection. Intended for use
    with websockets only.
    with websockets only.
    Invoke this before mg_write or mg_printf when communicating with a
    Invoke this before mg_write or mg_printf when communicating with a
@@ -505,16 +534,19 @@ CIVETWEB_API int mg_websocket_client_write(struct mg_connection *conn,
 CIVETWEB_API void mg_lock_connection(struct mg_connection *conn);
 CIVETWEB_API void mg_lock_connection(struct mg_connection *conn);
 CIVETWEB_API void mg_unlock_connection(struct mg_connection *conn);
 CIVETWEB_API void mg_unlock_connection(struct mg_connection *conn);
 
 
+
 #if defined(MG_LEGACY_INTERFACE)
 #if defined(MG_LEGACY_INTERFACE)
 #define mg_lock mg_lock_connection
 #define mg_lock mg_lock_connection
 #define mg_unlock mg_unlock_connection
 #define mg_unlock mg_unlock_connection
 #endif
 #endif
 
 
+
 /* Lock server context.  This lock may be used to protect resources
 /* Lock server context.  This lock may be used to protect resources
    that are shared between different connection/worker threads. */
    that are shared between different connection/worker threads. */
 CIVETWEB_API void mg_lock_context(struct mg_context *ctx);
 CIVETWEB_API void mg_lock_context(struct mg_context *ctx);
 CIVETWEB_API void mg_unlock_context(struct mg_context *ctx);
 CIVETWEB_API void mg_unlock_context(struct mg_context *ctx);
 
 
+
 /* Opcodes, from http://tools.ietf.org/html/rfc6455 */
 /* Opcodes, from http://tools.ietf.org/html/rfc6455 */
 enum {
 enum {
 	WEBSOCKET_OPCODE_CONTINUATION = 0x0,
 	WEBSOCKET_OPCODE_CONTINUATION = 0x0,
@@ -525,6 +557,7 @@ enum {
 	WEBSOCKET_OPCODE_PONG = 0xa
 	WEBSOCKET_OPCODE_PONG = 0xa
 };
 };
 
 
+
 /* Macros for enabling compiler-specific checks for printf-like arguments. */
 /* Macros for enabling compiler-specific checks for printf-like arguments. */
 #undef PRINTF_FORMAT_STRING
 #undef PRINTF_FORMAT_STRING
 #if defined(_MSC_VER) && _MSC_VER >= 1400
 #if defined(_MSC_VER) && _MSC_VER >= 1400
@@ -544,15 +577,18 @@ enum {
 #define PRINTF_ARGS(x, y)
 #define PRINTF_ARGS(x, y)
 #endif
 #endif
 
 
+
 /* Send data to the client using printf() semantics.
 /* Send data to the client using printf() semantics.
    Works exactly like mg_write(), but allows to do message formatting. */
    Works exactly like mg_write(), but allows to do message formatting. */
 CIVETWEB_API int mg_printf(struct mg_connection *,
 CIVETWEB_API int mg_printf(struct mg_connection *,
                            PRINTF_FORMAT_STRING(const char *fmt),
                            PRINTF_FORMAT_STRING(const char *fmt),
                            ...) PRINTF_ARGS(2, 3);
                            ...) PRINTF_ARGS(2, 3);
 
 
+
 /* Send contents of the entire file together with HTTP headers. */
 /* Send contents of the entire file together with HTTP headers. */
 CIVETWEB_API void mg_send_file(struct mg_connection *conn, const char *path);
 CIVETWEB_API void mg_send_file(struct mg_connection *conn, const char *path);
 
 
+
 /* Read data from the remote end, return number of bytes read.
 /* Read data from the remote end, return number of bytes read.
    Return:
    Return:
      0     connection has been closed by peer. No more data could be read.
      0     connection has been closed by peer. No more data could be read.
@@ -560,6 +596,7 @@ CIVETWEB_API void mg_send_file(struct mg_connection *conn, const char *path);
      > 0   number of bytes read into the buffer. */
      > 0   number of bytes read into the buffer. */
 CIVETWEB_API int mg_read(struct mg_connection *, void *buf, size_t len);
 CIVETWEB_API int mg_read(struct mg_connection *, void *buf, size_t len);
 
 
+
 /* Get the value of particular HTTP header.
 /* Get the value of particular HTTP header.
 
 
    This is a helper function. It traverses request_info->http_headers array,
    This is a helper function. It traverses request_info->http_headers array,
@@ -568,6 +605,7 @@ CIVETWEB_API int mg_read(struct mg_connection *, void *buf, size_t len);
 CIVETWEB_API const char *mg_get_header(const struct mg_connection *,
 CIVETWEB_API const char *mg_get_header(const struct mg_connection *,
                                        const char *name);
                                        const char *name);
 
 
+
 /* Get a value of particular form variable.
 /* Get a value of particular form variable.
 
 
    Parameters:
    Parameters:
@@ -593,6 +631,7 @@ CIVETWEB_API int mg_get_var(const char *data,
                             char *dst,
                             char *dst,
                             size_t dst_len);
                             size_t dst_len);
 
 
+
 /* Get a value of particular form variable.
 /* Get a value of particular form variable.
 
 
    Parameters:
    Parameters:
@@ -623,6 +662,7 @@ CIVETWEB_API int mg_get_var2(const char *data,
                              size_t dst_len,
                              size_t dst_len,
                              size_t occurrence);
                              size_t occurrence);
 
 
+
 /* Fetch value of certain cookie variable into the destination buffer.
 /* Fetch value of certain cookie variable into the destination buffer.
 
 
    Destination buffer is guaranteed to be '\0' - terminated. In case of
    Destination buffer is guaranteed to be '\0' - terminated. In case of
@@ -641,6 +681,7 @@ CIVETWEB_API int mg_get_cookie(const char *cookie,
                                char *buf,
                                char *buf,
                                size_t buf_len);
                                size_t buf_len);
 
 
+
 /* Download data from the remote web server.
 /* Download data from the remote web server.
      host: host name to connect to, e.g. "foo.com", or "10.12.40.1".
      host: host name to connect to, e.g. "foo.com", or "10.12.40.1".
      port: port number, e.g. 80.
      port: port number, e.g. 80.
@@ -665,27 +706,129 @@ mg_download(const char *host,
             PRINTF_FORMAT_STRING(const char *request_fmt),
             PRINTF_FORMAT_STRING(const char *request_fmt),
             ...) PRINTF_ARGS(6, 7);
             ...) PRINTF_ARGS(6, 7);
 
 
+
 /* Close the connection opened by mg_download(). */
 /* Close the connection opened by mg_download(). */
 CIVETWEB_API void mg_close_connection(struct mg_connection *conn);
 CIVETWEB_API void mg_close_connection(struct mg_connection *conn);
 
 
+
 /* File upload functionality. Each uploaded file gets saved into a temporary
 /* File upload functionality. Each uploaded file gets saved into a temporary
    file and MG_UPLOAD event is sent.
    file and MG_UPLOAD event is sent.
-   Return number of uploaded files. */
+   Return number of uploaded files.
+   Deprecated: Use mg_handle_form_request instead. */
 CIVETWEB_API int mg_upload(struct mg_connection *conn,
 CIVETWEB_API int mg_upload(struct mg_connection *conn,
                            const char *destination_dir);
                            const char *destination_dir);
 
 
+
+/* This structure contains callback functions for handling form fields.
+   It is used as an argument to mg_handle_form_request. */
+struct mg_form_data_handler {
+	/* This callback function is called, if a new field has been found.
+	 * The return value of this callback is used to define how the field
+	 * should be processed.
+	 *
+	 * Parameters:
+	 *   key: Name of the field ("name" property of the HTML input field).
+	 *   filename: Name of a file to upload, at the client computer.
+	 *             Only set for input fields of type "file", otherwise NULL.
+	 *   path: Output parameter: File name (incl. path) to store the file
+	 *         at the server computer. Only used if FORM_FIELD_STORAGE_STORE
+	 *         is returned by this callback. Existing files will be
+	 *         overwritten.
+	 *   pathlen: Length of the buffer for path.
+	 *   user_data: Value of the member user_data of mg_form_data_handler
+	 *
+	 * Return value:
+	 *   The callback must return the intended storage for this field
+	 *   (See FORM_FIELD_STORAGE_*).
+	 */
+	int (*field_found)(const char *key,
+	                   const char *filename,
+	                   char *path,
+	                   size_t pathlen,
+	                   void *user_data);
+
+	/* If the "field_found" callback returned FORM_FIELD_STORAGE_GET,
+	 * this callback will receive the field data.
+	 *
+	 * Parameters:
+	 *   key: Name of the field ("name" property of the HTML input field).
+	 *   value: Value of the input field.
+	 *   user_data: Value of the member user_data of mg_form_data_handler
+	 *
+	 * Return value:
+	 *   TODO: Needs to be defined.
+	 */
+	int (*field_get)(const char *key,
+	                 const char *value,
+	                 size_t valuelen,
+	                 void *user_data);
+
+	/* If the "field_found" callback returned FORM_FIELD_STORAGE_STORE,
+	 * the data will be stored into a file. If the file has been written
+	 * successfully, this callback will be called. This callback will
+	 * not be called for only partially uploaded files. The
+	 * mg_handle_form_request function will either store the file completely
+	 * and call this callback, or it will remove any partial content and
+	 * not call this callback function.
+	 *
+	 * Parameters:
+	 *   path: Path of the file stored at the server.
+	 *   file_size: Size of the stored file in bytes.
+	 *   user_data: Value of the member user_data of mg_form_data_handler
+	 *
+	 * Return value:
+	 *   TODO: Needs to be defined.
+	 */
+	int (*field_stored)(const char *path, size_t file_size, void *user_data);
+
+	/* User supplied argument, passed to all callback functions. */
+	void *user_data;
+};
+
+
+/* Return values definition for the "field_found" callback in
+ * mg_form_data_handler. */
+enum {
+	/* Skip this field (neither get nor store it). Continue with the
+     * next field. */
+	FORM_FIELD_STORAGE_SKIP = 0x0,
+	/* Get the field value. */
+	FORM_FIELD_STORAGE_GET = 0x1,
+	/* Store the field value into a file. */
+	FORM_FIELD_STORAGE_STORE = 0x2,
+	/* Read the filed in chunks using a read function. */
+	/*	FORM_FIELD_STORAGE_READ = 0x3, not in the first step */
+	/* Stop parsing this request. Skip the remaining fields. */
+	FORM_FIELD_STORAGE_ABORT = 0x10
+};
+
+
+/* Process form data.
+ * Returns the number of fields handled, or < 0 in case of an error.
+ * Note: It is possible that several fields are already handled successfully
+ * (e.g., stored into files), before the request handling is stopped with an
+ * error. In this case a number < 0 is returned as well.
+ * In any case, it is the duty of the caller to remove files once they are
+ * no longer required. */
+CIVETWEB_API int mg_handle_form_request(struct mg_connection *conn,
+                                        struct mg_form_data_handler *fdh);
+
+
 /* Convenience function -- create detached thread.
 /* Convenience function -- create detached thread.
    Return: 0 on success, non-0 on error. */
    Return: 0 on success, non-0 on error. */
 typedef void *(*mg_thread_func_t)(void *);
 typedef void *(*mg_thread_func_t)(void *);
 CIVETWEB_API int mg_start_thread(mg_thread_func_t f, void *p);
 CIVETWEB_API int mg_start_thread(mg_thread_func_t f, void *p);
 
 
+
 /* Return builtin mime type for the given file name.
 /* Return builtin mime type for the given file name.
    For unrecognized extensions, "text/plain" is returned. */
    For unrecognized extensions, "text/plain" is returned. */
 CIVETWEB_API const char *mg_get_builtin_mime_type(const char *file_name);
 CIVETWEB_API const char *mg_get_builtin_mime_type(const char *file_name);
 
 
+
 /* Return Civetweb version. */
 /* Return Civetweb version. */
 CIVETWEB_API const char *mg_version(void);
 CIVETWEB_API const char *mg_version(void);
 
 
+
 /* URL-decode input buffer into destination buffer.
 /* URL-decode input buffer into destination buffer.
    0-terminate the destination buffer.
    0-terminate the destination buffer.
    form-url-encoded data differs from URI encoding in a way that it
    form-url-encoded data differs from URI encoding in a way that it
@@ -698,11 +841,13 @@ CIVETWEB_API int mg_url_decode(const char *src,
                                int dst_len,
                                int dst_len,
                                int is_form_url_encoded);
                                int is_form_url_encoded);
 
 
+
 /* URL-encode input buffer into destination buffer.
 /* URL-encode input buffer into destination buffer.
    returns the length of the resulting buffer or -1
    returns the length of the resulting buffer or -1
    is the buffer is too small. */
    is the buffer is too small. */
 CIVETWEB_API int mg_url_encode(const char *src, char *dst, size_t dst_len);
 CIVETWEB_API int mg_url_encode(const char *src, char *dst, size_t dst_len);
 
 
+
 /* MD5 hash given strings.
 /* MD5 hash given strings.
    Buffer 'buf' must be 33 bytes long. Varargs is a NULL terminated list of
    Buffer 'buf' must be 33 bytes long. Varargs is a NULL terminated list of
    ASCIIz strings. When function returns, buf will contain human-readable
    ASCIIz strings. When function returns, buf will contain human-readable
@@ -711,6 +856,7 @@ CIVETWEB_API int mg_url_encode(const char *src, char *dst, size_t dst_len);
      mg_md5(buf, "aa", "bb", NULL); */
      mg_md5(buf, "aa", "bb", NULL); */
 CIVETWEB_API char *mg_md5(char buf[33], ...);
 CIVETWEB_API char *mg_md5(char buf[33], ...);
 
 
+
 /* Print error message to the opened error log stream.
 /* Print error message to the opened error log stream.
    This utilizes the provided logging configuration.
    This utilizes the provided logging configuration.
      conn: connection
      conn: connection
@@ -722,9 +868,11 @@ CIVETWEB_API void mg_cry(const struct mg_connection *conn,
                          PRINTF_FORMAT_STRING(const char *fmt),
                          PRINTF_FORMAT_STRING(const char *fmt),
                          ...) PRINTF_ARGS(2, 3);
                          ...) PRINTF_ARGS(2, 3);
 
 
+
 /* utility method to compare two buffers, case incensitive. */
 /* utility method to compare two buffers, case incensitive. */
 CIVETWEB_API int mg_strncasecmp(const char *s1, const char *s2, size_t len);
 CIVETWEB_API int mg_strncasecmp(const char *s1, const char *s2, size_t len);
 
 
+
 /* Connect to a websocket as a client
 /* Connect to a websocket as a client
    Parameters:
    Parameters:
      host: host to connect to, i.e. "echo.websocket.org" or "192.168.1.1" or
      host: host to connect to, i.e. "echo.websocket.org" or "192.168.1.1" or
@@ -743,7 +891,6 @@ CIVETWEB_API int mg_strncasecmp(const char *s1, const char *s2, size_t len);
      On success, valid mg_connection object.
      On success, valid mg_connection object.
      On error, NULL. Se error_buffer for details.
      On error, NULL. Se error_buffer for details.
 */
 */
-
 CIVETWEB_API struct mg_connection *
 CIVETWEB_API struct mg_connection *
 mg_connect_websocket_client(const char *host,
 mg_connect_websocket_client(const char *host,
                             int port,
                             int port,
@@ -756,6 +903,7 @@ mg_connect_websocket_client(const char *host,
                             mg_websocket_close_handler close_func,
                             mg_websocket_close_handler close_func,
                             void *user_data);
                             void *user_data);
 
 
+
 /* Connect to a TCP server as a client (can be used to connect to a HTTP server)
 /* Connect to a TCP server as a client (can be used to connect to a HTTP server)
    Parameters:
    Parameters:
      host: host to connect to, i.e. "www.wikipedia.org" or "192.168.1.1" or
      host: host to connect to, i.e. "www.wikipedia.org" or "192.168.1.1" or
@@ -783,6 +931,7 @@ struct mg_client_options {
 	/* TODO: add more data */
 	/* TODO: add more data */
 };
 };
 
 
+
 CIVETWEB_API struct mg_connection *
 CIVETWEB_API struct mg_connection *
 mg_connect_client_secure(const struct mg_client_options *client_options,
 mg_connect_client_secure(const struct mg_client_options *client_options,
                          char *error_buffer,
                          char *error_buffer,
@@ -791,6 +940,7 @@ mg_connect_client_secure(const struct mg_client_options *client_options,
 
 
 enum { TIMEOUT_INFINITE = -1 };
 enum { TIMEOUT_INFINITE = -1 };
 
 
+
 /* Wait for a response from the server
 /* Wait for a response from the server
    Parameters:
    Parameters:
      conn: connection
      conn: connection
@@ -807,6 +957,7 @@ CIVETWEB_API int mg_get_response(struct mg_connection *conn,
                                  size_t ebuf_len,
                                  size_t ebuf_len,
                                  int timeout);
                                  int timeout);
 
 
+
 /* Check which features where set when civetweb has been compiled.
 /* Check which features where set when civetweb has been compiled.
    Parameters:
    Parameters:
      feature: specifies which feature should be checked
      feature: specifies which feature should be checked
@@ -825,6 +976,7 @@ CIVETWEB_API int mg_get_response(struct mg_connection *conn,
 */
 */
 CIVETWEB_API unsigned mg_check_feature(unsigned feature);
 CIVETWEB_API unsigned mg_check_feature(unsigned feature);
 
 
+
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }
 #endif /* __cplusplus */
 #endif /* __cplusplus */

+ 2 - 106
src/handle_form.inl

@@ -19,110 +19,6 @@
  * THE SOFTWARE.
  * THE SOFTWARE.
  */
  */
 
 
-/********************/
-/* EXPERIMENTAL !!! */
-/********************/
-
-
-/**********************/
-/* proposed interface */
-
-
-/* This structure contains callback functions for handling form fields.
-   It is used as an argument to mg_handle_form_data. */
-struct mg_form_data_handler {
-	/* This callback function is called, if a new field has been found.
-	 * The return value of this callback is used to define how the field
-	 * should be processed.
-	 *
-	 * Parameters:
-	 *   key: Name of the field ("name" property of the HTML input field).
-	 *   filename: Name of a file to upload, at the client computer.
-	 *             Only set for input fields of type "file", otherwise NULL.
-	 *   path: Output parameter: File name (incl. path) to store the file
-	 *         at the server computer. Only used if FORM_FIELD_STORAGE_STORE
-	 *         is returned by this callback. Existing files will be
-	 *         overwritten.
-	 *   pathlen: Length of the buffer for path.
-	 *   user_data: Value of the member user_data of mg_form_data_handler
-	 *
-	 * Return value:
-	 *   The callback must return the intended storage for this field
-	 *   (See FORM_FIELD_STORAGE_*).
-	 */
-	int (*field_found)(const char *key,
-	                   const char *filename,
-	                   char *path,
-	                   size_t pathlen,
-	                   void *user_data);
-
-	/* If the "field_found" callback returned FORM_FIELD_STORAGE_GET,
-	 * this callback will receive the field data.
-	 *
-	 * Parameters:
-	 *   key: Name of the field ("name" property of the HTML input field).
-	 *   value: Value of the input field.
-	 *   user_data: Value of the member user_data of mg_form_data_handler
-	 *
-	 * Return value:
-	 *   TODO: Needs to be defined.
-	 */
-	int (*field_get)(const char *key,
-	                 const char *value,
-	                 size_t valuelen,
-	                 void *user_data);
-
-	/* If the "field_found" callback returned FORM_FIELD_STORAGE_STORE,
-	 * the data will be stored into a file. If the file has been written
-	 * successfully, this callback will be called. This callback will
-	 * not be called for only partially uploaded files. The
-	 * mg_handle_form_data function will either store the file completely
-	 * and call this callback, or it will remove any partial content and
-	 * not call this callback function.
-	 *
-	 * Parameters:
-	 *   path: Path of the file stored at the server.
-	 *   user_data: Value of the member user_data of mg_form_data_handler
-	 *
-	 * Return value:
-	 *   TODO: Needs to be defined.
-	 */
-	int (*field_stored)(const char *path, size_t file_size, void *user_data);
-
-	/* User supplied argument, passed to all callback functions. */
-	void *user_data;
-};
-
-
-/* Return values definition for the "field_found" callback in
- * mg_form_data_handler. */
-enum {
-	/* Skip this field (neither get nor store it). Continue with the
-     * next field. */
-	FORM_FIELD_STORAGE_SKIP = 0x0,
-	/* Get the field value. */
-	FORM_FIELD_STORAGE_GET = 0x1,
-	/* Store the field value into a file. */
-	FORM_FIELD_STORAGE_STORE = 0x2,
-	/* Read the filed in chunks using a read function. */
-	/*	FORM_FIELD_STORAGE_READ = 0x3, not in the first step */
-	/* Stop parsing this request. Skip the remaining fields. */
-	FORM_FIELD_STORAGE_ABORT = 0x10
-};
-
-
-/* Process form data.
- * Returns the number of fields handled, or < 0 in case of an error.
- * Note: It is possible that several fields are already handled successfully
- * (e.g., stored into files), before the request handling is stopped with an
- * error. In this case a number < 0 is returned as well.
- * In any case, it is the duty of the caller to remove files once they are
- * no longer required. */
-CIVETWEB_API int mg_handle_form_data(struct mg_connection *conn,
-                                     struct mg_form_data_handler *fdh);
-
-/* end of interface */
-/********************/
 
 
 static int
 static int
 url_encoded_field_found(const struct mg_connection *conn,
 url_encoded_field_found(const struct mg_connection *conn,
@@ -249,8 +145,8 @@ search_boundary(const char *buf,
 
 
 
 
 int
 int
-mg_handle_form_data(struct mg_connection *conn,
-                    struct mg_form_data_handler *fdh)
+mg_handle_form_request(struct mg_connection *conn,
+                       struct mg_form_data_handler *fdh)
 {
 {
 	const char *content_type;
 	const char *content_type;
 	char path[512];
 	char path[512];