Enhance Mihomo WebSocket functionality and testing for connections
- Added support for WebSocket connections to the `/connections` endpoint, allowing for improved handling of WebSocket requests. - Updated the `useMihomoWebSocketTunnel` function to accept `Sec-WebSocket-Key` for `/connections`, enhancing compatibility with various proxies. - Introduced new test cases in `mihomo_test.go` to validate WebSocket tunnel behavior for connections, ensuring comprehensive coverage. - Enhanced the `applyMihomoWSDialAuth` function to manage token handling for WebSocket connections, improving security and functionality. - Updated Svelte components to implement native WebSocket loops for connections, providing real-time data updates and improved user experience.
This commit is contained in:
@@ -82,6 +82,50 @@ func TestUseMihomoWebSocketTunnel(t *testing.T) {
|
||||
t.Fatal("proxies must not use WS tunnel")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("connections with key only", func(t *testing.T) {
|
||||
r := httptest.NewRequest(http.MethodGet, "/api/x/mihomo/connections", nil)
|
||||
r.Header.Set("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ==")
|
||||
if !useMihomoWebSocketTunnel("connections", r) {
|
||||
t.Fatal("expected tunnel for connections+Sec-WebSocket-Key")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("connections REST GET without key", func(t *testing.T) {
|
||||
r := httptest.NewRequest(http.MethodGet, "/api/x/mihomo/connections", nil)
|
||||
if useMihomoWebSocketTunnel("connections", r) {
|
||||
t.Fatal("plain GET /connections must use HTTP forwarder")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestApplyMihomoWSDialAuth(t *testing.T) {
|
||||
t.Run("connections strips Bearer for token query", func(t *testing.T) {
|
||||
u, _ := url.Parse("http://127.0.0.1:9090/connections")
|
||||
hdr := applyMihomoWSDialAuth("connections", u, "Bearer mysecret")
|
||||
if hdr.Get("Authorization") != "" {
|
||||
t.Fatal("connections WS must not set Authorization")
|
||||
}
|
||||
if u.RawQuery != "token=mysecret" {
|
||||
t.Fatalf("query: %q", u.RawQuery)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("connections raw token", func(t *testing.T) {
|
||||
u, _ := url.Parse("http://127.0.0.1:9090/connections")
|
||||
_ = applyMihomoWSDialAuth("connections", u, "rawonly")
|
||||
if u.RawQuery != "token=rawonly" {
|
||||
t.Fatalf("query: %q", u.RawQuery)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("traffic uses Authorization", func(t *testing.T) {
|
||||
u, _ := url.Parse("http://127.0.0.1:9090/traffic")
|
||||
hdr := applyMihomoWSDialAuth("traffic", u, "Bearer t")
|
||||
if hdr.Get("Authorization") != "Bearer t" {
|
||||
t.Fatalf("Authorization: %q", hdr.Get("Authorization"))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestMihomoWebSocketURL(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user