From 99232eb17feba52d648c8453f87069d84a24fc8b Mon Sep 17 00:00:00 2001 From: Luther Wen Xu Date: Sat, 16 May 2020 20:04:47 +0800 Subject: [PATCH] server: Fail early for non-existent service name --- main.go | 6 +++++- server/api.go | 8 ++++++++ server/data.go | 4 +++- server/server.go | 9 ++++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index baa102c..a096bcc 100644 --- a/main.go +++ b/main.go @@ -10,5 +10,9 @@ func main() { panic(err) } go checkLoop(cfg.Targets) - server.StartServer(cfg.Port) + validServices := make([]string, 0, len(cfg.Targets)) + for _, v := range cfg.Targets { + validServices = append(validServices, v.ServiceName) + } + server.StartServer(cfg.Port, validServices) } diff --git a/server/api.go b/server/api.go index 27e558b..4749f78 100644 --- a/server/api.go +++ b/server/api.go @@ -38,6 +38,10 @@ func dayHistory(w http.ResponseWriter, req *http.Request) { return } service_name := keys[0] + if !validTarget[service_name] { + http.Error(w, "Invalid `service_name` requested", http.StatusBadRequest) + return + } keys, ok = req.URL.Query()["interval"] var interval = 5 if len(keys) >= 2 { @@ -89,6 +93,10 @@ func history(w http.ResponseWriter, req *http.Request, dayCount int) { http.Error(w, "Only one `service_name` allowed", http.StatusBadRequest) return } + if !validTarget[keys[0]] { + http.Error(w, "Invalid `service_name` requested", http.StatusBadRequest) + return + } entries := getHistoryDay(keys[0], dayCount) writeJSON(w, entries) } diff --git a/server/data.go b/server/data.go index c165596..b5ec892 100644 --- a/server/data.go +++ b/server/data.go @@ -21,10 +21,12 @@ func getStatus() map[string]db.PingEntry { func getHistoryDay(serviceName string, dayCount int) []stat { currentDay := today() result := make([]stat, 0) - for i := -dayCount + 1; i <= 0; i++ { + for i := 0; i >= -dayCount+1; i-- { dayData := getDay(serviceName, currentDay.AddDate(0, 0, i)) if dayData.SampleCount > 0 { result = append(result, dayData) + } else { + break } } return result diff --git a/server/server.go b/server/server.go index e48984a..0368b28 100644 --- a/server/server.go +++ b/server/server.go @@ -6,6 +6,10 @@ import ( "strconv" ) +var ( + validTarget = make(map[string]bool) +) + func apiEndpoints() { http.HandleFunc("/api/latest", allStatus) http.HandleFunc("/api/history/day", dayHistory) @@ -14,7 +18,10 @@ func apiEndpoints() { http.HandleFunc("/api/history/year", yearHistory) } -func StartServer(port int) { +func StartServer(port int, validTargets []string) { + for _, v := range validTargets { + validTarget[v] = true + } apiEndpoints() err := http.ListenAndServe(":"+strconv.Itoa(port), nil) if err != nil {