/
error_handler.go
40 lines (35 loc) · 1.15 KB
/
error_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package typed
import (
"encoding/json"
"net/http"
)
// ErrorHandler is an interface that can be used to write an error to the response
//
// an ErrorHandler can be passed as an option to NewTypedMethodsHandlerBuilder
//
// The original *http.Request is passed so that responses can be written in the required content type (i.e. according to the `Accept` header)
type ErrorHandler interface {
HandleError(writer http.ResponseWriter, request *http.Request, err error)
}
var defaultErrorHandler ErrorHandler = &errorHandler{}
type errorHandler struct {
}
func (eh *errorHandler) HandleError(writer http.ResponseWriter, request *http.Request, err error) {
sc := http.StatusInternalServerError
if apiErr, ok := err.(ApiError); ok {
sc = defaultStatusCode(apiErr.StatusCode(), sc)
}
if em, ok := err.(json.Marshaler); ok {
if data, mErr := em.MarshalJSON(); mErr == nil {
writer.Header().Set(hdrContentType, contentTypeJson)
writer.WriteHeader(sc)
_, _ = writer.Write(data)
} else {
writer.WriteHeader(sc)
_, _ = writer.Write([]byte(err.Error() + "\n" + mErr.Error()))
}
return
}
writer.WriteHeader(sc)
_, _ = writer.Write([]byte(err.Error()))
}