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:
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user