Files
sub2api/backend/internal/pkg/googleapi/status_test.go
T
feeeei f4f8ff04db fix(gateway): 客户端断开统一标记 499,不再被记成 502/200 上游错误
客户端在响应提交前断开时,只有排队/换号阶段和 OpenAI 的兜底写入会标 499。
Claude 非流式与 Gemini 的 Chat Completions / Messages / Responses 兼容入口
在等待上游时断开,由 GatewayHandler.ensureForwardErrorResponse 补写 502;
Gemini 原生入口什么都不写,落成 200 并被 ops 记成一条 provider 的
"Recovered upstream error";Antigravity 回写 502。这些行都按上游失败计入
SLA 与上游错误数。

- GatewayHandler.ensureForwardErrorResponse 补客户端断开检查,与 OpenAI 版一致
- GatewayHandler 的 Messages / ChatCompletions / Responses 与 Gemini 原生入口:
  首次选号失败时先判断客户端断开;ChatCompletions / Responses 循环开头改用
  failoverClientGone,不再直接 return 落成 200
- Gemini 原生入口:forward 失败时补 499 标记;并发槽错误改走
  concurrencyErrorResponse 统一映射(断开 499、排队满/超时 429、其余 503)
- Antigravity 上游响应前断开回写 499;googleapi 与 Antigravity 的 Google 错误
  格式把 499 映射为 CANCELLED
- OpenAI alpha search 非 failover 错误分支补断开检查
- Claude / Gemini / OpenAI 传输层错误:请求 context 已取消时不记 ops 上游事件
- ops:IgnoreContextCanceled 开启时跳过没有上游错误上下文的 499;带上游错误的
  499(上游失败后客户端没等到换号结果就离开)仍按上游失败落库

计费不变:Gemini 流式中途断开的用量处理不在本次范围。新增 handler/service
单测覆盖各入口的断开场景与 ops 过滤规则。
2026-09-26 17:13:10 +08:00

29 lines
725 B
Go

package googleapi
import (
"net/http"
"testing"
)
func TestHTTPStatusToGoogleStatus(t *testing.T) {
cases := []struct {
status int
want string
}{
{http.StatusBadRequest, "INVALID_ARGUMENT"},
{http.StatusUnauthorized, "UNAUTHENTICATED"},
{http.StatusForbidden, "PERMISSION_DENIED"},
{http.StatusNotFound, "NOT_FOUND"},
{http.StatusTooManyRequests, "RESOURCE_EXHAUSTED"},
{499, "CANCELLED"},
{http.StatusBadGateway, "INTERNAL"},
{http.StatusServiceUnavailable, "INTERNAL"},
{http.StatusConflict, "UNKNOWN"},
}
for _, tc := range cases {
if got := HTTPStatusToGoogleStatus(tc.status); got != tc.want {
t.Errorf("HTTPStatusToGoogleStatus(%d) = %q, want %q", tc.status, got, tc.want)
}
}
}