mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-10-16 20:44:03 +00:00
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:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user