|
@@ -21,19 +21,6 @@ type DefaultListener struct {
|
|
|
controllers []control.Func
|
|
|
}
|
|
|
|
|
|
-type combinedListener struct {
|
|
|
- net.Listener
|
|
|
- locker *FileLocker // for unix domain socket
|
|
|
-}
|
|
|
-
|
|
|
-func (cl *combinedListener) Close() error {
|
|
|
- if cl.locker != nil {
|
|
|
- cl.locker.Release()
|
|
|
- cl.locker = nil
|
|
|
- }
|
|
|
- return cl.Listener.Close()
|
|
|
-}
|
|
|
-
|
|
|
func getControlFunc(ctx context.Context, sockopt *SocketConfig, controllers []control.Func) func(network, address string, c syscall.RawConn) error {
|
|
|
return func(network, address string, c syscall.RawConn) error {
|
|
|
return c.Control(func(fd uintptr) {
|
|
@@ -54,6 +41,40 @@ func getControlFunc(ctx context.Context, sockopt *SocketConfig, controllers []co
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// For some reason, other component of ray will assume the listener is a TCP listener and have valid remote address.
|
|
|
+// But in fact it doesn't. So we need to wrap the listener to make it return 0.0.0.0(unspecified) as remote address.
|
|
|
+// If other issues encountered, we should able to fix it here.
|
|
|
+type listenUDSWrapper struct {
|
|
|
+ net.Listener
|
|
|
+ locker *FileLocker
|
|
|
+}
|
|
|
+
|
|
|
+func (l *listenUDSWrapper) Accept() (net.Conn, error) {
|
|
|
+ conn, err := l.Listener.Accept()
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ return &listenUDSWrapperConn{Conn: conn}, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (l *listenUDSWrapper) Close() error {
|
|
|
+ if l.locker != nil {
|
|
|
+ l.locker.Release()
|
|
|
+ l.locker = nil
|
|
|
+ }
|
|
|
+ return l.Listener.Close()
|
|
|
+}
|
|
|
+
|
|
|
+type listenUDSWrapperConn struct {
|
|
|
+ net.Conn
|
|
|
+}
|
|
|
+
|
|
|
+func (conn *listenUDSWrapperConn) RemoteAddr() net.Addr {
|
|
|
+ return &net.TCPAddr{
|
|
|
+ IP: []byte{0, 0, 0, 0},
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func (dl *DefaultListener) Listen(ctx context.Context, addr net.Addr, sockopt *SocketConfig) (l net.Listener, err error) {
|
|
|
var lc net.ListenConfig
|
|
|
var network, address string
|
|
@@ -113,9 +134,9 @@ func (dl *DefaultListener) Listen(ctx context.Context, addr net.Addr, sockopt *S
|
|
|
callback = func(l net.Listener, err error) (net.Listener, error) {
|
|
|
if err != nil {
|
|
|
locker.Release()
|
|
|
- return l, err
|
|
|
+ return nil, err
|
|
|
}
|
|
|
- l = &combinedListener{Listener: l, locker: locker}
|
|
|
+ l = &listenUDSWrapper{Listener: l, locker: locker}
|
|
|
if filePerm == nil {
|
|
|
return l, nil
|
|
|
}
|
|
@@ -129,9 +150,8 @@ func (dl *DefaultListener) Listen(ctx context.Context, addr net.Addr, sockopt *S
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- l, err = lc.Listen(ctx, network, address)
|
|
|
- l, err = callback(l, err)
|
|
|
- if sockopt != nil && sockopt.AcceptProxyProtocol {
|
|
|
+ l, err = callback(lc.Listen(ctx, network, address))
|
|
|
+ if err == nil && sockopt != nil && sockopt.AcceptProxyProtocol {
|
|
|
policyFunc := func(upstream net.Addr) (proxyproto.Policy, error) { return proxyproto.REQUIRE, nil }
|
|
|
l = &proxyproto.Listener{Listener: l, Policy: policyFunc}
|
|
|
}
|