diff --git a/handlers_test.go b/handlers_test.go index 5f07184..8f9a37c 100644 --- a/handlers_test.go +++ b/handlers_test.go @@ -57,7 +57,7 @@ func createTemporaryRouter(t *testing.T) (*mux.Router, *rushlink) { fs: fileStore, rootURL: rootURL, } - return CreateMainRouter(&rl), &rl + return CreateMainRouter(&rl, true), &rl } // checkStatusCode checks whether the status code from a recorded response is equal @@ -145,5 +145,17 @@ func TestIssue53(t *testing.T) { } return nil }) - +} + +func TestIssue60(t *testing.T) { + srv, _ := createTemporaryRouter(t) + + // Put a URL with a fragment identifier into the database. + req, err := http.NewRequest("GET", "/css/nonexistent_file.css", nil) + if err != nil { + t.Fatal(err) + } + rr := httptest.NewRecorder() + srv.ServeHTTP(rr, req) + checkStatusCode(t, rr, http.StatusNotFound) } diff --git a/router.go b/router.go index 9def677..d695c12 100644 --- a/router.go +++ b/router.go @@ -33,6 +33,7 @@ func (rl *rushlink) recoveryMiddleware(next http.Handler) http.Handler { defer func() { defer func() { if err := recover(); err != nil { + w.WriteHeader(500) log.Printf("error: panic while recovering from another panic: %v\n", err) debug.PrintStack() fmt.Fprintf(w, "internal server error: %v\n", err) @@ -40,6 +41,7 @@ func (rl *rushlink) recoveryMiddleware(next http.Handler) http.Handler { }() if err := recover(); err != nil { + w.WriteHeader(500) log.Printf("error: %v\n", err) debug.PrintStack() rl.renderInternalServerError(w, r, err) @@ -80,10 +82,12 @@ func (w *statusResponseWriter) WriteHeader(statusCode int) { } // CreateMainRouter creates the main Gorilla router for the application. -func CreateMainRouter(rl *rushlink) *mux.Router { +func CreateMainRouter(rl *rushlink, debug bool) *mux.Router { router := mux.NewRouter() - router.Use(rl.recoveryMiddleware) - router.Use(rl.metricsMiddleware) + if !debug { + router.Use(rl.recoveryMiddleware) + router.Use(rl.metricsMiddleware) + } router.HandleFunc("/{path:img/"+staticFilenameExpr+"}", rl.staticGetHandler).Methods("GET", "HEAD") router.HandleFunc("/{path:css/"+staticFilenameExpr+"}", rl.staticGetHandler).Methods("GET", "HEAD") router.HandleFunc("/{path:js/"+staticFilenameExpr+"}", rl.staticGetHandler).Methods("GET", "HEAD") @@ -119,7 +123,7 @@ func StartMainServer(addr string, db *db.Database, fs *db.FileStore, rawRootURL } srv := &http.Server{ - Handler: CreateMainRouter(&rl), + Handler: CreateMainRouter(&rl, false), Addr: addr, WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second,