MASQUE client: Support XMUX ("maxConnections": 1 by default); Use Chrome's User-Agent by default (#7121)

https://github.com/XTLS/Xray-core/pull/6810#issuecomment-5842441136
https://github.com/XTLS/Xray-core/pull/6878#issuecomment-6095112915
https://github.com/XTLS/Xray-core/pull/7121#issuecomment-6117636043

---------

Co-authored-by: SVLAVR <skugorov.s@gmail.com>
This commit is contained in:
Cluvex
2026-10-12 19:40:04 +00:00
committed by GitHub
co-authored by SVLAVR
parent 5a64db009b
commit c77a4d0e49
16 changed files with 456 additions and 91 deletions
+15 -1
View File
@@ -79,6 +79,14 @@ func (m *XmuxManager) newXmuxClient() *XmuxClient {
}
func (m *XmuxManager) GetXmuxClient(ctx context.Context) *XmuxClient { // when locking
return m.getXmuxClient(ctx, true)
}
func (m *XmuxManager) GetExistingXmuxClient(ctx context.Context) *XmuxClient {
return m.getXmuxClient(ctx, false)
}
func (m *XmuxManager) getXmuxClient(ctx context.Context, create bool) *XmuxClient {
for i := 0; i < len(m.xmuxClients); {
xmuxClient := m.xmuxClients[i]
if xmuxClient.XmuxConn.IsClosed() ||
@@ -99,11 +107,14 @@ func (m *XmuxManager) GetXmuxClient(ctx context.Context) *XmuxClient { // when l
}
if len(m.xmuxClients) == 0 {
if !create {
return nil
}
errors.LogDebug(ctx, "XMUX: creating xmuxClient because xmuxClients is empty")
return m.newXmuxClient()
}
if m.connections > 0 && len(m.xmuxClients) < int(m.connections) {
if create && m.connections > 0 && len(m.xmuxClients) < int(m.connections) {
errors.LogDebug(ctx, "XMUX: creating xmuxClient because maxConnections was not hit, xmuxClients = ", len(m.xmuxClients))
return m.newXmuxClient()
}
@@ -120,6 +131,9 @@ func (m *XmuxManager) GetXmuxClient(ctx context.Context) *XmuxClient { // when l
}
if len(xmuxClients) == 0 {
if !create {
return nil
}
errors.LogDebug(ctx, "XMUX: creating xmuxClient because maxConcurrency was hit, xmuxClients = ", len(m.xmuxClients))
return m.newXmuxClient()
}
+20
View File
@@ -90,3 +90,23 @@ func TestDefault(t *testing.T) {
t.Error("did not get 1 distinct clients, got ", len(xmuxClients))
}
}
func TestGetExistingXmuxClient(t *testing.T) {
xmuxConfig := XmuxConfig{
MaxConnections: &RangeConfig{From: 2, To: 2},
}
xmuxManager := NewXmuxManager(xmuxConfig, func() XmuxConn {
return &fakeRoundTripper{}
})
if xmuxManager.GetExistingXmuxClient(context.Background()) != nil {
t.Error("got a client without creating one")
}
xmuxClient := xmuxManager.GetXmuxClient(context.Background())
for i := 0; i < 4; i++ {
if xmuxManager.GetExistingXmuxClient(context.Background()) != xmuxClient {
t.Error("did not reuse the existing client")
}
}
}