diff --git a/README.md b/README.md index 8eaeb3f..dd1839a 100644 --- a/README.md +++ b/README.md @@ -38,15 +38,16 @@ curl -X PUT -u user:password -d true http://[::1]:8080/state/open The same is true for the endpoints for sensors configured under `"dynamic"`. Currently only the sensors with the `value/unit/location/name/description` schema are implemented. -At the time of writing this includes `temperature`, `barometer`, `humidity`, `beverage_supply`, `power_consumption`, and `account_balance`. -Out-of-spec sensors may be used as well, as long as they share the same schema. +At the time of writing this includes `temperature`, `barometer`, `humidity`, `beverage_supply`, `power_consumption`, +and `account_balance`. +Out-of-spec sensors may also be used as long as they share the same schema. ```shell curl -X PUT -u user:password -d 23.42 http://[::1]:8080/sensors/{temperature,humidity,...}[/location[/name]] ``` As can be seen in the example, the http urls are generated from sensor type and optionally `location` and `name`. -Depending on sensor type, `location` might be required for your sensors, see the schema for details. +Depending on sensor type `location` might be required for your sensors, see the schema for details. ## Building diff --git a/go.mod b/go.mod index 506613d..e3d228e 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module git.hamburg.ccc.de/ccchh/spaceapid -go 1.22 +go 1.21 diff --git a/handlers/util.go b/handlers/util.go index 27c2d9f..890d983 100644 --- a/handlers/util.go +++ b/handlers/util.go @@ -10,7 +10,8 @@ import ( "git.hamburg.ccc.de/ccchh/spaceapid/util" ) -// updateEndpointValidator checks BasicAuth credentials and then returns the request body +// updateEndpointValidator checks BasicAuth credentials, +// checks for correct HTTP method and then returns the request body func updateEndpointValidator( authDB config.HTTPBACredentials, validCredentials []config.HTTPBACredentialID, w http.ResponseWriter, r *http.Request, @@ -23,6 +24,13 @@ func updateEndpointValidator( return []byte{}, errors.New(fmt.Sprintf("Unauthorized request from %s Username: %s Password: %s", r.RemoteAddr, username, password)) } + // Check if PUT method + if r.Method != http.MethodPut { + w.Header().Set("Allow", http.MethodPut) + http.Error(w, "", http.StatusMethodNotAllowed) + return []byte{}, errors.New(fmt.Sprintf("Wrong Method: %s from %s at %s", r.Method, r.RemoteAddr, r.RequestURI)) + } + // Read request body body, err := io.ReadAll(r.Body) if err != nil { diff --git a/main.go b/main.go index 4e16106..8e4b013 100644 --- a/main.go +++ b/main.go @@ -51,20 +51,20 @@ func main() { }(&conf.Response) // Register HTTP handlers - http.HandleFunc("GET /{$}", + http.HandleFunc("/", handlers.Root(&conf.Response), ) - http.HandleFunc("PUT /state/open", + http.HandleFunc("/state/open", handlers.StateOpen(conf.Credentials, conf.Dynamic.State.Open.AllowedCredentials, &conf.Response.State), ) - // Register handler for environmental sensors + // Register handlers for Environmental Sensors for sensorType, envSensorConfigs := range conf.Dynamic.Sensors { for i, envSensorConfig := range envSensorConfigs { - urlPattern := "PUT " + util.GetSensorURLPath( + urlPath := util.GetSensorURLPath( sensorType, envSensorConfig.SensorData.Location, envSensorConfig.SensorData.Name, ) http.HandleFunc( - urlPattern, + urlPath, handlers.EnvironmentSensor( conf.Credentials, envSensorConfig.AllowedCredentials, &conf.Response.Sensors[sensorType][i], ),