-
Notifications
You must be signed in to change notification settings - Fork 398
Open
Description
Expected Behavior
When the backend returns a Content-Length
while replying to a HEAD request, it should be passed to the client.
Current Behavior
When the content was fetched in response to a HEAD request, the client receives Content-Length: 0
.
Possible Solution
No response
Steps to Reproduce (for bugs)
- Build Varnish from 772d738
- Use the following VCL (see HEAD requestes changed to GET #2107):
vcl 4.1;
backend default {
# A Debian archive mirror
.host = "D.E.F.G";
.port = "80";
}
sub vcl_recv {
unset req.http.X-Fetch-Method;
if (req.restarts == 1) {
return (hash);
}
}
sub vcl_hash {
if (req.restarts == 1) {
hash_data(req.method);
}
}
sub vcl_miss {
if (req.method == "HEAD") {
if (req.restarts == 0) {
return (restart);
}
set req.http.X-Fetch-Method = "HEAD";
}
}
sub vcl_backend_fetch {
if (bereq.http.X-Fetch-Method) {
set bereq.method = bereq.http.X-Fetch-Method;
}
unset bereq.http.X-Fetch-Method;
}
- Start
tshark -f "host D.E.F.G" -t ad -V
- Execute
curl http://localhost/pub/debian/README.html -I
- tshark show the request:
Hypertext Transfer Protocol
HEAD /pub/debian/README.html HTTP/1.1\r\n
and the reply:
Hypertext Transfer Protocol
HTTP/1.1 200 OK\r\n
[Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n]
[HTTP/1.1 200 OK\r\n]
[Severity level: Chat]
[Group: Sequence]
Response Version: HTTP/1.1
Status Code: 200
[Status Code Description: OK]
Response Phrase: OK
Date: Mon, 30 Dec 2024 16:42:24 GMT\r\n
Server: Apache\r\n
X-XSS-Protection: 1\r\n
Content-Security-Policy: default-src 'self' *._____.__\r\n
X-Content-Type-Options: nosniff\r\n
Last-Modified: Sat, 09 Nov 2024 09:23:03 GMT\r\n
ETag: "b67-626776a22999e-gzip"\r\n
Accept-Ranges: bytes\r\n
Vary: Accept-Encoding\r\n
Content-Encoding: gzip\r\n
Content-Length: 967\r\n
[Content length: 967]
Content-Type: text/html\r\n
\r\n
[HTTP response 1/1]
[Time since request: 0.012166528 seconds]
[Request in frame: 4]
[Request URI: http://localhost/pub/debian/README.html]
- The client receives this:
HTTP/1.1 200 OK
Date: Mon, 30 Dec 2024 16:42:24 GMT
Server: Apache
X-XSS-Protection: 1
Content-Security-Policy: default-src 'self' *._____.__
X-Content-Type-Options: nosniff
Last-Modified: Sat, 09 Nov 2024 09:23:03 GMT
ETag: "b67-626776a22999e-gzip"
Vary: Accept-Encoding
Content-Type: text/html
X-Varnish: 3
Age: 0
Via: 1.1 localhost (Varnish/trunk)
Accept-Ranges: bytes
Content-Length: 0
Connection: keep-alive
Context
Sending a Content-Length of 0 looks incorrect:
in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.
according to https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13
It also breaks some clients such as (Go-http-client used by Packer doesn't even attempts to send a GET after the HEAD as it assumes that the file is empty).
Varnish Cache version
varnishd (varnish-trunk revision 772d738)
Operating system
Debian 12
Source of binary packages used (if any)
N/A
Metadata
Metadata
Assignees
Labels
No labels