Fix error handling in renderStatic #64

Merged
electricdusk merged 2 commits from issue-60 into master 2020-07-06 17:05:00 +02:00
3 changed files with 21 additions and 11 deletions
Showing only changes of commit d37222f82a - Show all commits

View File

@ -57,7 +57,7 @@ func createTemporaryRouter(t *testing.T) (*mux.Router, *rushlink) {
fs: fileStore, fs: fileStore,
rootURL: rootURL, rootURL: rootURL,
} }
return CreateMainRouter(&rl, true), &rl return CreateMainRouter(&rl), &rl
} }
// checkStatusCode checks whether the status code from a recorded response is equal // checkStatusCode checks whether the status code from a recorded response is equal
@ -150,7 +150,7 @@ func TestIssue53(t *testing.T) {
func TestIssue60(t *testing.T) { func TestIssue60(t *testing.T) {
srv, _ := createTemporaryRouter(t) srv, _ := createTemporaryRouter(t)
// Put a URL with a fragment identifier into the database. // Request a nonexistent static file
req, err := http.NewRequest("GET", "/css/nonexistent_file.css", nil) req, err := http.NewRequest("GET", "/css/nonexistent_file.css", nil)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)

View File

@ -82,12 +82,13 @@ func (w *statusResponseWriter) WriteHeader(statusCode int) {
} }
// CreateMainRouter creates the main Gorilla router for the application. // CreateMainRouter creates the main Gorilla router for the application.
func CreateMainRouter(rl *rushlink, debug bool) *mux.Router { //
// This function will not populate the router with an error-recovery and
// metrics-reporting middleware. If these middleware are required, then the
// caller should encapsulate this router inside of another router and register
// the middlewares on the encapsulating router.
func CreateMainRouter(rl *rushlink) *mux.Router {
router := mux.NewRouter() router := mux.NewRouter()
if !debug {
router.Use(rl.recoveryMiddleware)
router.Use(rl.metricsMiddleware)
}
router.HandleFunc("/{path:img/"+staticFilenameExpr+"}", rl.staticGetHandler).Methods("GET", "HEAD") router.HandleFunc("/{path:img/"+staticFilenameExpr+"}", rl.staticGetHandler).Methods("GET", "HEAD")
router.HandleFunc("/{path:css/"+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") router.HandleFunc("/{path:js/"+staticFilenameExpr+"}", rl.staticGetHandler).Methods("GET", "HEAD")
@ -122,8 +123,13 @@ func StartMainServer(addr string, db *db.Database, fs *db.FileStore, rawRootURL
rootURL: rootURL, rootURL: rootURL,
} }
router := mux.NewRouter()
router.Use(rl.metricsMiddleware)
router.Use(rl.recoveryMiddleware)
router.Handle("/", CreateMainRouter(&rl))
srv := &http.Server{ srv := &http.Server{
Handler: CreateMainRouter(&rl, false), Handler: router,
Addr: addr, Addr: addr,
WriteTimeout: 15 * time.Second, WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second,

View File

@ -88,7 +88,7 @@ func mapExtend(m map[string]interface{}, key string, value interface{}) {
func (rl *rushlink) renderStatic(w http.ResponseWriter, r *http.Request, path string) { func (rl *rushlink) renderStatic(w http.ResponseWriter, r *http.Request, path string) {
var modTime time.Time var modTime time.Time
if info, err := AssetInfo(path); err != nil { if info, err := AssetInfo(path); err == nil {
modTime = info.ModTime() modTime = info.ModTime()
} }
contents, err := Asset(path) contents, err := Asset(path)
@ -118,7 +118,12 @@ func (rl *rushlink) render(w http.ResponseWriter, r *http.Request, status int, t
err = fmt.Errorf("'%v' not in textTemplates", tmplName) err = fmt.Errorf("'%v' not in textTemplates", tmplName)
break break
} }
if status != 0 {
w.WriteHeader(status)
}
if r.Method != "HEAD" {
err = tmpl.Execute(w, data) err = tmpl.Execute(w, data)
}
case "text/html": case "text/html":
w.Header().Set("Content-Type", "text/html") w.Header().Set("Content-Type", "text/html")
tmpl := htmlTemplates[tmplName] tmpl := htmlTemplates[tmplName]
@ -142,7 +147,6 @@ func (rl *rushlink) render(w http.ResponseWriter, r *http.Request, status int, t
if status != 0 { if status != 0 {
w.WriteHeader(status) w.WriteHeader(status)
} }
if r.Method != "HEAD" { if r.Method != "HEAD" {
err = tmpl.Execute(w, data) err = tmpl.Execute(w, data)
} }