From 5ccd5b6953c95986407a735a41e8c36cf05944d1 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Wed, 4 Nov 2015 00:28:44 +0900 Subject: Remove content-length and content-range if transfer-encoding is given See GH-473 --- src/HttpHeaderProcessor.cc | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'src/HttpHeaderProcessor.cc') diff --git a/src/HttpHeaderProcessor.cc b/src/HttpHeaderProcessor.cc index 5a5fab35..52dfc758 100644 --- a/src/HttpHeaderProcessor.cc +++ b/src/HttpHeaderProcessor.cc @@ -446,7 +446,24 @@ fin: lastBytesProcessed_ = i; headers_.append(&data[0], &data[i]); - return state_ == HEADERS_COMPLETE; + + if (state_ != HEADERS_COMPLETE) { + return false; + } + + // If both transfer-encoding and (content-length or content-range) + // are present, delete content-length and content-range. RFC 7230 + // says that sender must not send both transfer-encoding and + // content-length. If both present, transfer-encoding overrides + // content-length. There is no text about transfer-encoding and + // content-range. But there is no reason to send transfer-encoding + // when range is set. + if (result_->defined(HttpHeader::TRANSFER_ENCODING)) { + result_->remove(HttpHeader::CONTENT_LENGTH); + result_->remove(HttpHeader::CONTENT_RANGE); + } + + return true; } bool HttpHeaderProcessor::parse(const std::string& data) -- cgit