mirror of
https://github.com/mickael-kerjean/filestash
synced 2025-12-09 18:03:15 +01:00
56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
// 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)
|
|
}
|