diff --git a/http_proxy.go b/http_proxy.go index 973c2ef4..25463e91 100644 --- a/http_proxy.go +++ b/http_proxy.go @@ -969,21 +969,15 @@ func (p *Proxy) listenAlgeneva(baseListen func(string) (net.Listener, error)) li // listenWATER start a WATER listener and return it // Currently water doesn't support customized TCP connections and we need to listen and receive requests directly from the WATER listener -func (p *Proxy) listenWATER(baseListen func(string) (net.Listener, error)) listenerBuilderFN { - return func(addr string) (net.Listener, error) { - ctx := context.Background() - base, err := baseListen(addr) - if err != nil { - return nil, err - } - waterListener, err := water.NewWATERListener(ctx, p.WaterTransport, base, p.WaterWASM) - if err != nil { - return nil, err - } - - log.Debugf("Listening for water at %v", waterListener.Addr()) - return waterListener, nil +func (p *Proxy) listenWATER(addr string) (net.Listener, error) { + ctx := context.Background() + waterListener, err := water.NewWATERListener(ctx, p.WaterTransport, addr, p.WaterWASM) + if err != nil { + return nil, err } + + log.Debugf("Listening for water at %v", waterListener.Addr()) + return waterListener, nil } func (p *Proxy) setupPacketForward() error { diff --git a/protoListeners.go b/protoListeners.go index 7f70c138..5b0ff2d6 100644 --- a/protoListeners.go +++ b/protoListeners.go @@ -29,6 +29,6 @@ func getProtoListenersArgs(p *Proxy) []protoListenerArgs { p.ShadowsocksMultiplexAddr, p.wrapMultiplexing(p.listenShadowsocks), }, - {"water", p.WaterAddr, p.wrapMultiplexing(p.listenWATER(p.listenTCP))}, + {"water", p.WaterAddr, p.listenWATER}, } } diff --git a/water/listener.go b/water/listener.go index 9fcb8ff6..00323013 100644 --- a/water/listener.go +++ b/water/listener.go @@ -15,7 +15,7 @@ var log = golog.LoggerFor("water") // NewWATERListener creates a WATER listener // Currently water doesn't support customized TCP connections and we need to listen and receive requests directly from the WATER listener -func NewWATERListener(ctx context.Context, transport string, baseListener net.Listener, wasm string) (net.Listener, error) { +func NewWATERListener(ctx context.Context, transport string, address, wasm string) (net.Listener, error) { decodedWASM, err := base64.StdEncoding.DecodeString(wasm) if err != nil { log.Errorf("failed to decode WASM base64: %v", err) @@ -24,11 +24,11 @@ func NewWATERListener(ctx context.Context, transport string, baseListener net.Li cfg := &water.Config{ TransportModuleBin: decodedWASM, - NetworkListener: baseListener, - OverrideLogger: slog.New(newLogHandler(log, transport)), + //NetworkListener: baseListener, + OverrideLogger: slog.New(newLogHandler(log, transport)), } - waterListener, err := water.NewListenerWithContext(ctx, cfg) + waterListener, err := cfg.ListenContext(ctx, "tcp", address) if err != nil { log.Errorf("error creating water listener: %v", err) return nil, err diff --git a/water/listener_test.go b/water/listener_test.go index df29ec87..c8f88b49 100644 --- a/water/listener_test.go +++ b/water/listener_test.go @@ -36,10 +36,7 @@ func TestWATERListener(t *testing.T) { OverrideLogger: slog.New(newLogHandler(log, transport)), } - l0, err := net.ListenTCP("tcp", &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 0}) - require.Nil(t, err, "ListenTCP failed: %v", err) - - ll, err := NewWATERListener(ctx, transport, l0, b64WASM) + ll, err := NewWATERListener(ctx, transport, "127.0.0.1:3000", b64WASM) require.Nil(t, err) messageRequest := "hello" @@ -92,7 +89,7 @@ func TestWATERListener(t *testing.T) { dialer, err := water.NewDialerWithContext(ctx, cfg) require.Nil(t, err) - conn, err := dialer.DialContext(ctx, "tcp", l0.Addr().String()) + conn, err := dialer.DialContext(ctx, "tcp", ll.Addr().String()) require.Nil(t, err) defer conn.Close()