1
0
mirror of https://github.com/lammertb/libhttp.git synced 2025-07-31 08:24:23 +03:00

Alternative to mg_upload (Step 20/?)

This commit is contained in:
bel
2016-01-17 19:09:04 +01:00
parent 731d362dd2
commit 9e526697fd
2 changed files with 26 additions and 15 deletions

View File

@ -183,6 +183,8 @@ int
field_found(const char *key,
size_t keylen,
const char *filename,
char *path,
size_t pathlen,
void *user_data)
{
struct mg_connection *conn = (struct mg_connection *)user_data;

View File

@ -51,6 +51,8 @@ struct mg_form_data_handler {
int (*field_found)(const char *key,
size_t keylen,
const char *filename,
char *path,
size_t pathlen,
void *user_data);
int (*field_get)(const char *key,
size_t keylen,
@ -66,6 +68,8 @@ static int
url_encoded_field_found(const char *key,
size_t keylen,
const char *filename,
char *path,
size_t pathlen,
struct mg_form_data_handler *fdh)
{
/* Call callback */
@ -73,7 +77,8 @@ url_encoded_field_found(const char *key,
int ret =
mg_url_decode(key, (size_t)keylen, key_dec, (int)sizeof(key_dec), 1);
if ((ret < sizeof(key_dec)) && (ret >= 0)) {
return fdh->field_found(key, keylen, filename, fdh->user_data);
return fdh->field_found(
key, keylen, filename, path, pathlen, fdh->user_data);
}
return FORM_DISPOSITION_SKIP;
}
@ -107,6 +112,7 @@ mg_handle_form_data(struct mg_connection *conn,
struct mg_form_data_handler *fdh)
{
const char *content_type;
char path[512];
char buf[1024];
int disposition;
int buf_fill = 0;
@ -166,8 +172,9 @@ mg_handle_form_data(struct mg_connection *conn,
* (for parsing long data on the fly)
* FORM_DISPOSITION_ABORT (flag) ... stop parsing
*/
disposition =
url_encoded_field_found(data, (size_t)keylen, NULL, fdh);
memset(path, 0, sizeof(path));
disposition = url_encoded_field_found(
data, (size_t)keylen, NULL, path, sizeof(path) - 1, fdh);
val++;
next = strchr(val, '&');
@ -179,10 +186,7 @@ mg_handle_form_data(struct mg_connection *conn,
next = val + vallen;
}
if (disposition == mg_cry(conn,
"%s: Cannot store file %s",
__func__,
path);) {
if (disposition == FORM_DISPOSITION_GET) {
/* Call callback */
url_encoded_field_get(
data, (size_t)keylen, NULL, val, (size_t)vallen, fdh);
@ -190,16 +194,16 @@ mg_handle_form_data(struct mg_connection *conn,
if (disposition == FORM_DISPOSITION_STORE) {
/* Store the content to a file */
/* TODO: Get "path" from callback" */
struct mg_file f;
if (mg_fopen(conn, path, "wb", &f)) {
size_t n = (size_t)fwrite(value, 1, (size_t)vallen, f.fp);
if ((n != vallen) || (ferror(fp)) {
FILE *f = fopen(path, "wb");
if (f != NULL) {
size_t n = (size_t)fwrite(val, 1, (size_t)vallen, f);
if ((n != vallen) || (ferror(f))) {
mg_cry(conn,
"%s: Cannot write file %s",
__func__,
path);
}
mg_fclose(&f);
}
fclose(f);
} else {
mg_cry(conn, "%s: Cannot create file %s", __func__, path);
}
@ -280,8 +284,13 @@ mg_handle_form_data(struct mg_connection *conn,
}
/* Call callback */
disposition =
fdh->field_found(buf, (size_t)keylen, NULL, fdh->user_data);
memset(path, 0, sizeof(path));
disposition = fdh->field_found(buf,
(size_t)keylen,
NULL,
path,
sizeof(path) - 1,
fdh->user_data);
/* Proceed to next entry */
used = next - buf;