diff --git a/go.mod b/go.mod index b93e7bf..c00e277 100644 --- a/go.mod +++ b/go.mod @@ -11,11 +11,13 @@ require ( github.com/KyleBanks/depth v1.2.1 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/didip/tollbooth/v7 v7.0.2 // indirect github.com/flowchartsman/swaggerui v0.0.0-20221017034628-909ed4f3701b // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.19.6 // indirect github.com/go-openapi/spec v0.20.4 // indirect github.com/go-openapi/swag v0.19.15 // indirect + github.com/go-pkgz/expirable-cache/v3 v3.0.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect diff --git a/go.sum b/go.sum index a60e005..1fa66f6 100644 --- a/go.sum +++ b/go.sum @@ -7,6 +7,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/didip/tollbooth/v7 v7.0.2 h1:WYEfusYI6g64cN0qbZgekDrYfuYBZjUZd5+RlWi69p4= +github.com/didip/tollbooth/v7 v7.0.2/go.mod h1:RtRYfEmFGX70+ike5kSndSvLtQ3+F2EAmTI4Un/VXNc= github.com/flowchartsman/swaggerui v0.0.0-20221017034628-909ed4f3701b h1:oy54yVy300Db264NfQCJubZHpJOl+SoT6udALQdFbSI= github.com/flowchartsman/swaggerui v0.0.0-20221017034628-909ed4f3701b/go.mod h1:/RJwPD5L4xWgCbqQ1L5cB12ndgfKKT54n9cZFf+8pus= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -19,6 +21,8 @@ github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-pkgz/expirable-cache/v3 v3.0.0 h1:u3/gcu3sabLYiTCevoRKv+WzjIn5oo7P8XtiXBeRDLw= +github.com/go-pkgz/expirable-cache/v3 v3.0.0/go.mod h1:2OQiDyEGQalYecLWmXprm3maPXeVb5/6/X7yRPYTzec= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= diff --git a/main.go b/main.go index 1eff753..fcc3804 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( _ "embed" + "encoding/json" "errors" "flag" "fmt" @@ -16,6 +17,8 @@ import ( _ "github.com/justinfarrelldev/open-ctp-server/docs" "github.com/flowchartsman/swaggerui" + + "github.com/didip/tollbooth/v7" ) // @title Open Call to Power Server @@ -27,6 +30,11 @@ import ( type Server struct { } +type Message struct { + Status string `json:"status"` + Body string `json:"body"` +} + var ( port = 9000 sleep = flag.Duration("sleep", time.Second*5, "duration between changes in health") @@ -39,10 +47,20 @@ var spec []byte func main() { + message := Message{ + Status: "Request Failed", + Body: "The API is at capacity, try again later.", + } + jsonMessage, _ := json.Marshal(message) + + tollboothLimiter := tollbooth.NewLimiter(5, nil) + tollboothLimiter.SetMessageContentType("application/json") + tollboothLimiter.SetMessage(string(jsonMessage)) + mux := http.NewServeMux() - mux.HandleFunc("/game/create_game", game.GameHandler) - mux.HandleFunc("/health", health.HealthCheckHandler) + mux.Handle("/game/create_game", tollbooth.LimitFuncHandler(tollboothLimiter, game.GameHandler)) + mux.Handle("/health", tollbooth.LimitFuncHandler(tollboothLimiter, health.HealthCheckHandler)) mux.Handle("/docs/", http.StripPrefix("/docs", swaggerui.Handler(spec))) fmt.Printf("\nNow serving on port %d\n", port)