diff --git a/examples/embedded_c/embedded_c.c b/examples/embedded_c/embedded_c.c index d7efd11e..f5a0d3d2 100644 --- a/examples/embedded_c/embedded_c.c +++ b/examples/embedded_c/embedded_c.c @@ -26,7 +26,7 @@ #endif #else #ifdef USE_IPV6 -#define PORT "[::]:8888r,[::]:8843s" +#define PORT "[::]:8888r,[::]:8843s,8884" #else #define PORT "8888r,8843s" #endif @@ -156,8 +156,13 @@ FileHandler(struct mg_connection *conn, void *cbdata) 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, + size_t keylen, const char *filename, int *disposition, void *user_data); @@ -165,13 +170,24 @@ struct mg_form_data_handler { }; +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) { /* 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, 0, 0}; + struct mg_form_data_handler fdh = {field_found, 0, 0}; /* TODO: Checks before calling handle_form_data ? */ (void)req_info; diff --git a/src/handle_form.inl b/src/handle_form.inl index 36a02bbc..30b0d06a 100644 --- a/src/handle_form.inl +++ b/src/handle_form.inl @@ -39,8 +39,13 @@ mirror_body___dev_helper(struct mg_connection *conn) 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, + size_t keylen, const char *filename, int *disposition, void *user_data); @@ -78,7 +83,38 @@ mg_handle_form_data(struct mg_connection *conn, /* GET request: form data is in the 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; }