diff --git a/example/handler.c b/example/handler.c index a37a00f..1de62bc 100644 --- a/example/handler.c +++ b/example/handler.c @@ -62,13 +62,7 @@ void echo_handler(struct uh_connection *conn, int event) void upload_handler(struct uh_connection *conn, int event) { if (event == UH_EV_HEAD_COMPLETE) { - struct uh_str str = conn->get_header(conn, "Content-Length"); - int content_length; - char buf[128]; - - sprintf(buf, "%.*s\n", (int)str.len, str.p); - - content_length = atoi(buf); + uint64_t content_length = conn->get_content_length(conn); if (content_length > 1024 * 1024 * 1024) { conn->error(conn, HTTP_STATUS_INTERNAL_SERVER_ERROR, "Too big"); diff --git a/src/connection.c b/src/connection.c index d5f737f..ce5d593 100644 --- a/src/connection.c +++ b/src/connection.c @@ -305,6 +305,13 @@ static struct uh_str conn_get_header(struct uh_connection *conn, const char *nam return value; } +static uint64_t conn_get_content_length(struct uh_connection *conn) +{ + struct uh_connection_internal *conni = (struct uh_connection_internal *)conn; + + return conni->parser.content_length; +} + static struct uh_str conn_get_body(struct uh_connection *conn) { struct uh_connection_internal *conni = (struct uh_connection_internal *)conn; @@ -752,6 +759,7 @@ static void conn_init_cb(struct uh_connection *conn) conn->get_path = conn_get_path; conn->get_query = conn_get_query; conn->get_header = conn_get_header; + conn->get_content_length = conn_get_content_length; conn->get_body = conn_get_body; conn->extract_body = conn_extract_body; } diff --git a/src/uhttpd.h b/src/uhttpd.h index 2a6a4ef..32de6e1 100644 --- a/src/uhttpd.h +++ b/src/uhttpd.h @@ -75,6 +75,7 @@ struct uh_connection { struct uh_str (*get_path)(struct uh_connection *conn); struct uh_str (*get_query)(struct uh_connection *conn); struct uh_str (*get_header)(struct uh_connection *conn, const char *name); + uint64_t (*get_content_length)(struct uh_connection *conn); struct uh_str (*get_body)(struct uh_connection *conn); /* The remain body data will be discurd after this function called */ struct uh_str (*extract_body)(struct uh_connection *conn);