diff --git a/test/volume_server/http/read_path_variants_test.go b/test/volume_server/http/read_path_variants_test.go index 97a7ac628..1e6281a43 100644 --- a/test/volume_server/http/read_path_variants_test.go +++ b/test/volume_server/http/read_path_variants_test.go @@ -164,6 +164,10 @@ func TestConditionalHeaderPrecedenceAndInvalidIfModifiedSince(t *testing.T) { if lastModified == "" { t.Fatalf("baseline read expected Last-Modified header") } + etag := baselineResp.Header.Get("ETag") + if etag == "" { + t.Fatalf("baseline read expected ETag header") + } precedenceReq := mustNewRequest(t, http.MethodGet, clusterHarness.VolumeAdminURL()+"/"+fid) precedenceReq.Header.Set("If-Modified-Since", lastModified) @@ -188,4 +192,28 @@ func TestConditionalHeaderPrecedenceAndInvalidIfModifiedSince(t *testing.T) { if string(invalidIMSBody) != string(payload) { t.Fatalf("invalid If-Modified-Since fallback body mismatch: got %q want %q", string(invalidIMSBody), string(payload)) } + + headIMSPrecedenceReq := mustNewRequest(t, http.MethodHead, clusterHarness.VolumeAdminURL()+"/"+fid) + headIMSPrecedenceReq.Header.Set("If-Modified-Since", lastModified) + headIMSPrecedenceReq.Header.Set("If-None-Match", "\"definitely-different-etag\"") + headIMSPrecedenceResp := framework.DoRequest(t, client, headIMSPrecedenceReq) + headIMSPrecedenceBody := framework.ReadAllAndClose(t, headIMSPrecedenceResp) + if headIMSPrecedenceResp.StatusCode != http.StatusNotModified { + t.Fatalf("HEAD conditional precedence expected 304 when If-Modified-Since matches, got %d", headIMSPrecedenceResp.StatusCode) + } + if len(headIMSPrecedenceBody) != 0 { + t.Fatalf("HEAD conditional precedence expected empty body, got %d bytes", len(headIMSPrecedenceBody)) + } + + headETagPrecedenceReq := mustNewRequest(t, http.MethodHead, clusterHarness.VolumeAdminURL()+"/"+fid) + headETagPrecedenceReq.Header.Set("If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT") + headETagPrecedenceReq.Header.Set("If-None-Match", etag) + headETagPrecedenceResp := framework.DoRequest(t, client, headETagPrecedenceReq) + headETagPrecedenceBody := framework.ReadAllAndClose(t, headETagPrecedenceResp) + if headETagPrecedenceResp.StatusCode != http.StatusNotModified { + t.Fatalf("HEAD conditional precedence expected 304 when If-None-Match matches, got %d", headETagPrecedenceResp.StatusCode) + } + if len(headETagPrecedenceBody) != 0 { + t.Fatalf("HEAD conditional etag precedence expected empty body, got %d bytes", len(headETagPrecedenceBody)) + } }