forked from TrueCloudLab/distribution
fast-stop ServeBlob if we're doing a HEAD request
A registry pointing to ECR is having issues if we try loading the blob Signed-off-by: Damien Mathieu <dmathieu@salesforce.com>
This commit is contained in:
parent
3800c47fd2
commit
c5d5f938e3
2 changed files with 57 additions and 5 deletions
|
@ -672,17 +672,21 @@ func (bs *blobs) ServeBlob(ctx context.Context, w http.ResponseWriter, r *http.R
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Content-Length", strconv.FormatInt(desc.Size, 10))
|
||||||
|
w.Header().Set("Content-Type", desc.MediaType)
|
||||||
|
w.Header().Set("Docker-Content-Digest", dgst.String())
|
||||||
|
w.Header().Set("Etag", dgst.String())
|
||||||
|
|
||||||
|
if r.Method == http.MethodHead {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
blob, err := bs.Open(ctx, dgst)
|
blob, err := bs.Open(ctx, dgst)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer blob.Close()
|
defer blob.Close()
|
||||||
|
|
||||||
w.Header().Set("Content-Length", strconv.FormatInt(desc.Size, 10))
|
|
||||||
w.Header().Set("Content-Type", desc.MediaType)
|
|
||||||
w.Header().Set("Docker-Content-Digest", dgst.String())
|
|
||||||
w.Header().Set("Etag", dgst.String())
|
|
||||||
|
|
||||||
_, err = io.CopyN(w, blob, desc.Size)
|
_, err = io.CopyN(w, blob, desc.Size)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,7 +149,55 @@ func TestBlobServeBlob(t *testing.T) {
|
||||||
t.Errorf("Unexpected %s. Got %s, expected %s", h.Name, resp.Header().Get(h.Name), h.Value)
|
t.Errorf("Unexpected %s. Got %s, expected %s", h.Name, resp.Header().Get(h.Name), h.Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBlobServeBlobHEAD(t *testing.T) {
|
||||||
|
dgst, blob := newRandomBlob(1024)
|
||||||
|
var m testutil.RequestResponseMap
|
||||||
|
addTestFetch("test.example.com/repo1", dgst, blob, &m)
|
||||||
|
|
||||||
|
e, c := testServer(m)
|
||||||
|
defer c()
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
repo, _ := reference.WithName("test.example.com/repo1")
|
||||||
|
r, err := NewRepository(repo, e, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
l := r.Blobs(ctx)
|
||||||
|
|
||||||
|
resp := httptest.NewRecorder()
|
||||||
|
req := httptest.NewRequest("HEAD", "/", nil)
|
||||||
|
|
||||||
|
err = l.ServeBlob(ctx, resp, req, dgst)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error serving blob: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Error reading response body: %s", err.Error())
|
||||||
|
}
|
||||||
|
if string(body) != "" {
|
||||||
|
t.Errorf("Unexpected response body. Got %q, expected %q", string(body), "")
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedHeaders := []struct {
|
||||||
|
Name string
|
||||||
|
Value string
|
||||||
|
}{
|
||||||
|
{Name: "Content-Length", Value: "1024"},
|
||||||
|
{Name: "Content-Type", Value: "application/octet-stream"},
|
||||||
|
{Name: "Docker-Content-Digest", Value: dgst.String()},
|
||||||
|
{Name: "Etag", Value: dgst.String()},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, h := range expectedHeaders {
|
||||||
|
if resp.Header().Get(h.Name) != h.Value {
|
||||||
|
t.Errorf("Unexpected %s. Got %s, expected %s", h.Name, resp.Header().Get(h.Name), h.Value)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBlobDelete(t *testing.T) {
|
func TestBlobDelete(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue