mirror of
https://github.com/lammertb/libhttp.git
synced 2026-01-03 16:02:30 +03:00
Alternative to mg_upload (Step 8/?)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user