Adjust recv.len after stripping chunked body

This commit is contained in:
cpq committed 2021-03-19 13:13:24 +00:00
1 parent a1862986b8
commit 9009cbc528
2 files changed
+8 -6

No files matched your search

+4 -3
View File
@@ -1273,11 +1273,13 @@ static void walkchunks(struct mg_connection *c, struct mg_http_message *hm,
size_t memo = c->recv.len; size_t memo = c->recv.len;
size_t cl = get_chunk_length(&buf[off], memo - reqlen - off, &ll); size_t cl = get_chunk_length(&buf[off], memo - reqlen - off, &ll);
size_t n = cl < ll + 2 ? 0 : cl - ll - 2; size_t n = cl < ll + 2 ? 0 : cl - ll - 2;
if (cl <= 5) break;
memmove(buf + bl, buf + off + ll, n); memmove(buf + bl, buf + off + ll, n);
bl += n; bl += n;
off += cl; off += cl;
if (cl <= 5) break;
} }
// LOG(LL_INFO, ("BL->%d del %d off %d", (int) bl, (int) del, (int) off));
c->recv.len -= off - bl;
// Set message length to indicate we've received // Set message length to indicate we've received
// everything, to fire MG_EV_HTTP_MSG // everything, to fire MG_EV_HTTP_MSG
hm->message.len = bl + reqlen; hm->message.len = bl + reqlen;
@@ -1325,8 +1327,7 @@ static void http_cb(struct mg_connection *c, int ev, void *evd, void *fnd) {
// LOG(LL_INFO, // LOG(LL_INFO,
//("---->%d %d\n%.*s", n, is_chunked, (int) c->recv.len, c->recv.buf)); //("---->%d %d\n%.*s", n, is_chunked, (int) c->recv.len, c->recv.buf));
if (n < 0 && ev == MG_EV_READ) { if (n < 0 && ev == MG_EV_READ) {
LOG(LL_ERROR, ("%lu HTTP parse error", c->id)); mg_error(c, "HTTP parse:\n%.*s", (int) c->recv.len, c->recv.buf);
c->is_closing = 1;
break; break;
} else if (n > 0 && (size_t) c->recv.len >= hm.message.len) { } else if (n > 0 && (size_t) c->recv.len >= hm.message.len) {
mg_call(c, MG_EV_HTTP_MSG, &hm); mg_call(c, MG_EV_HTTP_MSG, &hm);
+4 -3
View File
@@ -854,11 +854,13 @@ static void walkchunks(struct mg_connection *c, struct mg_http_message *hm,
size_t memo = c->recv.len; size_t memo = c->recv.len;
size_t cl = get_chunk_length(&buf[off], memo - reqlen - off, &ll); size_t cl = get_chunk_length(&buf[off], memo - reqlen - off, &ll);
size_t n = cl < ll + 2 ? 0 : cl - ll - 2; size_t n = cl < ll + 2 ? 0 : cl - ll - 2;
if (cl <= 5) break;
memmove(buf + bl, buf + off + ll, n); memmove(buf + bl, buf + off + ll, n);
bl += n; bl += n;
off += cl; off += cl;
if (cl <= 5) break;
} }
// LOG(LL_INFO, ("BL->%d del %d off %d", (int) bl, (int) del, (int) off));
c->recv.len -= off - bl;
// Set message length to indicate we've received // Set message length to indicate we've received
// everything, to fire MG_EV_HTTP_MSG // everything, to fire MG_EV_HTTP_MSG
hm->message.len = bl + reqlen; hm->message.len = bl + reqlen;
@@ -906,8 +908,7 @@ static void http_cb(struct mg_connection *c, int ev, void *evd, void *fnd) {
// LOG(LL_INFO, // LOG(LL_INFO,
//("---->%d %d\n%.*s", n, is_chunked, (int) c->recv.len, c->recv.buf)); //("---->%d %d\n%.*s", n, is_chunked, (int) c->recv.len, c->recv.buf));
if (n < 0 && ev == MG_EV_READ) { if (n < 0 && ev == MG_EV_READ) {
LOG(LL_ERROR, ("%lu HTTP parse error", c->id)); mg_error(c, "HTTP parse:\n%.*s", (int) c->recv.len, c->recv.buf);
c->is_closing = 1;
break; break;
} else if (n > 0 && (size_t) c->recv.len >= hm.message.len) { } else if (n > 0 && (size_t) c->recv.len >= hm.message.len) {
mg_call(c, MG_EV_HTTP_MSG, &hm); mg_call(c, MG_EV_HTTP_MSG, &hm);