Browse Source

Alternative to mg_upload (Step 8/?)

bel 9 năm trước cách đây
mục cha
commit
76b327b1d0

+ 19 - 3
examples/embedded_c/embedded_c.c

@@ -26,7 +26,7 @@
 #endif
 #endif
 #else
 #else
 #ifdef USE_IPV6
 #ifdef USE_IPV6
-#define PORT "[::]:8888r,[::]:8843s"
+#define PORT "[::]:8888r,[::]:8843s,8884"
 #else
 #else
 #define PORT "8888r,8843s"
 #define PORT "8888r,8843s"
 #endif
 #endif
@@ -156,8 +156,13 @@ FileHandler(struct mg_connection *conn, void *cbdata)
 
 
 
 
 struct mg_form_data_handler {
 struct mg_form_data_handler {
-	int (*field_found)(const char *key, const char *value, void *user_data);
+	int (*field_found)(const char *key,
+	                   size_t keylen,
+	                   const char *value,
+	                   size_t vallen,
+	                   void *user_data);
 	int (*file_found)(const char *key,
 	int (*file_found)(const char *key,
+	                  size_t keylen,
 	                  const char *filename,
 	                  const char *filename,
 	                  int *disposition,
 	                  int *disposition,
 	                  void *user_data);
 	                  void *user_data);
@@ -166,12 +171,23 @@ struct mg_form_data_handler {
 
 
 
 
 int
 int
+field_found(const char *key,
+            size_t keylen,
+            const char *value,
+            size_t vallen,
+            void *user_data)
+{
+	return 0;
+}
+
+
+int
 FormHandler(struct mg_connection *conn, void *cbdata)
 FormHandler(struct mg_connection *conn, void *cbdata)
 {
 {
 	/* Handler may access the request info using mg_get_request_info */
 	/* Handler may access the request info using mg_get_request_info */
 	const struct mg_request_info *req_info = mg_get_request_info(conn);
 	const struct mg_request_info *req_info = mg_get_request_info(conn);
 	int ret;
 	int ret;
-	struct mg_form_data_handler fdh = {0, 0, 0};
+	struct mg_form_data_handler fdh = {field_found, 0, 0};
 
 
 	/* TODO: Checks before calling handle_form_data ? */
 	/* TODO: Checks before calling handle_form_data ? */
 	(void)req_info;
 	(void)req_info;

+ 38 - 2
src/handle_form.inl

@@ -39,8 +39,13 @@ mirror_body___dev_helper(struct mg_connection *conn)
 
 
 
 
 struct mg_form_data_handler {
 struct mg_form_data_handler {
-	int (*field_found)(const char *key, const char *value, void *user_data);
+	int (*field_found)(const char *key,
+	                   size_t keylen,
+	                   const char *value,
+	                   size_t vallen,
+	                   void *user_data);
 	int (*file_found)(const char *key,
 	int (*file_found)(const char *key,
+	                  size_t keylen,
 	                  const char *filename,
 	                  const char *filename,
 	                  int *disposition,
 	                  int *disposition,
 	                  void *user_data);
 	                  void *user_data);
@@ -78,7 +83,38 @@ mg_handle_form_data(struct mg_connection *conn,
 
 
 		/* GET request: form data is in the query string. */
 		/* GET request: form data is in the query string. */
 		data = conn->request_info.query_string;
 		data = conn->request_info.query_string;
-		/* TODO: split data in a=1&b&c=3&c=4 ... */
+		if (!data) {
+			/* No query string. */
+			return 0;
+		}
+
+		/* Split data in a=1&b&c=3&c=4 ... */
+		while (*data) {
+			const char *val = strchr(data, '=');
+			const char *next;
+			ptrdiff_t keylen, vallen;
+
+			if (!val) {
+				break;
+			}
+			keylen = val - data;
+			val++;
+			next = strchr(val, '&');
+			if (next) {
+				vallen = next - val;
+				next++;
+			} else {
+				vallen = strlen(val);
+			}
+
+			/* Call callback */
+			fdh->field_found(
+			    data, (size_t)keylen, val, (size_t)vallen, fdh->user_data);
+
+			/* Proceed to next entry */
+			data = val + vallen;
+		}
+
 		return 0;
 		return 0;
 	}
 	}