From 0af44ce4c2e97da35b853f3e96d91aee6e724ab9 Mon Sep 17 00:00:00 2001 From: deqiying Date: Fri, 22 May 2026 23:28:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8F=8D=E4=BB=A3?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E4=B8=8B=E6=8B=92=E7=BB=9D=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=20IP=20=E4=B8=8D=E5=87=86=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 OpenAI codex_cli_only 拒绝诊断日志中的 request_client_ip 改为复用 ip.GetClientIP,与 usage 记录和 access log 的真实客户端 IP 解析逻辑保持一致。 保留 request_remote_addr 用于排查底层 Docker/反代 peer 地址,并补充 单元测试覆盖反代头与 remote addr 分离的场景。 --- backend/internal/service/openai_gateway_service.go | 3 ++- .../service/openai_gateway_service_codex_cli_only_test.go | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/internal/service/openai_gateway_service.go b/backend/internal/service/openai_gateway_service.go index f13c4748..5faf33d9 100644 --- a/backend/internal/service/openai_gateway_service.go +++ b/backend/internal/service/openai_gateway_service.go @@ -22,6 +22,7 @@ import ( "github.com/Wei-Shaw/sub2api/internal/config" "github.com/Wei-Shaw/sub2api/internal/pkg/apicompat" + "github.com/Wei-Shaw/sub2api/internal/pkg/ip" "github.com/Wei-Shaw/sub2api/internal/pkg/logger" "github.com/Wei-Shaw/sub2api/internal/pkg/openai" "github.com/Wei-Shaw/sub2api/internal/pkg/openai_compat" @@ -962,7 +963,7 @@ func appendCodexCLIOnlyRejectedRequestFields(fields []zap.Field, c *gin.Context, zap.String("request_path", strings.TrimSpace(req.URL.Path)), zap.String("request_query", strings.TrimSpace(req.URL.RawQuery)), zap.String("request_host", strings.TrimSpace(req.Host)), - zap.String("request_client_ip", strings.TrimSpace(c.ClientIP())), + zap.String("request_client_ip", strings.TrimSpace(ip.GetClientIP(c))), zap.String("request_remote_addr", strings.TrimSpace(req.RemoteAddr)), zap.String("request_user_agent", strings.TrimSpace(req.Header.Get("User-Agent"))), zap.String("request_content_type", strings.TrimSpace(req.Header.Get("Content-Type"))), diff --git a/backend/internal/service/openai_gateway_service_codex_cli_only_test.go b/backend/internal/service/openai_gateway_service_codex_cli_only_test.go index 951860cd..17a874ea 100644 --- a/backend/internal/service/openai_gateway_service_codex_cli_only_test.go +++ b/backend/internal/service/openai_gateway_service_codex_cli_only_test.go @@ -131,8 +131,10 @@ func TestLogCodexCLIOnlyDetection_RejectedIncludesRequestDetails(t *testing.T) { rec := httptest.NewRecorder() c, _ := gin.CreateTestContext(rec) c.Request = httptest.NewRequest(http.MethodPost, "/v1/responses?trace=1", bytes.NewReader(nil)) + c.Request.RemoteAddr = "172.18.0.1:54321" c.Request.Header.Set("User-Agent", "codex_cli_rs/0.98.0 (Windows 10.0.19045; x86_64) unknown") c.Request.Header.Set("Content-Type", "application/json") + c.Request.Header.Set("X-Real-IP", "203.0.113.42") c.Request.Header.Set("OpenAI-Beta", "assistants=v2") body := []byte(`{"model":"gpt-5.2","stream":false,"prompt_cache_key":"pc-123","access_token":"secret-token","input":[{"type":"text","text":"hello"}]}`) @@ -146,6 +148,8 @@ func TestLogCodexCLIOnlyDetection_RejectedIncludesRequestDetails(t *testing.T) { require.True(t, logSink.ContainsFieldValue("request_user_agent", "codex_cli_rs/0.98.0 (Windows 10.0.19045; x86_64) unknown")) require.True(t, logSink.ContainsFieldValue("request_model", "gpt-5.2")) require.True(t, logSink.ContainsFieldValue("request_query", "trace=1")) + require.True(t, logSink.ContainsFieldValue("request_client_ip", "203.0.113.42")) + require.True(t, logSink.ContainsFieldValue("request_remote_addr", "172.18.0.1:54321")) require.True(t, logSink.ContainsFieldValue("request_prompt_cache_key_sha256", hashSensitiveValueForLog("pc-123"))) require.True(t, logSink.ContainsFieldValue("request_headers", "openai-beta")) require.True(t, logSink.ContainsField("request_body_size"))