Adds Panic Recover middleware
Signed-off-by: Emile Vauge <emile@vauge.com>
This commit is contained in:
parent
71cec1580b
commit
111251da05
2 changed files with 33 additions and 1 deletions
32
middlewares/recover.go
Normal file
32
middlewares/recover.go
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
package middlewares
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/codegangsta/negroni"
|
||||||
|
"github.com/containous/traefik/log"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RecoverHandler recovers from a panic in http handlers
|
||||||
|
func RecoverHandler(next http.Handler) http.Handler {
|
||||||
|
fn := func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
defer recoverFunc(w)
|
||||||
|
next.ServeHTTP(w, r)
|
||||||
|
}
|
||||||
|
return http.HandlerFunc(fn)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NegroniRecoverHandler recovers from a panic in negroni handlers
|
||||||
|
func NegroniRecoverHandler() negroni.Handler {
|
||||||
|
fn := func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
|
||||||
|
defer recoverFunc(w)
|
||||||
|
next.ServeHTTP(w, r)
|
||||||
|
}
|
||||||
|
return negroni.HandlerFunc(fn)
|
||||||
|
}
|
||||||
|
|
||||||
|
func recoverFunc(w http.ResponseWriter) {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
log.Errorf("Recovered from panic in http handler: %+v", err)
|
||||||
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
}
|
|
@ -173,7 +173,7 @@ func (server *Server) startHTTPServers() {
|
||||||
server.serverEntryPoints = server.buildEntryPoints(server.globalConfiguration)
|
server.serverEntryPoints = server.buildEntryPoints(server.globalConfiguration)
|
||||||
|
|
||||||
for newServerEntryPointName, newServerEntryPoint := range server.serverEntryPoints {
|
for newServerEntryPointName, newServerEntryPoint := range server.serverEntryPoints {
|
||||||
serverMiddlewares := []negroni.Handler{server.loggerMiddleware, metrics}
|
serverMiddlewares := []negroni.Handler{middlewares.NegroniRecoverHandler(), server.loggerMiddleware, metrics}
|
||||||
if server.globalConfiguration.Web != nil && server.globalConfiguration.Web.Metrics != nil {
|
if server.globalConfiguration.Web != nil && server.globalConfiguration.Web.Metrics != nil {
|
||||||
if server.globalConfiguration.Web.Metrics.Prometheus != nil {
|
if server.globalConfiguration.Web.Metrics.Prometheus != nil {
|
||||||
metricsMiddleware := middlewares.NewMetricsWrapper(middlewares.NewPrometheus(newServerEntryPointName, server.globalConfiguration.Web.Metrics.Prometheus))
|
metricsMiddleware := middlewares.NewMetricsWrapper(middlewares.NewPrometheus(newServerEntryPointName, server.globalConfiguration.Web.Metrics.Prometheus))
|
||||||
|
|
Loading…
Reference in a new issue