mirror of
https://github.com/lammertb/libhttp.git
synced 2025-08-07 16:02:55 +03:00
Fix some TODOs in handle_form (#180)
This commit is contained in:
@@ -196,7 +196,7 @@ field_found(const char *key,
|
|||||||
{
|
{
|
||||||
struct mg_connection *conn = (struct mg_connection *)user_data;
|
struct mg_connection *conn = (struct mg_connection *)user_data;
|
||||||
|
|
||||||
mg_printf(conn, "%s:\r\n", key);
|
mg_printf(conn, "\r\n\r\n%s:\r\n", key);
|
||||||
|
|
||||||
if (filename && *filename) {
|
if (filename && *filename) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -215,9 +215,10 @@ field_get(const char *key, const char *value, size_t valuelen, void *user_data)
|
|||||||
{
|
{
|
||||||
struct mg_connection *conn = (struct mg_connection *)user_data;
|
struct mg_connection *conn = (struct mg_connection *)user_data;
|
||||||
|
|
||||||
|
if (key[0]) {
|
||||||
mg_printf(conn, "%s = ", key);
|
mg_printf(conn, "%s = ", key);
|
||||||
|
}
|
||||||
mg_write(conn, value, valuelen);
|
mg_write(conn, value, valuelen);
|
||||||
mg_printf(conn, "\r\n\r\n");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -251,8 +252,10 @@ FormHandler(struct mg_connection *conn, void *cbdata)
|
|||||||
mg_printf(conn, "HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\n\r\n");
|
mg_printf(conn, "HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\n\r\n");
|
||||||
fdh.user_data = (void *)conn;
|
fdh.user_data = (void *)conn;
|
||||||
|
|
||||||
/* TODO: Handle the return value */
|
/* Call the form handler */
|
||||||
|
mg_printf(conn, "Form data:");
|
||||||
ret = mg_handle_form_request(conn, &fdh);
|
ret = mg_handle_form_request(conn, &fdh);
|
||||||
|
mg_printf(conn, "\r\n%i fields found", ret);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@@ -331,6 +331,7 @@ mg_handle_form_request(struct mg_connection *conn,
|
|||||||
ptrdiff_t keylen, vallen;
|
ptrdiff_t keylen, vallen;
|
||||||
ptrdiff_t used;
|
ptrdiff_t used;
|
||||||
int end_of_key_value_pair_found = 0;
|
int end_of_key_value_pair_found = 0;
|
||||||
|
int get_block;
|
||||||
|
|
||||||
if ((size_t)buf_fill < (sizeof(buf) - 1)) {
|
if ((size_t)buf_fill < (sizeof(buf) - 1)) {
|
||||||
|
|
||||||
@@ -391,6 +392,7 @@ mg_handle_form_request(struct mg_connection *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_block = 0;
|
||||||
/* Loop to read values larger than sizeof(buf)-keylen-2 */
|
/* Loop to read values larger than sizeof(buf)-keylen-2 */
|
||||||
do {
|
do {
|
||||||
next = strchr(val, '&');
|
next = strchr(val, '&');
|
||||||
@@ -403,6 +405,22 @@ mg_handle_form_request(struct mg_connection *conn,
|
|||||||
next = val + vallen;
|
next = val + vallen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (field_storage == FORM_FIELD_STORAGE_GET) {
|
||||||
|
#if 0
|
||||||
|
if (!end_of_key_value_pair_found && !all_data_read) {
|
||||||
|
/* This callback will deliver partial contents */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* Call callback */
|
||||||
|
url_encoded_field_get(conn,
|
||||||
|
((get_block > 0) ? NULL : buf),
|
||||||
|
((get_block > 0) ? 0
|
||||||
|
: (size_t)keylen),
|
||||||
|
val,
|
||||||
|
(size_t)vallen,
|
||||||
|
fdh);
|
||||||
|
get_block++;
|
||||||
|
}
|
||||||
if (fstore.fp) {
|
if (fstore.fp) {
|
||||||
size_t n =
|
size_t n =
|
||||||
(size_t)fwrite(val, 1, (size_t)vallen, fstore.fp);
|
(size_t)fwrite(val, 1, (size_t)vallen, fstore.fp);
|
||||||
@@ -417,23 +435,41 @@ mg_handle_form_request(struct mg_connection *conn,
|
|||||||
}
|
}
|
||||||
file_size += (size_t)n;
|
file_size += (size_t)n;
|
||||||
}
|
}
|
||||||
if (field_storage == FORM_FIELD_STORAGE_GET) {
|
|
||||||
if (!end_of_key_value_pair_found && !all_data_read) {
|
|
||||||
/* TODO: check for an easy way to get longer data */
|
|
||||||
mg_cry(conn,
|
|
||||||
"%s: Data too long for callback",
|
|
||||||
__func__);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* Call callback */
|
|
||||||
url_encoded_field_get(
|
|
||||||
conn, buf, (size_t)keylen, val, (size_t)vallen, fdh);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!end_of_key_value_pair_found) {
|
if (!end_of_key_value_pair_found) {
|
||||||
/* TODO: read more data */
|
used = next - buf;
|
||||||
|
memmove(buf,
|
||||||
|
buf + (size_t)used,
|
||||||
|
sizeof(buf) - (size_t)used);
|
||||||
|
buf_fill -= (int)used;
|
||||||
|
if ((size_t)buf_fill < (sizeof(buf) - 1)) {
|
||||||
|
|
||||||
|
size_t to_read = sizeof(buf) - 1 - (size_t)buf_fill;
|
||||||
|
r = mg_read(conn, buf + (size_t)buf_fill, to_read);
|
||||||
|
if (r < 0) {
|
||||||
|
/* read error */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (r != (int)to_read) {
|
||||||
|
/* TODO: Create a function to get "all_data_read"
|
||||||
|
* from
|
||||||
|
* the conn object. All data is read if the
|
||||||
|
* Content-Length
|
||||||
|
* has been reached, or if chunked encoding is used
|
||||||
|
* and
|
||||||
|
* the end marker has been read, or if the
|
||||||
|
* connection has
|
||||||
|
* been closed. */
|
||||||
|
all_data_read = 1;
|
||||||
|
}
|
||||||
|
buf_fill += r;
|
||||||
|
buf[buf_fill] = 0;
|
||||||
|
if (buf_fill < 1) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
val = buf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} while (!end_of_key_value_pair_found);
|
} while (!end_of_key_value_pair_found);
|
||||||
|
|
||||||
@@ -494,7 +530,8 @@ mg_handle_form_request(struct mg_connection *conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
size_t towrite, n, get_block;
|
size_t towrite, n;
|
||||||
|
int get_block;
|
||||||
|
|
||||||
r = mg_read(conn,
|
r = mg_read(conn,
|
||||||
buf + (size_t)buf_fill,
|
buf + (size_t)buf_fill,
|
||||||
|
Reference in New Issue
Block a user