// RecoverPanics wraps an http Handler to recover and log panics. func RecoverPanics(handler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { defer func() { if x := recover(); x != nil { http.Error(w, "apis panic. Look in log for details.", http.StatusInternalServerError) glog.Errorf("APIServer panic'd on %v %v: %v\n%s\n", req.Method, req.RequestURI, x, debug.Stack()) } }() defer httplog.NewLogged(req, &w).StacktraceWhen( httplog.StatusIsNot( http.StatusOK, http.StatusCreated, http.StatusAccepted, http.StatusMovedPermanently, http.StatusTemporaryRedirect, http.StatusConflict, http.StatusNotFound, errors.StatusUnprocessableEntity, http.StatusSwitchingProtocols, ), ).Log() // Dispatch to the internal handler handler.ServeHTTP(w, req) }) }
// ServeHTTP responds to HTTP requests on the Qinglet. func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { defer httplog.NewLogged(req, &w).StacktraceWhen( httplog.StatusIsNot( http.StatusOK, http.StatusMovedPermanently, http.StatusTemporaryRedirect, http.StatusNotFound, http.StatusSwitchingProtocols, ), ).Log() s.mux.ServeHTTP(w, req) }