From ea5ad4a725fedb069a1235a17bdb2fc45a20a64e Mon Sep 17 00:00:00 2001 From: Juliusz Chroboczek Date: Wed, 13 Aug 2025 14:32:33 +0200 Subject: [PATCH] Improve error handling in web server. --- webserver/api.go | 23 ++++++++++++++++++++--- webserver/webserver.go | 21 +++++++++++---------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/webserver/api.go b/webserver/api.go index 59a3217..30da61a 100644 --- a/webserver/api.go +++ b/webserver/api.go @@ -37,17 +37,34 @@ func checkAdmin(w http.ResponseWriter, r *http.Request) bool { func checkPasswordAdmin(w http.ResponseWriter, r *http.Request, groupname, user string, wildcard bool) bool { username, password, ok := r.BasicAuth() if ok { - ok, _ := adminMatch(username, password) + ok, err := adminMatch(username, password) + if err != nil { + internalError(w, "Admin match: %v", err) + return false + } if ok { return true } } if ok && !wildcard && username == user { desc, err := group.GetDescription(groupname) - if err == nil && desc.Users != nil { + if err != nil { + internalError(w, + "Get description for group %v: %v", + groupname, err, + ) + return false + } + if desc.Users != nil { u, ok := desc.Users[user] if ok { - ok, _ := u.Password.Match(password) + ok, err := u.Password.Match(password) + if err != nil { + internalError(w, + "Password match: %v", err, + ) + return false + } if ok { return true } diff --git a/webserver/webserver.go b/webserver/webserver.go index 8324f0d..83c27df 100644 --- a/webserver/webserver.go +++ b/webserver/webserver.go @@ -118,6 +118,11 @@ func notFound(w http.ResponseWriter) { io.Copy(w, f) } +func internalError(w http.ResponseWriter, format string, args ...any) { + log.Printf(format, args...) + http.Error(w, "Internal server error", http.StatusInternalServerError) +} + var ErrIsDirectory = errors.New("is a directory") func httpError(w http.ResponseWriter, err error) { @@ -141,13 +146,11 @@ func httpError(w http.ResponseWriter, err error) { http.StatusRequestEntityTooLarge) return } - log.Printf("HTTP server error: %v", err) - http.Error(w, "Internal server error", - http.StatusInternalServerError) + internalError(w, "HTTP server error: %v", err) } func methodNotAllowed(w http.ResponseWriter, methods string) { - w.Header().Set("Allow", "OPTIONS, " + methods) + w.Header().Set("Allow", "OPTIONS, "+methods) http.Error(w, "method not allowed", http.StatusMethodNotAllowed) } @@ -409,8 +412,8 @@ func baseURL(r *http.Request) (*url.URL, error) { func groupStatusHandler(w http.ResponseWriter, r *http.Request) { pth, kind, rest := splitPath(r.URL.Path) if kind != ".status" || rest != "" { - http.Error(w, "Internal server error", - http.StatusInternalServerError) + internalError(w, "groupStatusHandler: this shouldn't happen") + return } name := parseGroupName("/group/", pth) if name == "" { @@ -426,9 +429,7 @@ func groupStatusHandler(w http.ResponseWriter, r *http.Request) { base, err := baseURL(r) if err != nil { - log.Printf("Parse ProxyURL: %v", err) - http.Error(w, "Internal server error", - http.StatusInternalServerError) + internalError(w, "Parse ProxyURL: %v", err) return } d := g.Status(false, base) @@ -574,7 +575,7 @@ func recordingsHandler(w http.ResponseWriter, r *http.Request) { } if len(r.URL.Path) < 12 || r.URL.Path[:12] != "/recordings/" { - http.Error(w, "server error", http.StatusInternalServerError) + internalError(w, "reconrdingsHandler: this shouldn't happen") return }