Files
telemt-api/internal/proxy/mihomo_test.go
T
Denozordec 77a6c1e31e
Publish telemt-api gateway Docker image / test (push) Successful in 26s
Publish telemt-api gateway Docker image / build-and-push (push) Successful in 1m57s
Enhance WebSocket upgrade detection in Mihomo
- Updated the `isWebSocketUpgrade` function to improve handling of WebSocket upgrade requests by considering the presence of the "Sec-WebSocket-Key" header as a strong indicator.
- Added a new test case in `TestIsWebSocketUpgrade` to validate the detection logic for requests with the "Sec-WebSocket-Key" header, ensuring comprehensive test coverage.
2026-03-31 10:28:06 +07:00

63 lines
1.9 KiB
Go

package proxy
import (
"context"
"net/http"
"net/http/httptest"
"net/url"
"testing"
)
func TestMihomoForwardRewritesPathAndAuth(t *testing.T) {
target, err := url.Parse("http://127.0.0.1:9090")
if err != nil {
t.Fatal(err)
}
cap := &captureTransport{}
h := NewMihomoForward(target, "/api/mtg/mihomo", "Bearer testsecret", cap, nil)
req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, "http://gw/api/mtg/mihomo/proxies", nil)
if err != nil {
t.Fatal(err)
}
req.Header.Set("Authorization", "Bearer client-should-not-forward")
req.Header.Set("Host", "public-gateway.example:8888")
h.ServeHTTP(httptest.NewRecorder(), req)
if cap.got == nil {
t.Fatal("no outgoing request captured")
}
if got, want := cap.got.Host, "127.0.0.1:9090"; got != want {
t.Fatalf("Host: got %q want %q (upstream must not see client Host)", got, want)
}
if got := cap.got.Header.Get("Authorization"); got != "Bearer testsecret" {
t.Fatalf("Authorization: got %q want Bearer testsecret", got)
}
want, err := url.Parse("http://127.0.0.1:9090/proxies")
if err != nil {
t.Fatal(err)
}
assertSameURL(t, cap.got.URL, want)
}
func TestIsWebSocketUpgrade(t *testing.T) {
r1 := httptest.NewRequest(http.MethodGet, "http://gw/api/mtg/mihomo/traffic", nil)
r1.Header.Set("Connection", "keep-alive, Upgrade")
r1.Header.Set("Upgrade", "websocket")
if !isWebSocketUpgrade(r1) {
t.Fatal("expected websocket upgrade for tokenized headers")
}
r2 := httptest.NewRequest(http.MethodGet, "http://gw/api/mtg/mihomo/traffic", nil)
r2.Header.Set("Upgrade", "websocket")
if isWebSocketUpgrade(r2) {
t.Fatal("expected non-websocket when Connection lacks upgrade")
}
r3 := httptest.NewRequest(http.MethodGet, "http://gw/api/mtg/mihomo/traffic", nil)
r3.Header.Set("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ==")
if !isWebSocketUpgrade(r3) {
t.Fatal("expected websocket upgrade when Sec-WebSocket-Key is present")
}
}