HTTP Compliance: do not remove ETag header from partial responses. RFC 2616 section 10.2.7 says that partial responses MUST include ETag header, if it would have been sent in a 200 response to the same request. Co-Advisor test cases: test_case/rfc2616/scHdrs-206-include-explicit-withVary-noIfs test_case/rfc2616/scHdrs-206-include-explicit-woutVary-noIfs test_case/rfc2616/scHdrs-206-include-other-If-Range-strong === modified file 'src/client_side.cc' --- src/client_side.cc 2010-09-13 01:48:17 +0000 +++ src/client_side.cc 2010-09-19 02:58:10 +0000 @@ -1244,42 +1244,41 @@ ClientSocketContext::buildRangeHeader(Ht */ debugs(33, 3, "clientBuildRangeHeader: will not do ranges: " << range_err << "."); delete http->request->range; http->request->range = NULL; } else { /* XXX: TODO: Review, this unconditional set may be wrong. - TODO: review. */ httpStatusLineSet(&rep->sline, rep->sline.version, HTTP_PARTIAL_CONTENT, NULL); // web server responded with a valid, but unexpected range. // will (try-to) forward as-is. //TODO: we should cope with multirange request/responses bool replyMatchRequest = rep->content_range != NULL ? request->range->contains(rep->content_range->spec) : true; const int spec_count = http->request->range->specs.count; int64_t actual_clen = -1; debugs(33, 3, "clientBuildRangeHeader: range spec count: " << spec_count << " virgin clen: " << rep->content_length); assert(spec_count > 0); - /* ETags should not be returned with Partial Content replies? */ - hdr->delById(HDR_ETAG); + /* append appropriate header(s) */ if (spec_count == 1) { if (!replyMatchRequest) { hdr->delById(HDR_CONTENT_RANGE); hdr->putContRange(rep->content_range); actual_clen = rep->content_length; //http->range_iter.pos = rep->content_range->spec.begin(); (*http->range_iter.pos)->offset = rep->content_range->spec.offset; (*http->range_iter.pos)->length = rep->content_range->spec.length; } else { HttpHdrRange::iterator pos = http->request->range->begin(); assert(*pos); /* append Content-Range */ if (!hdr->has(HDR_CONTENT_RANGE)) { /* No content range, so this was a full object we are * sending parts of. */