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"))