
Docker registries return errors in a know format so this change now checks for these errors and returns the message field. If the error is not in the expected format fall back to the original behaviour. https://github.com/containerd/containerd/issues/3076 Signed-off-by: Jack Baines <jack.baines@uk.ibm.com>
41 lines
950 B
Go
41 lines
950 B
Go
package errcode
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
)
|
|
|
|
// ServeJSON attempts to serve the errcode in a JSON envelope. It marshals err
|
|
// and sets the content-type header to 'application/json'. It will handle
|
|
// ErrorCoder and Errors, and if necessary will create an envelope.
|
|
func ServeJSON(w http.ResponseWriter, err error) error {
|
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
|
var sc int
|
|
|
|
switch errs := err.(type) {
|
|
case Errors:
|
|
if len(errs) < 1 {
|
|
break
|
|
}
|
|
|
|
if err, ok := errs[0].(ErrorCoder); ok {
|
|
sc = err.ErrorCode().Descriptor().HTTPStatusCode
|
|
}
|
|
case ErrorCoder:
|
|
sc = errs.ErrorCode().Descriptor().HTTPStatusCode
|
|
err = Errors{err} // create an envelope.
|
|
default:
|
|
// We just have an unhandled error type, so just place in an envelope
|
|
// and move along.
|
|
err = Errors{err}
|
|
}
|
|
|
|
if sc == 0 {
|
|
sc = http.StatusInternalServerError
|
|
}
|
|
|
|
w.WriteHeader(sc)
|
|
|
|
return json.NewEncoder(w).Encode(err)
|
|
}
|