diff --git a/internal/retry/retry.go b/internal/retry/retry.go index 133cb1c12..ad6dcbb75 100644 --- a/internal/retry/retry.go +++ b/internal/retry/retry.go @@ -18,6 +18,7 @@ package retry import ( "context" + "errors" "fmt" "github.com/google/go-containerregistry/internal/retry/wait" @@ -36,7 +37,7 @@ type temporary interface { // IsTemporary returns true if err implements Temporary() and it returns true. func IsTemporary(err error) bool { - if err == context.DeadlineExceeded { + if errors.Is(err, context.DeadlineExceeded) { return false } if te, ok := err.(temporary); ok && te.Temporary() { diff --git a/internal/retry/retry_test.go b/internal/retry/retry_test.go index ace6d8d7c..2091ca54e 100644 --- a/internal/retry/retry_test.go +++ b/internal/retry/retry_test.go @@ -17,6 +17,8 @@ package retry import ( "context" "fmt" + "net/http" + "net/url" "testing" ) @@ -55,6 +57,14 @@ func TestRetry(t *testing.T) { predicate: IsTemporary, err: context.DeadlineExceeded, shouldRetry: false, + }, { + predicate: IsTemporary, + err: &url.Error{ + Op: http.MethodPost, + URL: "http://127.0.0.1:56520/v2/example/blobs/uploads/", + Err: context.DeadlineExceeded, + }, + shouldRetry: false, }} { // Make sure we retry 5 times if we shouldRetry. steps := 5