upstream_request_id_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package service
  2. import (
  3. "net/http"
  4. "strings"
  5. "testing"
  6. "github.com/stretchr/testify/require"
  7. )
  8. func TestUpstreamRequestIDFromHeaders_UnconfiguredAccountRecordsNothing(t *testing.T) {
  9. h := http.Header{}
  10. h.Set("X-Client-Request-ID", "sub2api-client")
  11. h.Set("X-Request-ID", "sub2api-local")
  12. h.Set("X-Oneapi-Request-Id", "oneapi-1")
  13. h.Set("Request-Id", "req_official")
  14. h.Set("xai-request-id", "xai-1")
  15. h.Set("x-goog-request-id", "goog-1")
  16. require.Equal(t, "", UpstreamRequestIDFromHeaders(nil, h))
  17. for _, platform := range []string{PlatformAnthropic, PlatformOpenAI, PlatformGemini, PlatformAntigravity, PlatformGrok} {
  18. require.Equal(t, "", UpstreamRequestIDFromHeaders(&Account{Platform: platform}, h), platform)
  19. }
  20. blank := &Account{Platform: PlatformOpenAI, Extra: map[string]any{AccountExtraUpstreamRequestIDHeader: " "}}
  21. require.Equal(t, "", UpstreamRequestIDFromHeaders(blank, h))
  22. }
  23. func TestUpstreamRequestIDFromHeaders_ReadsOnlyConfiguredHeader(t *testing.T) {
  24. account := &Account{
  25. Platform: PlatformOpenAI,
  26. Extra: map[string]any{AccountExtraUpstreamRequestIDHeader: " x-oneapi-request-id "},
  27. }
  28. h := http.Header{}
  29. h.Set("X-Request-ID", "passthrough-from-real-upstream")
  30. require.Equal(t, "", UpstreamRequestIDFromHeaders(account, h))
  31. h.Set("X-Oneapi-Request-Id", " oneapi-2 ")
  32. require.Equal(t, "oneapi-2", UpstreamRequestIDFromHeaders(account, h))
  33. require.Equal(t, "", UpstreamRequestIDFromHeaders(account, nil))
  34. official := &Account{Platform: PlatformAnthropic, Extra: map[string]any{AccountExtraUpstreamRequestIDHeader: "request-id"}}
  35. only := http.Header{}
  36. only.Set("Request-Id", "req_official")
  37. require.Equal(t, "req_official", UpstreamRequestIDFromHeaders(official, only))
  38. }
  39. func TestUsageUpstreamRequestIDPtr(t *testing.T) {
  40. account := &Account{Extra: map[string]any{AccountExtraUpstreamRequestIDHeader: "X-Request-ID"}}
  41. h := http.Header{}
  42. h.Set("X-Request-ID", strings.Repeat("a", 200))
  43. require.Nil(t, usageUpstreamRequestIDPtr(account, h, true))
  44. require.Nil(t, usageUpstreamRequestIDPtr(account, http.Header{}, false))
  45. require.Nil(t, usageUpstreamRequestIDPtr(nil, h, false))
  46. require.Nil(t, usageUpstreamRequestIDPtr(&Account{}, h, false))
  47. got := usageUpstreamRequestIDPtr(account, h, false)
  48. require.NotNil(t, got)
  49. require.Len(t, *got, maxUsageUpstreamRequestIDLen)
  50. }
  51. func TestValidateUpstreamRequestIDHeaderExtra(t *testing.T) {
  52. require.NoError(t, ValidateUpstreamRequestIDHeaderExtra(nil))
  53. require.NoError(t, ValidateUpstreamRequestIDHeaderExtra(map[string]any{}))
  54. blank := map[string]any{AccountExtraUpstreamRequestIDHeader: " "}
  55. require.NoError(t, ValidateUpstreamRequestIDHeaderExtra(blank))
  56. _, present := blank[AccountExtraUpstreamRequestIDHeader]
  57. require.False(t, present, "blank header name must be removed")
  58. valid := map[string]any{AccountExtraUpstreamRequestIDHeader: " X-Oneapi-Request-Id "}
  59. require.NoError(t, ValidateUpstreamRequestIDHeaderExtra(valid))
  60. require.Equal(t, "X-Oneapi-Request-Id", valid[AccountExtraUpstreamRequestIDHeader])
  61. require.Error(t, ValidateUpstreamRequestIDHeaderExtra(map[string]any{AccountExtraUpstreamRequestIDHeader: 1}))
  62. require.Error(t, ValidateUpstreamRequestIDHeaderExtra(map[string]any{AccountExtraUpstreamRequestIDHeader: "X Request Id"}))
  63. require.Error(t, ValidateUpstreamRequestIDHeaderExtra(map[string]any{AccountExtraUpstreamRequestIDHeader: "X-Request-Id:"}))
  64. require.Error(t, ValidateUpstreamRequestIDHeaderExtra(map[string]any{AccountExtraUpstreamRequestIDHeader: strings.Repeat("x", 65)}))
  65. }