concurrency_error_response.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. package handler
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "net/http"
  7. )
  8. const statusClientClosedRequest = 499
  9. const (
  10. gatewayQueueFullCode = "gateway_queue_full"
  11. gatewayConcurrencyLimitCode = "gateway_concurrency_limit"
  12. )
  13. func concurrencyErrorResponse(err error, slotType string) (int, string, string, string) {
  14. var waitQueueFullErr *WaitQueueFullError
  15. if errors.As(err, &waitQueueFullErr) {
  16. return http.StatusTooManyRequests, "rate_limit_error", gatewayQueueFullCode,
  17. "Too many pending requests, please retry later"
  18. }
  19. var concurrencyErr *ConcurrencyError
  20. if errors.As(err, &concurrencyErr) {
  21. if concurrencyErr.SlotType != "" {
  22. slotType = concurrencyErr.SlotType
  23. }
  24. return http.StatusTooManyRequests, "rate_limit_error", gatewayConcurrencyLimitCode,
  25. fmt.Sprintf("Concurrency limit exceeded for %s, please retry later", slotType)
  26. }
  27. if errors.Is(err, context.Canceled) {
  28. return statusClientClosedRequest, "api_error", "", "context canceled"
  29. }
  30. return http.StatusServiceUnavailable, "api_error", "", "Service temporarily unavailable, please retry later"
  31. }