mirror of
https://github.com/cesanta/mongoose.git
synced 2025-06-21 11:10:47 +08:00
fix header truncation
This commit is contained in:
parent
4b0e34cdf4
commit
eda1e8a402
13
mongoose.c
13
mongoose.c
@ -1431,22 +1431,24 @@ struct mg_str *mg_http_get_header(struct mg_http_message *h, const char *name) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mg_http_parse_headers(const char *s, const char *end,
|
static bool mg_http_parse_headers(const char *s, const char *end,
|
||||||
struct mg_http_header *h, int max_headers) {
|
struct mg_http_header *h, int max_headers) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < max_headers; i++) {
|
for (i = 0; i < max_headers; i++) {
|
||||||
struct mg_str k, v, tmp;
|
struct mg_str k, v, tmp;
|
||||||
const char *he = skip(s, end, "\n", &tmp);
|
const char *he = skip(s, end, "\r\n", &tmp);
|
||||||
|
if (tmp.len == 0) break; // empty header = EOH
|
||||||
s = skip(s, he, ": \r\n", &k);
|
s = skip(s, he, ": \r\n", &k);
|
||||||
s = skip(s, he, "\r\n", &v);
|
s = skip(s, he, "\r\n", &v);
|
||||||
if (k.len == tmp.len) continue;
|
if (k.len == tmp.len) continue;
|
||||||
while (v.len > 0 && v.ptr[v.len - 1] == ' ') v.len--; // Trim spaces
|
while (v.len > 0 && v.ptr[v.len - 1] == ' ') v.len--; // Trim spaces
|
||||||
if (k.len == 0) break;
|
if (k.len == 0) return false; // empty name
|
||||||
// MG_INFO(("--HH [%.*s] [%.*s] [%.*s]", (int) tmp.len - 1, tmp.ptr,
|
// MG_INFO(("--HH [%.*s] [%.*s] [%.*s]", (int) tmp.len - 1, tmp.ptr,
|
||||||
//(int) k.len, k.ptr, (int) v.len, v.ptr));
|
//(int) k.len, k.ptr, (int) v.len, v.ptr));
|
||||||
h[i].name = k;
|
h[i].name = k;
|
||||||
h[i].value = v;
|
h[i].value = v;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) {
|
int mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) {
|
||||||
@ -1478,8 +1480,9 @@ int mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) {
|
|||||||
hm->uri.len = (size_t) (qs - hm->uri.ptr);
|
hm->uri.len = (size_t) (qs - hm->uri.ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
mg_http_parse_headers(s, end, hm->headers,
|
if (!mg_http_parse_headers(s, end, hm->headers,
|
||||||
sizeof(hm->headers) / sizeof(hm->headers[0]));
|
sizeof(hm->headers) / sizeof(hm->headers[0])))
|
||||||
|
return -1; // error when parsing
|
||||||
if ((cl = mg_http_get_header(hm, "Content-Length")) != NULL) {
|
if ((cl = mg_http_get_header(hm, "Content-Length")) != NULL) {
|
||||||
if (mg_to_size_t(*cl, &hm->body.len) == false) return -1;
|
if (mg_to_size_t(*cl, &hm->body.len) == false) return -1;
|
||||||
hm->message.len = (size_t) req_len + hm->body.len;
|
hm->message.len = (size_t) req_len + hm->body.len;
|
||||||
|
13
src/http.c
13
src/http.c
@ -199,22 +199,24 @@ struct mg_str *mg_http_get_header(struct mg_http_message *h, const char *name) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mg_http_parse_headers(const char *s, const char *end,
|
static bool mg_http_parse_headers(const char *s, const char *end,
|
||||||
struct mg_http_header *h, int max_headers) {
|
struct mg_http_header *h, int max_headers) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < max_headers; i++) {
|
for (i = 0; i < max_headers; i++) {
|
||||||
struct mg_str k, v, tmp;
|
struct mg_str k, v, tmp;
|
||||||
const char *he = skip(s, end, "\n", &tmp);
|
const char *he = skip(s, end, "\r\n", &tmp);
|
||||||
|
if (tmp.len == 0) break; // empty header = EOH
|
||||||
s = skip(s, he, ": \r\n", &k);
|
s = skip(s, he, ": \r\n", &k);
|
||||||
s = skip(s, he, "\r\n", &v);
|
s = skip(s, he, "\r\n", &v);
|
||||||
if (k.len == tmp.len) continue;
|
if (k.len == tmp.len) continue;
|
||||||
while (v.len > 0 && v.ptr[v.len - 1] == ' ') v.len--; // Trim spaces
|
while (v.len > 0 && v.ptr[v.len - 1] == ' ') v.len--; // Trim spaces
|
||||||
if (k.len == 0) break;
|
if (k.len == 0) return false; // empty name
|
||||||
// MG_INFO(("--HH [%.*s] [%.*s] [%.*s]", (int) tmp.len - 1, tmp.ptr,
|
// MG_INFO(("--HH [%.*s] [%.*s] [%.*s]", (int) tmp.len - 1, tmp.ptr,
|
||||||
//(int) k.len, k.ptr, (int) v.len, v.ptr));
|
//(int) k.len, k.ptr, (int) v.len, v.ptr));
|
||||||
h[i].name = k;
|
h[i].name = k;
|
||||||
h[i].value = v;
|
h[i].value = v;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) {
|
int mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) {
|
||||||
@ -246,8 +248,9 @@ int mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) {
|
|||||||
hm->uri.len = (size_t) (qs - hm->uri.ptr);
|
hm->uri.len = (size_t) (qs - hm->uri.ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
mg_http_parse_headers(s, end, hm->headers,
|
if (!mg_http_parse_headers(s, end, hm->headers,
|
||||||
sizeof(hm->headers) / sizeof(hm->headers[0]));
|
sizeof(hm->headers) / sizeof(hm->headers[0])))
|
||||||
|
return -1; // error when parsing
|
||||||
if ((cl = mg_http_get_header(hm, "Content-Length")) != NULL) {
|
if ((cl = mg_http_get_header(hm, "Content-Length")) != NULL) {
|
||||||
if (mg_to_size_t(*cl, &hm->body.len) == false) return -1;
|
if (mg_to_size_t(*cl, &hm->body.len) == false) return -1;
|
||||||
hm->message.len = (size_t) req_len + hm->body.len;
|
hm->message.len = (size_t) req_len + hm->body.len;
|
||||||
|
Loading…
Reference in New Issue
Block a user