diff --git a/infra/conf/transport_internet.go b/infra/conf/transport_internet.go index 071a9170..ee05dd33 100644 --- a/infra/conf/transport_internet.go +++ b/infra/conf/transport_internet.go @@ -1980,6 +1980,22 @@ func (c *StreamConfig) Build() (*internet.StreamConfig, error) { if strings.EqualFold(c.Security, "reality") { return nil, errors.New("sockopt.browserDialer does not support REALITY") } + if config.ProtocolName == "splithttp" { + splitHTTPSettings := c.SplitHTTPSettings + if c.XHTTPSettings != nil { + splitHTTPSettings = c.XHTTPSettings + } + if splitHTTPSettings != nil { + splitHTTPSettingsCopy := *splitHTTPSettings + hs, err := splitHTTPSettingsCopy.Build() + if err != nil { + return nil, errors.New("Failed to build XHTTP config.").Base(err) + } + if splitHTTPConfig, ok := hs.(*splithttp.Config); ok && splitHTTPConfig.Mode != "auto" && splitHTTPConfig.Mode != "packet-up" { + return nil, errors.New("sockopt.browserDialer only supports XHTTP mode auto or packet-up") + } + } + } } switch strings.ToLower(c.Security) { diff --git a/transport/internet/browser_dialer/dialer_test.go b/transport/internet/browser_dialer/dialer_test.go index 73efa586..9384306f 100644 --- a/transport/internet/browser_dialer/dialer_test.go +++ b/transport/internet/browser_dialer/dialer_test.go @@ -1,10 +1,6 @@ package browser_dialer -import ( - "net/http" - "strings" - "testing" -) +import "testing" func TestParseBrowserDialerAddressRequireUUIDPath(t *testing.T) { valid := "127.0.0.1:8080/123e4567-e89b-12d3-a456-426614174000" @@ -24,61 +20,3 @@ func TestParseBrowserDialerAddressRequireUUIDPath(t *testing.T) { } } } - -func TestGetDialerByAddressReusesExistingServerForSameListenAddress(t *testing.T) { - listenAddr := "127.0.0.1:39000" - server := &dialerServer{ - server: &http.Server{Addr: listenAddr}, - pageRoutes: make(map[string]*dialerInstance), - } - - mu.Lock() - oldDialers, oldServers := sockoptDialers, dialerServers - sockoptDialers = make(map[string]*dialerInstance) - dialerServers = map[string]*dialerServer{listenAddr: server} - mu.Unlock() - t.Cleanup(func() { - mu.Lock() - sockoptDialers = oldDialers - dialerServers = oldServers - mu.Unlock() - }) - - if _, err := getDialerByAddress(listenAddr + "/123e4567-e89b-12d3-a456-426614174000"); err != nil { - t.Fatalf("failed to create first dialer: %v", err) - } - if _, err := getDialerByAddress(listenAddr + "/123e4567-e89b-12d3-a456-426614174001"); err != nil { - t.Fatalf("failed to create second dialer on same listener: %v", err) - } - if len(dialerServers) != 1 { - t.Fatalf("expected one shared listener, got %d", len(dialerServers)) - } -} - -func TestGetDialerByAddressRejectsSamePortDifferentAddress(t *testing.T) { - listenAddr := "127.0.0.1:39001" - server := &dialerServer{ - server: &http.Server{Addr: listenAddr}, - pageRoutes: make(map[string]*dialerInstance), - } - - mu.Lock() - oldDialers, oldServers := sockoptDialers, dialerServers - sockoptDialers = make(map[string]*dialerInstance) - dialerServers = map[string]*dialerServer{listenAddr: server} - mu.Unlock() - t.Cleanup(func() { - mu.Lock() - sockoptDialers = oldDialers - dialerServers = oldServers - mu.Unlock() - }) - - _, err := getDialerByAddress("127.0.0.2:39001/123e4567-e89b-12d3-a456-426614174011") - if err == nil { - t.Fatal("expected error for same port with different listen address") - } - if !strings.Contains(err.Error(), "cannot use the same port with a different listen address") { - t.Fatalf("unexpected error: %v", err) - } -}