41 lines
1.2 KiB
Go
41 lines
1.2 KiB
Go
|
package server
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
"net"
|
||
|
"net/http"
|
||
|
|
||
|
"github.com/containous/traefik/middlewares"
|
||
|
)
|
||
|
|
||
|
// RecordingErrorHandler is an error handler, implementing the vulcand/oxy
|
||
|
// error handler interface, which is recording network errors by using the netErrorRecorder.
|
||
|
// In addition it sets a proper HTTP status code and body, depending on the type of error occurred.
|
||
|
type RecordingErrorHandler struct {
|
||
|
netErrorRecorder middlewares.NetErrorRecorder
|
||
|
}
|
||
|
|
||
|
// NewRecordingErrorHandler creates and returns a new instance of RecordingErrorHandler.
|
||
|
func NewRecordingErrorHandler(recorder middlewares.NetErrorRecorder) *RecordingErrorHandler {
|
||
|
return &RecordingErrorHandler{recorder}
|
||
|
}
|
||
|
|
||
|
func (eh *RecordingErrorHandler) ServeHTTP(w http.ResponseWriter, req *http.Request, err error) {
|
||
|
statusCode := http.StatusInternalServerError
|
||
|
|
||
|
if e, ok := err.(net.Error); ok {
|
||
|
eh.netErrorRecorder.Record(req.Context())
|
||
|
if e.Timeout() {
|
||
|
statusCode = http.StatusGatewayTimeout
|
||
|
} else {
|
||
|
statusCode = http.StatusBadGateway
|
||
|
}
|
||
|
} else if err == io.EOF {
|
||
|
eh.netErrorRecorder.Record(req.Context())
|
||
|
statusCode = http.StatusBadGateway
|
||
|
}
|
||
|
|
||
|
w.WriteHeader(statusCode)
|
||
|
w.Write([]byte(http.StatusText(statusCode)))
|
||
|
}
|