From 07956fa8da34aa205ded81e8f45e3f7e979bb0eb Mon Sep 17 00:00:00 2001 From: Bouke van der Bijl Date: Thu, 22 Aug 2019 12:50:13 +0000 Subject: [PATCH] registry: convert AWS S3 error to correct errcode --- registry/api/errcode/handler.go | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/registry/api/errcode/handler.go b/registry/api/errcode/handler.go index ebb9ce927..84f49ad10 100644 --- a/registry/api/errcode/handler.go +++ b/registry/api/errcode/handler.go @@ -3,6 +3,9 @@ package errcode import ( "encoding/json" "net/http" + + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/docker/distribution/registry/storage/driver" ) // ServeJSON attempts to serve the errcode in a JSON envelope. It marshals err @@ -18,13 +21,27 @@ func ServeJSON(w http.ResponseWriter, err error) error { break } + for i := range errs { + if err2, ok := errs[i].(Error); ok { + errs[i] = replaceError(err2) + } + } + if err, ok := errs[0].(ErrorCoder); ok { sc = err.ErrorCode().Descriptor().HTTPStatusCode } case ErrorCoder: + if err2, ok := errs.(Error); ok { + errs = replaceError(err2) + } + sc = errs.ErrorCode().Descriptor().HTTPStatusCode err = Errors{err} // create an envelope. default: + if err2, ok := err.(Error); ok { + err = replaceError(err2) + } + // We just have an unhandled error type, so just place in an envelope // and move along. err = Errors{err} @@ -38,3 +55,29 @@ func ServeJSON(w http.ResponseWriter, err error) error { return json.NewEncoder(w).Encode(err) } + +func replaceError(e Error) Error { + serr, ok := e.Detail.(driver.Error) + if !ok { + return e + } + + err, ok := serr.Enclosed.(awserr.RequestFailure) + if !ok { + return e + } + + code := ErrorCodeUnknown + switch err.StatusCode() { + case http.StatusForbidden: + code = ErrorCodeDenied + case http.StatusServiceUnavailable: + code = ErrorCodeUnavailable + case http.StatusUnauthorized: + code = ErrorCodeUnauthorized + case http.StatusTooManyRequests: + code = ErrorCodeTooManyRequests + } + + return code.WithDetail(err.Code()) +}