diff --git a/registry/client/repository.go b/registry/client/repository.go index 0a2bfec1..679d09ca 100644 --- a/registry/client/repository.go +++ b/registry/client/repository.go @@ -98,7 +98,11 @@ func (r *registry) Repositories(ctx context.Context, entries []string, last stri return 0, err } - resp, err := r.client.Get(u) + req, err := http.NewRequestWithContext(ctx, "GET", u, nil) + if err != nil { + return 0, err + } + resp, err := r.client.Do(req) if err != nil { return 0, err } @@ -214,7 +218,11 @@ func (t *tags) All(ctx context.Context) ([]string, error) { } for { - resp, err := t.client.Get(listURL.String()) + req, err := http.NewRequestWithContext(ctx, "GET", listURL.String(), nil) + if err != nil { + return nil, err + } + resp, err := t.client.Do(req) if err != nil { return tags, err } @@ -307,7 +315,7 @@ func (t *tags) Get(ctx context.Context, tag string) (distribution.Descriptor, er } newRequest := func(method string) (*http.Response, error) { - req, err := http.NewRequest(method, u, nil) + req, err := http.NewRequestWithContext(ctx, method, u, nil) if err != nil { return nil, err } @@ -376,7 +384,11 @@ func (ms *manifests) Exists(ctx context.Context, dgst digest.Digest) (bool, erro return false, err } - resp, err := ms.client.Head(u) + req, err := http.NewRequestWithContext(ctx, "HEAD", u, nil) + if err != nil { + return false, err + } + resp, err := ms.client.Do(req) if err != nil { return false, err } @@ -467,7 +479,7 @@ func (ms *manifests) Get(ctx context.Context, dgst digest.Digest, options ...dis return nil, err } - req, err := http.NewRequest("GET", u, nil) + req, err := http.NewRequestWithContext(ctx, "GET", u, nil) if err != nil { return nil, err } @@ -552,7 +564,7 @@ func (ms *manifests) Put(ctx context.Context, m distribution.Manifest, options . return "", err } - putRequest, err := http.NewRequest("PUT", manifestURL, bytes.NewReader(p)) + putRequest, err := http.NewRequestWithContext(ctx, "PUT", manifestURL, bytes.NewReader(p)) if err != nil { return "", err } @@ -587,7 +599,7 @@ func (ms *manifests) Delete(ctx context.Context, dgst digest.Digest) error { if err != nil { return err } - req, err := http.NewRequest("DELETE", u, nil) + req, err := http.NewRequestWithContext(ctx, "DELETE", u, nil) if err != nil { return err } @@ -657,7 +669,7 @@ func (bs *blobs) Open(ctx context.Context, dgst digest.Digest) (distribution.Rea return nil, err } - return transport.NewHTTPReadSeeker(bs.client, blobURL, + return transport.NewHTTPReadSeeker(ctx, bs.client, blobURL, func(resp *http.Response) error { if resp.StatusCode == http.StatusNotFound { return distribution.ErrBlobUnknown @@ -838,7 +850,11 @@ func (bs *blobStatter) Stat(ctx context.Context, dgst digest.Digest) (distributi return distribution.Descriptor{}, err } - resp, err := bs.client.Head(u) + req, err := http.NewRequestWithContext(ctx, "HEAD", u, nil) + if err != nil { + return distribution.Descriptor{}, err + } + resp, err := bs.client.Do(req) if err != nil { return distribution.Descriptor{}, err } @@ -890,7 +906,7 @@ func (bs *blobStatter) Clear(ctx context.Context, dgst digest.Digest) error { return err } - req, err := http.NewRequest("DELETE", blobURL, nil) + req, err := http.NewRequestWithContext(ctx, "DELETE", blobURL, nil) if err != nil { return err } diff --git a/registry/client/transport/http_reader.go b/registry/client/transport/http_reader.go index 1d0b382f..0f8194fe 100644 --- a/registry/client/transport/http_reader.go +++ b/registry/client/transport/http_reader.go @@ -1,6 +1,7 @@ package transport import ( + "context" "errors" "fmt" "io" @@ -28,8 +29,9 @@ type ReadSeekCloser interface { // request. When seeking and starting a read from a non-zero offset // the a "Range" header will be added which sets the offset. // TODO(dmcgowan): Move this into a separate utility package -func NewHTTPReadSeeker(client *http.Client, url string, errorHandler func(*http.Response) error) ReadSeekCloser { +func NewHTTPReadSeeker(ctx context.Context, client *http.Client, url string, errorHandler func(*http.Response) error) ReadSeekCloser { return &httpReadSeeker{ + ctx: ctx, client: client, url: url, errorHandler: errorHandler, @@ -37,6 +39,7 @@ func NewHTTPReadSeeker(client *http.Client, url string, errorHandler func(*http. } type httpReadSeeker struct { + ctx context.Context client *http.Client url string @@ -168,7 +171,7 @@ func (hrs *httpReadSeeker) reader() (io.Reader, error) { return hrs.rc, nil } - req, err := http.NewRequest("GET", hrs.url, nil) + req, err := http.NewRequestWithContext(hrs.ctx, "GET", hrs.url, nil) if err != nil { return nil, err }