Commit b1e1caba authored by Matthew Holt's avatar Matthew Holt

core: Graceful error handling during heavy load; proper error responses

parent b51e8bc1
......@@ -41,20 +41,27 @@ func (f *fileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er
func (fh *fileHandler) serveFile(w http.ResponseWriter, r *http.Request, name string) (int, error) {
f, err := fh.root.Open(name)
if err != nil {
if os.IsPermission(err) {
if os.IsNotExist(err) {
return http.StatusForbidden, err
}
} else if os.IsPermission(err) {
return http.StatusNotFound, nil
}
// Likely the server is under load and ran out of file descriptors
w.Header().Set("Retry-After", "5") // TODO: 5 seconds enough delay? Or too much?
return http.StatusServiceUnavailable, err
}
defer f.Close()
d, err1 := f.Stat()
if err1 != nil {
if os.IsPermission(err) {
return http.StatusForbidden, err
}
} else if os.IsNotExist(err) {
return http.StatusNotFound, nil
}
// Return a different status code than above so as to distinguish these cases
return http.StatusInternalServerError, err
}
// redirect to canonical path
url := r.URL.Path
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment