mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-17 10:49:47 +00:00
HTTP: respond to messages which have no explicit lengths
This commit is contained in:
1 parent
813489dc2f
commit
c59bf6613a
3 files changed
+64
-2
No files matched your search
+21
-1
@@ -989,7 +989,6 @@ static void http_cb(struct mg_connection *c, int ev, void *ev_data) {
|
||||
if (ev == MG_EV_READ || ev == MG_EV_CLOSE) {
|
||||
struct mg_http_message hm;
|
||||
size_t ofs = 0; // Parsing offset
|
||||
|
||||
while (c->is_resp == 0 && ofs < c->recv.len) {
|
||||
const char *buf = (char *) c->recv.buf + ofs;
|
||||
int n = mg_http_parse(buf, c->recv.len - ofs, &hm);
|
||||
@@ -1016,6 +1015,27 @@ static void http_cb(struct mg_connection *c, int ev, void *ev_data) {
|
||||
mg_error(c, "Invalid Transfer-Encoding"); // See #2460
|
||||
return;
|
||||
}
|
||||
} else if (mg_http_get_header(&hm, "Content-length") == NULL) {
|
||||
// #2593: HTTP packets must contain either Transfer-Encoding or
|
||||
// Content-length
|
||||
bool is_response = mg_ncasecmp(hm.method.ptr, "HTTP/", 5) == 0;
|
||||
bool require_content_len = false;
|
||||
if (!is_response && (mg_vcasecmp(&hm.method, "POST") == 0 ||
|
||||
mg_vcasecmp(&hm.method, "PUT") == 0)) {
|
||||
// POST and PUT should include an entity body. Therefore, they should
|
||||
// contain a Content-length header. Other requests can also contain a
|
||||
// body, but their content has no defined semantics (RFC 7231)
|
||||
require_content_len = true;
|
||||
} else if (is_response) {
|
||||
// HTTP spec 7.2 Entity body: All other responses must include a body
|
||||
// or Content-Length header field defined with a value of 0.
|
||||
int status = mg_http_status(&hm);
|
||||
require_content_len = status >= 200 && status != 204 && status != 304;
|
||||
}
|
||||
if (require_content_len) {
|
||||
mg_http_reply(c, 411, "", "");
|
||||
MG_ERROR(("%s", "Content length missing from request"));
|
||||
}
|
||||
}
|
||||
|
||||
if (is_chunked) {
|
||||
|
||||
Reference in new issue
Block a user