Allow internal server error using panic()

This commit is contained in:
Daan Sprenkels
2019-10-15 23:19:45 +02:00
parent 0ecdaafe2f
commit e193183f86
7 changed files with 43 additions and 22 deletions

View File

@@ -84,8 +84,7 @@ func viewPasteHandlerInner(w http.ResponseWriter, r *http.Request, flags viewPas
p, err = getPaste(tx, key)
return err
}); err != nil {
log.Printf("error: %v\n", err)
renderInternalServerError(w, r, err)
panic(err)
return
}
if p == nil {
@@ -124,9 +123,7 @@ func viewPasteHandlerInner(w http.ResponseWriter, r *http.Request, flags viewPas
rawurl := string(p.Content)
urlParse, err := url.Parse(rawurl)
if err != nil {
log.Printf("error: invalid URL ('%v') in database for key '%v': %v\n", rawurl, p.Key, err)
renderInternalServerError(w, r, "invalid url in database")
return
panic(errors.Wrapf(err, "invalid URL ('%v') in database for key '%v'", rawurl, p.Key))
}
http.Redirect(w, r, urlParse.String(), http.StatusSeeOther)
}
@@ -134,17 +131,13 @@ func viewPasteHandlerInner(w http.ResponseWriter, r *http.Request, flags viewPas
case stateDeleted:
renderError(w, r, http.StatusGone, "paste has been deleted")
default:
log.Printf("error: invalid paste.State (%v) for key '%v'\n", p.State, p.Key)
msg := fmt.Sprintf("internal server error: invalid paste.State (%v\n)", p.State)
renderInternalServerError(w, r, msg)
panic(errors.Errorf("invalid paste.State (%v) for key '%v'", p.State, p.Key))
}
}
func newPasteHandler(w http.ResponseWriter, r *http.Request) {
if err := r.ParseMultipartForm(50 * 1000 * 1000); err != nil {
log.Printf("error: %v\n", err)
renderInternalServerError(w, r, err)
return
panic(err)
}
// Determine what kind of post this is, currently only `shorten=...`
@@ -189,9 +182,7 @@ func newRedirectPasteHandler(w http.ResponseWriter, r *http.Request) {
paste, err = shortenURL(tx, userURL)
return err
}); err != nil {
log.Printf("error: %v\n", err)
renderInternalServerError(w, r, err)
return
panic(err)
}
data := map[string]interface{}{"Paste": paste}
render(w, r, "newRedirectPasteSuccess", data)

View File

@@ -1,6 +1,7 @@
package handlers
import (
"fmt"
"log"
"net/http"
"time"
@@ -8,9 +9,29 @@ import (
"github.com/gorilla/mux"
)
func recoveryMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
defer func() {
if err := recover(); err != nil {
log.Printf("error: panic while recovering from another panic: %v\n", err)
fmt.Fprintf(w, "internal server error: %v\n", err)
}
}()
if err := recover(); err != nil {
log.Printf("error: %v\n", err)
renderInternalServerError(w, r, err)
}
}()
next.ServeHTTP(w, r)
})
}
func StartMainServer() {
// Initialize Gorilla router
router := mux.NewRouter()
router.Use(recoveryMiddleware)
router.HandleFunc("/", indexGetHandler).Methods("GET")
router.HandleFunc("/", newPasteHandler).Methods("POST")
router.HandleFunc("/{key:[A-Za-z0-9-_]{4,}}", viewPasteHandler).Methods("GET")

View File

@@ -40,14 +40,20 @@ func init() {
for _, tmplPath := range AssetNames() {
if mustMatch("templates/txt/*.txt.tmpl", tmplPath) {
base := text.Must(textBaseTemplate.Clone())
tmpl := text.Must(base.Parse(string(MustAsset(tmplPath))))
tmpl, err := base.Parse(string(MustAsset(tmplPath)))
if err != nil {
panic(errors.Wrapf(err, "parsing %v", tmplPath))
}
tmplName := strings.TrimSuffix(filepath.Base(tmplPath), ".txt.tmpl")
textTemplates[tmplName] = tmpl
continue
}
if mustMatch("templates/html/*.html.tmpl", tmplPath) {
base := html.Must(htmlBaseTemplate.Clone())
tmpl := html.Must(base.Parse(string(MustAsset(tmplPath))))
tmpl, err := base.Parse(string(MustAsset(tmplPath)))
if err != nil {
panic(errors.Wrapf(err, "parsing %v", tmplPath))
}
tmplName := strings.TrimSuffix(filepath.Base(tmplPath), ".html.tmpl")
htmlTemplates[tmplName] = tmpl
continue