X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/0dc0c5650ddcd8376aea84d32d2b81b1cdba0946..d13a369065b4e72047c8c267d6ceaa5c84d50c3d:/sdk/go/httpserver/request_limiter.go?ds=sidebyside diff --git a/sdk/go/httpserver/request_limiter.go b/sdk/go/httpserver/request_limiter.go index 178ffb90f4..ee35f4748b 100644 --- a/sdk/go/httpserver/request_limiter.go +++ b/sdk/go/httpserver/request_limiter.go @@ -4,18 +4,42 @@ import ( "net/http" ) +// RequestCounter is an http.Handler that tracks the number of +// requests in progress. +type RequestCounter interface { + http.Handler + + // Current() returns the number of requests in progress. + Current() int + + // Max() returns the maximum number of concurrent requests + // that will be accepted. + Max() int +} + type limiterHandler struct { requests chan struct{} handler http.Handler } -func NewRequestLimiter(maxRequests int, handler http.Handler) http.Handler { +// NewRequestLimiter returns a RequestCounter that delegates up to +// maxRequests at a time to the given handler, and responds 503 to all +// incoming requests beyond that limit. +func NewRequestLimiter(maxRequests int, handler http.Handler) RequestCounter { return &limiterHandler{ requests: make(chan struct{}, maxRequests), handler: handler, } } +func (h *limiterHandler) Current() int { + return len(h.requests) +} + +func (h *limiterHandler) Max() int { + return cap(h.requests) +} + func (h *limiterHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) { select { case h.requests <- struct{}{}: