This repository was archived by the owner on Nov 6, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy patherror_handler.go
More file actions
53 lines (41 loc) · 1.43 KB
/
error_handler.go
File metadata and controls
53 lines (41 loc) · 1.43 KB
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
41
42
43
44
45
46
47
48
49
50
51
52
53
package webmux
import (
"errors"
"log"
"net/http"
)
// ErrorHandler handles errors that arise while handling http requests.
type ErrorHandler interface {
ErrorHTTP(w http.ResponseWriter, r *http.Request, err error)
}
// The ErrorHandlerFunc type is an adapter to allow functions to be used as
// HTTP error handlers.
type ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error)
// ErrorHTTP calls f(w, err, code).
func (f ErrorHandlerFunc) ErrorHTTP(w http.ResponseWriter, r *http.Request, err error) {
f(w, r, err)
}
// StatusErrorHandler returns a basic error handler that just returns a HTTP status error response.
// Any errors are logged before writing the response.
func StatusErrorHandler() ErrorHandler {
return ErrorHandlerFunc(StatusError)
}
// StatusError replies to a request with an appropriate status code and HTTP status text.
func StatusError(w http.ResponseWriter, r *http.Request, err error) {
if errors.Is(err, ErrMuxNotFound) {
match, ok := FromContext(r.Context())
if !ok {
writeError(w, http.StatusNotFound)
return
}
w.Header().Add("Allow", match.Methods().String())
writeError(w, http.StatusMethodNotAllowed)
return
}
log.Printf("mux error: %s", err.Error())
writeError(w, http.StatusInternalServerError)
}
// writeError calls [http.Error] with the [http.StatusText] for code and code.
func writeError(w http.ResponseWriter, code int) {
http.Error(w, http.StatusText(code), code)
}