From 05e4bb4caa5a2ad8c23b937553fd9be6f71f24a0 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Mon, 4 Nov 2024 11:19:26 -0500 Subject: server: parseQuery() --- server/server.go | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) (limited to 'server/server.go') diff --git a/server/server.go b/server/server.go index 7b03003..82cc98d 100644 --- a/server/server.go +++ b/server/server.go @@ -58,39 +58,27 @@ func (h HumidityHandler) get(w http.ResponseWriter, r *http.Request) { } func (h HumidityHandler) post(w http.ResponseWriter, r *http.Request) { - query, err := url.ParseQuery(r.URL.RawQuery) + queryVals, err := parseQuery(r.URL.RawQuery, []string{"room", "humidity"}) if err != nil { log.Println(err) w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "invalid query: %v", err) return } - - room := RoomID(query.Get("room")) - if room == "" { - log.Println(r.Method, r.URL, "missing 'room' in query") - w.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(w, "invalid query: missing key 'room'") - return - } - - humidityStr := query.Get("humidity") - if humidityStr == "" { - log.Println(r.Method, r.URL, "missing 'humidity' in query") - w.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(w, "invalid query: missing key 'humidity'") - return - } + room := RoomID(queryVals["room"]) + humidityStr := queryVals["humidity"] humidity, err := strconv.ParseFloat(humidityStr, 32) if err != nil { + log.Println("Warning: invalid humidity:", err) w.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(w, "invalid humidity: %v", err) + fmt.Fprintf(w, "invalid humidity: '%s'", humidityStr) return } record, ok := h.rooms[room] if !ok { + log.Println("Warning: invalid room:", room) w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "invalid room ID: '%s'", room) return @@ -99,6 +87,26 @@ func (h HumidityHandler) post(w http.ResponseWriter, r *http.Request) { record.put <- Humidity(humidity) } +// Parse the value associated with each key in the query string. Returns a map of +// keys and values, or error if one of the keys is missing, or if there is no value +// associated with one of the keys. +func parseQuery(query string, keys []string) (map[string]string, error) { + queryVals, err := url.ParseQuery(query) + if err != nil { + return nil, err + } + + vals := make(map[string]string) + for _, key := range keys { + val := queryVals.Get(key) + if val == "" { + return nil, fmt.Errorf("missing key '%s'", key) + } + vals[key] = val + } + return vals, nil +} + // Calculate the average humidity in the building. Returns false if there is not enough data available. func (h HumidityHandler) average() (Humidity, bool) { var sum Humidity = 0 -- cgit v1.2.3