nghttpx: Accept and ignore content-length: 0 in 204 response for now

This commit is contained in:
Tatsuhiro Tsujikawa 2016-12-03 14:57:48 +09:00
parent 5645cad577
commit b6a9cf9ffa
4 changed files with 32 additions and 6 deletions

View File

@ -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,

View File

@ -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

View File

@ -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) {
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)) { (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;
} }

View File

@ -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;