mirror of
https://github.com/router-for-me/CLIProxyAPIPlus.git
synced 2026-04-26 15:05:17 +00:00
Merge pull request #2468 from router-for-me/ip
fix(openai): improve client IP retrieval in websocket handler
This commit is contained in:
@@ -54,11 +54,8 @@ func (h *OpenAIResponsesAPIHandler) ResponsesWebsocket(c *gin.Context) {
|
|||||||
passthroughSessionID := uuid.NewString()
|
passthroughSessionID := uuid.NewString()
|
||||||
downstreamSessionKey := websocketDownstreamSessionKey(c.Request)
|
downstreamSessionKey := websocketDownstreamSessionKey(c.Request)
|
||||||
retainResponsesWebsocketToolCaches(downstreamSessionKey)
|
retainResponsesWebsocketToolCaches(downstreamSessionKey)
|
||||||
clientRemoteAddr := ""
|
clientIP := websocketClientAddress(c)
|
||||||
if c != nil && c.Request != nil {
|
log.Infof("responses websocket: client connected id=%s remote=%s", passthroughSessionID, clientIP)
|
||||||
clientRemoteAddr = strings.TrimSpace(c.Request.RemoteAddr)
|
|
||||||
}
|
|
||||||
log.Infof("responses websocket: client connected id=%s remote=%s", passthroughSessionID, clientRemoteAddr)
|
|
||||||
var wsTerminateErr error
|
var wsTerminateErr error
|
||||||
var wsBodyLog strings.Builder
|
var wsBodyLog strings.Builder
|
||||||
defer func() {
|
defer func() {
|
||||||
@@ -206,6 +203,13 @@ func (h *OpenAIResponsesAPIHandler) ResponsesWebsocket(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func websocketClientAddress(c *gin.Context) string {
|
||||||
|
if c == nil || c.Request == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return strings.TrimSpace(c.ClientIP())
|
||||||
|
}
|
||||||
|
|
||||||
func websocketUpgradeHeaders(req *http.Request) http.Header {
|
func websocketUpgradeHeaders(req *http.Request) http.Header {
|
||||||
headers := http.Header{}
|
headers := http.Header{}
|
||||||
if req == nil {
|
if req == nil {
|
||||||
|
|||||||
@@ -721,6 +721,31 @@ func TestResponsesWebsocketPrewarmHandledLocallyForSSEUpstream(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWebsocketClientAddressUsesGinClientIP(t *testing.T) {
|
||||||
|
gin.SetMode(gin.TestMode)
|
||||||
|
|
||||||
|
recorder := httptest.NewRecorder()
|
||||||
|
c, engine := gin.CreateTestContext(recorder)
|
||||||
|
if err := engine.SetTrustedProxies([]string{"0.0.0.0/0", "::/0"}); err != nil {
|
||||||
|
t.Fatalf("SetTrustedProxies: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodGet, "/v1/responses/ws", nil)
|
||||||
|
req.RemoteAddr = "172.18.0.1:34282"
|
||||||
|
req.Header.Set("X-Forwarded-For", "203.0.113.7")
|
||||||
|
c.Request = req
|
||||||
|
|
||||||
|
if got := websocketClientAddress(c); got != strings.TrimSpace(c.ClientIP()) {
|
||||||
|
t.Fatalf("websocketClientAddress = %q, ClientIP = %q", got, c.ClientIP())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWebsocketClientAddressReturnsEmptyForNilContext(t *testing.T) {
|
||||||
|
if got := websocketClientAddress(nil); got != "" {
|
||||||
|
t.Fatalf("websocketClientAddress(nil) = %q, want empty", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestResponsesWebsocketPinsOnlyWebsocketCapableAuth(t *testing.T) {
|
func TestResponsesWebsocketPinsOnlyWebsocketCapableAuth(t *testing.T) {
|
||||||
gin.SetMode(gin.TestMode)
|
gin.SetMode(gin.TestMode)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user