1
0
mirror of https://github.com/lammertb/libhttp.git synced 2025-12-22 04:02:04 +03:00

Alternative to mg_upload (Step 9/?)

This commit is contained in:
bel
2016-01-12 19:58:15 +01:00
parent 76b327b1d0
commit d5ca172723

View File

@@ -22,6 +22,7 @@
/********************/ /********************/
/* EXPERIMENTAL !!! */ /* EXPERIMENTAL !!! */
/********************/ /********************/
#ifdef USE_EXPERIMENTAL
void void
mirror_body___dev_helper(struct mg_connection *conn) mirror_body___dev_helper(struct mg_connection *conn)
@@ -118,18 +119,70 @@ mg_handle_form_data(struct mg_connection *conn,
return 0; return 0;
} }
mirror_body___dev_helper(conn);
content_type = mg_get_header(conn, "Content-Type"); content_type = mg_get_header(conn, "Content-Type");
if (!content_type if (!content_type
|| !mg_strcasecmp(content_type, "APPLICATION/X-WWW-FORM-URLENCODED")) { || !mg_strcasecmp(content_type, "APPLICATION/X-WWW-FORM-URLENCODED")) {
/* The form data is in the request body data, encoded in key/value /* The form data is in the request body data, encoded in key/value
* pairs. */ * pairs. */
/* TODO: read body data and split it in a=1&b&c=3&c=4 ... */
/* Read body data and split it in a=1&b&c=3&c=4 ... */
/* The encoding is like in the "GET" case above, but here we read data
* on the fly */
char buf[/*10*/ 24];
int buf_fill = 0;
buf_fill = mg_read(conn, buf, sizeof(buf) - 1);
if (buf_fill <= 0) {
/* No data available */
return 0;
}
buf[buf_fill] = 0;
data = buf;
while (*data) {
const char *val = strchr(data, '=');
const char *next;
ptrdiff_t keylen, vallen;
if (!val) {
size_t used = data - buf;
char *tgt = buf + sizeof(buf) - used;
/* Drop used data (used = data - buf) */
memmove(buf, data, used);
buf_fill -= used;
buf_fill += mg_read(conn, tgt, used);
buf[sizeof(buf) - 1] = 0;
val = strchr(data, '=');
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;
} }
mirror_body___dev_helper(conn);
if (!mg_strncasecmp(content_type, "MULTIPART/FORM-DATA;", 20)) { if (!mg_strncasecmp(content_type, "MULTIPART/FORM-DATA;", 20)) {
/* The form data is in the request body data, encoded as multipart /* The form data is in the request body data, encoded as multipart
* content. */ * content. */
@@ -147,3 +200,5 @@ mg_handle_form_data(struct mg_connection *conn,
/* Unknown Content-Type */ /* Unknown Content-Type */
return 0; return 0;
} }
#endif