diff --git a/pkg/gateway/endpoints/filters/upstreaminfo.go b/pkg/gateway/endpoints/filters/upstreaminfo.go index 110c2ca..fa5b09d 100644 --- a/pkg/gateway/endpoints/filters/upstreaminfo.go +++ b/pkg/gateway/endpoints/filters/upstreaminfo.go @@ -55,7 +55,7 @@ func WithUpstreamInfo(handler http.Handler, clusterManager clusters.Manager, s r } if cluster.FeatureEnabled(features.DenyAllRequests) { - response.TerminateWithError(s, errors.NewServiceUnavailable(fmt.Sprintf("request for %v denied by featureGate(DenyAllRequests)", info.Hostname)), + response.TerminateWithError(s, errors.NewTooManyRequests(fmt.Sprintf("request for %v denied by featureGate(DenyAllRequests)", info.Hostname), 0), response.TerminationReasonCircuitBreaker, w, req) return } diff --git a/pkg/gateway/endpoints/response/termination.go b/pkg/gateway/endpoints/response/termination.go index 572e9e4..a737cbc 100644 --- a/pkg/gateway/endpoints/response/termination.go +++ b/pkg/gateway/endpoints/response/termination.go @@ -28,7 +28,7 @@ import ( const ( RetryAfter = 1 - UnavailableRetryAfter = 30 + UnavailableRetryAfter = 60 TerminationReasonRateLimited = "rate_limited" @@ -38,7 +38,10 @@ const ( func TerminateWithError(codecs runtime.NegotiatedSerializer, err *errors.StatusError, reason string, w http.ResponseWriter, req *http.Request) { if errors.IsTooManyRequests(err) { - w.Header().Set("Retry-After", strconv.Itoa(RetryAfter)) + retryAfter, ok := errors.SuggestsClientDelay(err) + if ok { + w.Header().Set("Retry-After", strconv.Itoa(retryAfter)) + } } else if errors.IsServiceUnavailable(err) { w.Header().Set("Retry-After", strconv.Itoa(UnavailableRetryAfter)) } diff --git a/pkg/gateway/proxy/dispatcher/dispatcher.go b/pkg/gateway/proxy/dispatcher/dispatcher.go index 240c015..cda2413 100644 --- a/pkg/gateway/proxy/dispatcher/dispatcher.go +++ b/pkg/gateway/proxy/dispatcher/dispatcher.go @@ -93,7 +93,11 @@ func (d *dispatcher) ServeHTTP(w http.ResponseWriter, req *http.Request) { if !flowcontrol.TryAcquire() { //TODO: exempt master request and long running request // add metrics - d.responseError(errors.NewTooManyRequests(fmt.Sprintf("too many requests for cluster(%s), limited by flowControl(%v)", extraInfo.Hostname, flowcontrol.String()), response.RetryAfter), w, req, statusReasonRateLimited) + retryAfter := 0 + if requestAttributes.GetResource() != "events" { + retryAfter = response.RetryAfter + } + d.responseError(errors.NewTooManyRequests(fmt.Sprintf("too many requests for cluster(%s), limited by flowControl(%v)", extraInfo.Hostname, flowcontrol.String()), retryAfter), w, req, statusReasonRateLimited) return } defer flowcontrol.Release()