Initial QSfera import
This commit is contained in:
+56
@@ -0,0 +1,56 @@
|
||||
// Package httperr implements an error object that speaks HTTP.
|
||||
package httperr
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
|
||||
pkgerrors "github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type statusCodeAndTexter interface {
|
||||
StatusCodeAndText() (int, string)
|
||||
}
|
||||
|
||||
// StatusCodeAndText returns the status code and text of the error
|
||||
func StatusCodeAndText(err error) (int, string) {
|
||||
if err == nil {
|
||||
return http.StatusOK, http.StatusText(http.StatusOK)
|
||||
}
|
||||
|
||||
err = pkgerrors.Cause(err)
|
||||
|
||||
var scater statusCodeAndTexter
|
||||
if errors.As(err, &scater) {
|
||||
return scater.StatusCodeAndText()
|
||||
}
|
||||
|
||||
return http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
// Writer is an interface for things that know how to write themselves
|
||||
// to an error response. This interface is implemented by Private and
|
||||
// Public to provide default error pages.
|
||||
type Writer interface {
|
||||
error
|
||||
WriteError(w http.ResponseWriter, r *http.Request)
|
||||
}
|
||||
|
||||
// Write writes the specified error to w. If err is a Writer, then
|
||||
// it's WriteError method is invoked to produce the response.
|
||||
// Otherwise a generic "500 Internal Server Error" is written.
|
||||
func Write(w http.ResponseWriter, r *http.Request, err error) {
|
||||
err = pkgerrors.Cause(err)
|
||||
|
||||
var errWriter Writer
|
||||
if errors.As(err, &errWriter) {
|
||||
errWriter.WriteError(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
genericErr := Value{
|
||||
Err: err,
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
}
|
||||
genericErr.WriteError(w, r)
|
||||
}
|
||||
Reference in New Issue
Block a user