nghttpx: Accept and ignore content-length: 0 in 204 response for now
This commit is contained in:
parent
5645cad577
commit
b6a9cf9ffa
|
@ -477,6 +477,11 @@ void dump_nv(FILE *out, const HeaderRefs &nva) {
|
||||||
fflush(out);
|
fflush(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void erase_header(HeaderRef *hd) {
|
||||||
|
hd->name = StringRef{};
|
||||||
|
hd->token = -1;
|
||||||
|
}
|
||||||
|
|
||||||
StringRef rewrite_location_uri(BlockAllocator &balloc, const StringRef &uri,
|
StringRef rewrite_location_uri(BlockAllocator &balloc, const StringRef &uri,
|
||||||
const http_parser_url &u,
|
const http_parser_url &u,
|
||||||
const StringRef &match_host,
|
const StringRef &match_host,
|
||||||
|
|
|
@ -227,6 +227,9 @@ void dump_nv(FILE *out, const Headers &nva);
|
||||||
|
|
||||||
void dump_nv(FILE *out, const HeaderRefs &nva);
|
void dump_nv(FILE *out, const HeaderRefs &nva);
|
||||||
|
|
||||||
|
// Ereases header in |hd|.
|
||||||
|
void erase_header(HeaderRef *hd);
|
||||||
|
|
||||||
// Rewrites redirection URI which usually appears in location header
|
// Rewrites redirection URI which usually appears in location header
|
||||||
// field. The |uri| is the URI in the location header field. The |u|
|
// field. The |uri| is the URI in the location header field. The |u|
|
||||||
// stores the result of parsed |uri|. The |request_authority| is the
|
// stores the result of parsed |uri|. The |request_authority| is the
|
||||||
|
|
|
@ -720,15 +720,33 @@ int htp_hdrs_completecb(http_parser *htp) {
|
||||||
// 204. Also server MUST NOT send Transfer-Encoding with a status
|
// 204. Also server MUST NOT send Transfer-Encoding with a status
|
||||||
// code 200 to a CONNECT request. Same holds true with
|
// code 200 to a CONNECT request. Same holds true with
|
||||||
// Content-Length.
|
// Content-Length.
|
||||||
if (resp.http_status == 204 || resp.http_status / 100 == 1 ||
|
if (resp.http_status == 204) {
|
||||||
(resp.http_status == 200 && req.method == HTTP_CONNECT)) {
|
if (resp.fs.header(http2::HD_TRANSFER_ENCODING)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// Some server send content-length: 0 for 204. Until they get
|
||||||
|
// fixed, we accept, but ignore it.
|
||||||
|
|
||||||
|
// Calling parse_content_length() detects duplicated
|
||||||
|
// content-length header fields.
|
||||||
|
if (resp.fs.parse_content_length() != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (resp.fs.content_length != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (resp.fs.content_length == 0) {
|
||||||
|
auto cl = resp.fs.header(http2::HD_CONTENT_LENGTH);
|
||||||
|
assert(cl);
|
||||||
|
http2::erase_header(cl);
|
||||||
|
}
|
||||||
|
} else if (resp.http_status / 100 == 1 ||
|
||||||
|
(resp.http_status == 200 && req.method == HTTP_CONNECT)) {
|
||||||
if (resp.fs.header(http2::HD_CONTENT_LENGTH) ||
|
if (resp.fs.header(http2::HD_CONTENT_LENGTH) ||
|
||||||
resp.fs.header(http2::HD_TRANSFER_ENCODING)) {
|
resp.fs.header(http2::HD_TRANSFER_ENCODING)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
} else if (resp.fs.parse_content_length() != 0) {
|
||||||
|
|
||||||
if (resp.fs.parse_content_length() != 0) {
|
|
||||||
downstream->set_response_state(Downstream::MSG_BAD_HEADER);
|
downstream->set_response_state(Downstream::MSG_BAD_HEADER);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -233,7 +233,7 @@ mrb_value response_return(mrb_state *mrb, mrb_value self) {
|
||||||
(resp.http_status == 200 && req.method == HTTP_CONNECT)) {
|
(resp.http_status == 200 && req.method == HTTP_CONNECT)) {
|
||||||
if (cl) {
|
if (cl) {
|
||||||
// Delete content-length here
|
// Delete content-length here
|
||||||
cl->name = StringRef{};
|
http2::erase_header(cl);
|
||||||
}
|
}
|
||||||
|
|
||||||
resp.fs.content_length = -1;
|
resp.fs.content_length = -1;
|
||||||
|
|
Loading…
Reference in New Issue