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