Merge pull request #388 from ianberinger/master

Update go-containerregistry dependency
This commit is contained in:
priyawadhwa 2018-10-10 12:17:58 -07:00 committed by GitHub
commit 03db09e95f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 28 deletions

4
Gopkg.lock generated
View File

@ -431,7 +431,7 @@
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:edf64d541c12aaf4f279642ea9939f035dcc9fc2edf649aba295e9cbca2c28d4" digest = "1:764d0a9bb2c987d9333c5b0a256bc94791db50c0b5be2fa10f2247b1dcbd7a04"
name = "github.com/google/go-containerregistry" name = "github.com/google/go-containerregistry"
packages = [ packages = [
"pkg/authn", "pkg/authn",
@ -450,7 +450,7 @@
"pkg/v1/v1util", "pkg/v1/v1util",
] ]
pruneopts = "NUT" pruneopts = "NUT"
revision = "03167950e20ac82689f50828811e69cdd9e02af2" revision = "24bbadfcffb5e05b1578cb2bd5438992ada3b546"
[[projects]] [[projects]]
digest = "1:f4f203acd8b11b8747bdcd91696a01dbc95ccb9e2ca2db6abf81c3a4f5e950ce" digest = "1:f4f203acd8b11b8747bdcd91696a01dbc95ccb9e2ca2db6abf81c3a4f5e950ce"

View File

@ -125,6 +125,11 @@ func (i *compressedImageExtender) Layers() ([]v1.Layer, error) {
// LayerByDigest implements v1.Image // LayerByDigest implements v1.Image
func (i *compressedImageExtender) LayerByDigest(h v1.Hash) (v1.Layer, error) { func (i *compressedImageExtender) LayerByDigest(h v1.Hash) (v1.Layer, error) {
if cfgName, err := i.ConfigName(); err != nil {
return nil, err
} else if cfgName == h {
return ConfigLayer(i)
}
cl, err := i.CompressedImageCore.LayerByDigest(h) cl, err := i.CompressedImageCore.LayerByDigest(h)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -37,8 +37,12 @@ type UncompressedLayer interface {
// uncompressedLayerExtender implements v1.Image using the uncompressed base properties. // uncompressedLayerExtender implements v1.Image using the uncompressed base properties.
type uncompressedLayerExtender struct { type uncompressedLayerExtender struct {
UncompressedLayer UncompressedLayer
// TODO(mattmoor): Memoize size/hash so that the methods aren't twice as // Memoize size/hash so that the methods aren't twice as
// expensive as doing this manually. // expensive as doing this manually.
hash v1.Hash
size int64
hashSizeError error
once sync.Once
} }
// Compressed implements v1.Layer // Compressed implements v1.Layer
@ -52,29 +56,31 @@ func (ule *uncompressedLayerExtender) Compressed() (io.ReadCloser, error) {
// Digest implements v1.Layer // Digest implements v1.Layer
func (ule *uncompressedLayerExtender) Digest() (v1.Hash, error) { func (ule *uncompressedLayerExtender) Digest() (v1.Hash, error) {
r, err := ule.Compressed() ule.calcSizeHash()
if err != nil { return ule.hash, ule.hashSizeError
return v1.Hash{}, err
}
defer r.Close()
h, _, err := v1.SHA256(r)
return h, err
} }
// Size implements v1.Layer // Size implements v1.Layer
func (ule *uncompressedLayerExtender) Size() (int64, error) { func (ule *uncompressedLayerExtender) Size() (int64, error) {
r, err := ule.Compressed() ule.calcSizeHash()
if err != nil { return ule.size, ule.hashSizeError
return -1, err }
}
defer r.Close() func (ule *uncompressedLayerExtender) calcSizeHash() {
_, i, err := v1.SHA256(r) ule.once.Do(func() {
return i, err var r io.ReadCloser
r, ule.hashSizeError = ule.Compressed()
if ule.hashSizeError != nil {
return
}
defer r.Close()
ule.hash, ule.size, ule.hashSizeError = v1.SHA256(r)
})
} }
// UncompressedToLayer fills in the missing methods from an UncompressedLayer so that it implements v1.Layer // UncompressedToLayer fills in the missing methods from an UncompressedLayer so that it implements v1.Layer
func UncompressedToLayer(ul UncompressedLayer) (v1.Layer, error) { func UncompressedToLayer(ul UncompressedLayer) (v1.Layer, error) {
return &uncompressedLayerExtender{ul}, nil return &uncompressedLayerExtender{UncompressedLayer: ul}, nil
} }
// UncompressedImageCore represents the bare minimum interface a natively // UncompressedImageCore represents the bare minimum interface a natively

View File

@ -46,22 +46,37 @@ var _ http.RoundTripper = (*bearerTransport)(nil)
// RoundTrip implements http.RoundTripper // RoundTrip implements http.RoundTripper
func (bt *bearerTransport) RoundTrip(in *http.Request) (*http.Response, error) { func (bt *bearerTransport) RoundTrip(in *http.Request) (*http.Response, error) {
hdr, err := bt.bearer.Authorization() sendRequest := func() (*http.Response, error) {
hdr, err := bt.bearer.Authorization()
if err != nil {
return nil, err
}
// http.Client handles redirects at a layer above the http.RoundTripper
// abstraction, so to avoid forwarding Authorization headers to places
// we are redirected, only set it when the authorization header matches
// the registry with which we are interacting.
if in.Host == bt.registry.RegistryStr() {
in.Header.Set("Authorization", hdr)
}
in.Header.Set("User-Agent", transportName)
return bt.inner.RoundTrip(in)
}
res, err := sendRequest()
if err != nil { if err != nil {
return nil, err return nil, err
} }
// http.Client handles redirects at a layer above the http.RoundTripper // Perform a token refresh() and retry the request in case the token has expired
// abstraction, so to avoid forwarding Authorization headers to places if res.StatusCode == http.StatusUnauthorized {
// we are redirected, only set it when the authorization header matches if err = bt.refresh(); err != nil {
// the registry with which we are interacting. return nil, err
if in.Host == bt.registry.RegistryStr() { }
in.Header.Set("Authorization", hdr) return sendRequest()
} }
in.Header.Set("User-Agent", transportName)
// TODO(mattmoor): On 401s perform a single refresh() and retry. return res, err
return bt.inner.RoundTrip(in)
} }
func (bt *bearerTransport) refresh() error { func (bt *bearerTransport) refresh() error {