diff --git a/pkg/packages/rpm/provider.go b/pkg/packages/rpm/provider.go index 7a5c857..211efac 100644 --- a/pkg/packages/rpm/provider.go +++ b/pkg/packages/rpm/provider.go @@ -16,11 +16,9 @@ package rpm import ( "context" - "errors" "fmt" "io" "net/http" - "os" "strings" "github.com/gorilla/mux" @@ -106,11 +104,7 @@ func (p *provider) upload(w http.ResponseWriter, r *http.Request) { return } if err := repo.Write(ctx, pkg); err != nil { - if errors.Is(err, os.ErrExist) { - http.Error(w, err.Error(), http.StatusConflict) - return - } - http.Error(w, err.Error(), http.StatusInternalServerError) + repository.Error(w, err) return } w.WriteHeader(http.StatusCreated) @@ -125,11 +119,7 @@ func (p *provider) download(w http.ResponseWriter, r *http.Request) { return } if err := repo.ServeFile(w, r, file); err != nil { - if errors.Is(err, os.ErrNotExist) { - http.Error(w, err.Error(), http.StatusNotFound) - return - } - http.Error(w, err.Error(), http.StatusInternalServerError) + repository.Error(w, err) return } } @@ -143,11 +133,7 @@ func (p *provider) delete(w http.ResponseWriter, r *http.Request) { return } if err := repo.Delete(ctx, file); err != nil { - if errors.Is(err, os.ErrNotExist) { - http.Error(w, err.Error(), http.StatusNotFound) - return - } - http.Error(w, err.Error(), http.StatusInternalServerError) + repository.Error(w, err) return } } @@ -161,11 +147,7 @@ func (p *provider) repository(w http.ResponseWriter, r *http.Request) { return } if err := repo.ServeFile(w, r, file); err != nil { - if errors.Is(err, os.ErrNotExist) { - http.Error(w, err.Error(), http.StatusNotFound) - return - } - http.Error(w, err.Error(), http.StatusInternalServerError) + repository.Error(w, err) return } } diff --git a/pkg/repository/oci_repository.go b/pkg/repository/oci_repository.go index 78f9b9f..604197a 100644 --- a/pkg/repository/oci_repository.go +++ b/pkg/repository/oci_repository.go @@ -39,6 +39,7 @@ import ( "oras.land/oras-go/v2/errdef" "oras.land/oras-go/v2/registry/remote" "oras.land/oras-go/v2/registry/remote/auth" + "oras.land/oras-go/v2/registry/remote/errcode" cache2 "go.linka.cloud/artifact-registry/pkg/cache" "go.linka.cloud/artifact-registry/pkg/crypt/aes" @@ -516,3 +517,27 @@ func (s *storage) MediaTypeRegistryLayerMetadata(name string) string { func (s *storage) MediaTypeArtifactLayer() string { return "application/vnd.lk.registry.layer.v1." + s.prov.Name() } + +func IsErrorCode(err error, code string) bool { + var ec errcode.Error + return errors.As(err, &ec) && ec.Code == code +} + +func ErrCode(err error) int { + var ec *errcode.ErrorResponse + if errors.As(err, &ec) { + return ec.StatusCode + } + return http.StatusInternalServerError +} + +func Error(w http.ResponseWriter, err error) { + switch { + case errors.Is(err, os.ErrExist): + http.Error(w, err.Error(), http.StatusConflict) + case errors.Is(err, os.ErrNotExist): + http.Error(w, err.Error(), http.StatusNotFound) + default: + http.Error(w, err.Error(), ErrCode(err)) + } +} diff --git a/pkg/repository/repository.go b/pkg/repository/repository.go index 812a6e7..b4658e4 100644 --- a/pkg/repository/repository.go +++ b/pkg/repository/repository.go @@ -56,7 +56,7 @@ func StorageMiddleware(ar Provider, backend string, key []byte) StorageMiddlewar } repo, err := NewStorage(ctx, backend, name, ar, key) if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) + Error(w, err) return } defer repo.Close()