فهرست منبع

Alternative to mg_upload (Step 5/?)

bel 9 سال پیش
والد
کامیت
ff73f34ca6
4فایلهای تغییر یافته به همراه56 افزوده شده و 27 حذف شده
  1. 19 16
      examples/embedded_c/embedded_c.c
  2. 1 0
      format.bat
  3. 13 2
      src/handle_form.inl
  4. 23 9
      test/form.html

+ 19 - 16
examples/embedded_c/embedded_c.c

@@ -147,10 +147,10 @@ FooHandler(struct mg_connection *conn, void *cbdata)
 int
 FileHandler(struct mg_connection *conn, void *cbdata)
 {
-    /* In this handler, we ignore the req_info and send the file "fileName". */
-    const char *fileName = (const char*)cbdata;
+	/* In this handler, we ignore the req_info and send the file "fileName". */
+	const char *fileName = (const char *)cbdata;
 
-    mg_send_file(conn, fileName);
+	mg_send_file(conn, fileName);
 	return 1;
 }
 
@@ -160,13 +160,13 @@ FormHandler(struct mg_connection *conn, void *cbdata)
 {
 	/* Handler may access the request info using mg_get_request_info */
 	const struct mg_request_info *req_info = mg_get_request_info(conn);
-    int ret;
-    struct mg_form_data_handler *fdh = 0;
+	int ret;
+	struct mg_form_data_handler *fdh = 0;
 
-    /* TODO: Checks before calling handle_form_data ? */
-    (void)req_info;
+	/* TODO: Checks before calling handle_form_data ? */
+	(void)req_info;
 
-    ret = handle_form_data(conn, fdh);
+	ret = handle_form_data(conn, fdh);
 
 	return 1;
 }
@@ -361,7 +361,7 @@ main(int argc, char *argv[])
 #endif
 #ifndef NO_SSL
 	                         "ssl_certificate",
-                             "../../resources/cert/server.pem",
+	                         "../../resources/cert/server.pem",
 #endif
 	                         0};
 	struct mg_callbacks callbacks;
@@ -421,13 +421,16 @@ main(int argc, char *argv[])
 	mg_set_request_handler(ctx, "**.foo$", FooHandler, 0);
 
 	/* Add handler for /form  (serve a file outside the document root) */
-	mg_set_request_handler(ctx, "/form", FileHandler, (void *)"../../test/form.html");
-
-    /* Add handler for form data */
-    mg_set_request_handler(ctx, 
-                           "/handle_form.embedded_c.example.callback",
-                           FormHandler, 
-                           (void *)0);
+	mg_set_request_handler(ctx,
+	                       "/form",
+	                       FileHandler,
+	                       (void *)"../../test/form.html");
+
+	/* Add handler for form data */
+	mg_set_request_handler(ctx,
+	                       "/handle_form.embedded_c.example.callback",
+	                       FormHandler,
+	                       (void *)0);
 
 	/* Add HTTP site to open a websocket connection */
 	mg_set_request_handler(ctx, "/websocket", WebSocketStartHandler, 0);

+ 1 - 0
format.bat

@@ -27,3 +27,4 @@ clang-format -i test/shared.c
 clang-format -i test/civetweb_check.h
 clang-format -i test/main.c
 
+clang-format -i examples/embedded_c/embedded_c.c

+ 13 - 2
src/handle_form.inl

@@ -32,10 +32,21 @@ handle_form_data(struct mg_connection *conn, struct mg_form_data_handler *fdh)
 	    (conn->request_info.content_length > 0) || (conn->is_chunked);
 	char *data;
 
+    /* There are three ways to encode data from a HTML form:
+     * 1) method: GET (default)
+     *    The form data is in the HTTP query string.
+     * 2) method: POST, enctype: "application/x-www-form-urlencoded"
+     *    The form data is in the request body. 
+     *    The body is url encoded (the default encoding for POST).
+     * 3) method: POST, enctype: "multipart/form-data".
+     *    The form data is in the request body of a multipart message.
+     *    This is the typical way to handle file upload from a form.
+     */
+
 	content_type = mg_get_header(conn, "Content-Type");
 	if (content_type == NULL) {
-		/* This request does not have a content type set */
-		return 0;
+		/* This request does not have a content type set .. TODO: but it could be a GET requst */
+		//return 0;
 	}
 
 	if (!mg_strcasecmp(content_type, "APPLICATION/X-WWW-FORM-URLENCODED")) {

+ 23 - 9
test/form.html

@@ -23,7 +23,8 @@
 
 
   <form action="/handle_form.embedded_c.example.callback">
-    See <a href="http://www.w3schools.com/html/html_form_input_types.asp">HTML form tutorial</a>.<br />
+    See <a href="http://www.w3schools.com/html/html_form_input_types.asp">HTML form tutorial</a>
+    and <a href="http://www.w3.org/TR/html401/interact/forms.html">HTML spec</a>.<br />
 
     <fieldset>
       <legend>Text inputs:</legend>
@@ -89,14 +90,27 @@
       <textarea name="message" rows="10" cols="30">Text area default text.</textarea>
     </fieldset>
 
-    <input type="submit" value="Submit to Lua script"         formmethod="POST"   formenctype="multipart/form-data"
-     formaction="/handle_form.lua">
-     
-    <input type="submit" value="Submit (form default)">
-    <input type="submit" value="Submit (GET)"                 formmethod="GET">
-    <input type="submit" value="Submit (POST)"                formmethod="POST">
-    <input type="submit" value="Submit (POST, url-encoded)"   formmethod="POST"   formenctype="application/x-www-form-urlencoded">
-    <input type="submit" value="Submit (POST, form-data)"     formmethod="POST"   formenctype="multipart/form-data">
+    <fieldset>
+    <legend>Submit:</legend>
+      <fieldset>
+        <legend>Submit to Lua script:</legend>
+        This will only work if server side Lua scripting is activated and /handle_form.lua can be found on the server.
+        <br>
+        <input type="submit" value="Submit"  formmethod="POST"  formenctype="multipart/form-data"
+         formaction="/handle_form.lua">
+      </fieldset>
+
+      <fieldset>
+        <legend>Submit to callback:</legend>
+        This will only work in the embedded_c example.
+        <br>
+        <input type="submit" value="Submit (form default)">
+        <input type="submit" value="Submit (GET)"                 formmethod="GET">
+        <input type="submit" value="Submit (POST)"                formmethod="POST">
+        <input type="submit" value="Submit (POST, url-encoded)"   formmethod="POST"   formenctype="application/x-www-form-urlencoded">
+        <input type="submit" value="Submit (POST, form-data)"     formmethod="POST"   formenctype="multipart/form-data">
+      </fieldset>
+    </fieldset>
 
   </form>
 </body>