summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-11-04 11:19:26 -0500
committerSam Anthony <sam@samanthony.xyz>2024-11-04 11:19:26 -0500
commit05e4bb4caa5a2ad8c23b937553fd9be6f71f24a0 (patch)
treeea1ee139c3a4881e98b6c538ee5e1f3294cad238 /server
parentb0c07e043f055d49f86085c5c521a558ec33f877 (diff)
downloadsoen422-05e4bb4caa5a2ad8c23b937553fd9be6f71f24a0.zip
server: parseQuery()
Diffstat (limited to 'server')
-rw-r--r--server/server.go44
1 files changed, 26 insertions, 18 deletions
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