Feature: add inbounds for flexible binding inbound (#2818)

This commit is contained in:
fuyun
2023-08-03 22:30:08 +08:00
committed by GitHub
parent 10f4d5375a
commit 9e78137768
25 changed files with 552 additions and 361 deletions

View File

@ -209,23 +209,27 @@ func newLargeDataPair() (chan hashPair, chan hashPair, func(t *testing.T) error)
return pingCh, pongCh, test
}
func testPingPongWithSocksPort(t *testing.T, port int) {
func testPingPongWithSocksPort(t *testing.T, port int) error {
l, err := Listen("tcp", ":10001")
require.NoError(t, err)
defer l.Close()
pingCh, pongCh, test := newPingPongPair()
go func() {
l, err := Listen("tcp", ":10001")
require.NoError(t, err)
defer l.Close()
c, err := l.Accept()
require.NoError(t, err)
if err != nil {
return
}
buf := make([]byte, 4)
_, err = io.ReadFull(c, buf)
require.NoError(t, err)
if _, err = io.ReadFull(c, buf); err != nil {
return
}
pingCh <- buf
_, err = c.Write([]byte("pong"))
require.NoError(t, err)
if _, err = c.Write([]byte("pong")); err != nil {
return
}
}()
go func() {
@ -233,20 +237,23 @@ func testPingPongWithSocksPort(t *testing.T, port int) {
require.NoError(t, err)
defer c.Close()
_, err = socks5.ClientHandshake(c, socks5.ParseAddr("127.0.0.1:10001"), socks5.CmdConnect, nil)
require.NoError(t, err)
if _, err = socks5.ClientHandshake(c, socks5.ParseAddr("127.0.0.1:10001"), socks5.CmdConnect, nil); err != nil {
return
}
_, err = c.Write([]byte("ping"))
require.NoError(t, err)
if _, err = c.Write([]byte("ping")); err != nil {
return
}
buf := make([]byte, 4)
_, err = io.ReadFull(c, buf)
require.NoError(t, err)
if _, err = io.ReadFull(c, buf); err != nil {
return
}
pongCh <- buf
}()
test(t)
return test(t)
}
func testPingPongWithConn(t *testing.T, c net.Conn) error {
@ -655,7 +662,7 @@ log-level: silent
defer cleanup()
require.True(t, TCPing(net.JoinHostPort("127.0.0.1", "10000")))
testPingPongWithSocksPort(t, 10000)
require.NoError(t, testPingPongWithSocksPort(t, 10000))
}
func Benchmark_Direct(b *testing.B) {

78
test/listener_test.go Normal file
View File

@ -0,0 +1,78 @@
package main
import (
"net"
"strconv"
"testing"
"time"
C "github.com/Dreamacro/clash/constant"
"github.com/Dreamacro/clash/listener"
"github.com/Dreamacro/clash/tunnel"
"github.com/stretchr/testify/require"
)
func TestClash_Listener(t *testing.T) {
basic := `
log-level: silent
port: 7890
socks-port: 7891
redir-port: 7892
tproxy-port: 7893
mixed-port: 7894
`
err := parseAndApply(basic)
require.NoError(t, err)
defer cleanup()
time.Sleep(waitTime)
for i := 7890; i <= 7894; i++ {
require.True(t, TCPing(net.JoinHostPort("127.0.0.1", strconv.Itoa(i))), "tcp port %d", i)
}
}
func TestClash_ListenerCreate(t *testing.T) {
basic := `
log-level: silent
`
err := parseAndApply(basic)
require.NoError(t, err)
defer cleanup()
time.Sleep(waitTime)
tcpIn := tunnel.TCPIn()
udpIn := tunnel.UDPIn()
ports := listener.Ports{
Port: 7890,
}
listener.ReCreatePortsListeners(ports, tcpIn, udpIn)
require.True(t, TCPing("127.0.0.1:7890"))
require.Equal(t, ports, *listener.GetPorts())
inbounds := []C.Inbound{
{
Type: C.InboundTypeHTTP,
BindAddress: "127.0.0.1:7891",
},
}
listener.ReCreateListeners(inbounds, tcpIn, udpIn)
require.True(t, TCPing("127.0.0.1:7890"))
require.Equal(t, ports, *listener.GetPorts())
require.True(t, TCPing("127.0.0.1:7891"))
require.Equal(t, len(inbounds), len(listener.GetInbounds()))
ports.Port = 0
ports.SocksPort = 7892
listener.ReCreatePortsListeners(ports, tcpIn, udpIn)
require.False(t, TCPing("127.0.0.1:7890"))
require.True(t, TCPing("127.0.0.1:7892"))
require.Equal(t, ports, *listener.GetPorts())
require.True(t, TCPing("127.0.0.1:7891"))
require.Equal(t, len(inbounds), len(listener.GetInbounds()))
}

33
test/rule_test.go Normal file
View File

@ -0,0 +1,33 @@
package main
import (
"net"
"testing"
"github.com/stretchr/testify/require"
)
func TestClash_RuleInbound(t *testing.T) {
basic := `
socks-port: 7890
inbounds:
- socks://127.0.0.1:7891
- type: socks
bind-address: 127.0.0.1:7892
rules:
- INBOUND-PORT,7891,REJECT
log-level: silent
`
err := parseAndApply(basic)
require.NoError(t, err)
defer cleanup()
require.True(t, TCPing(net.JoinHostPort("127.0.0.1", "7890")))
require.True(t, TCPing(net.JoinHostPort("127.0.0.1", "7891")))
require.True(t, TCPing(net.JoinHostPort("127.0.0.1", "7892")))
require.Error(t, testPingPongWithSocksPort(t, 7891))
require.NoError(t, testPingPongWithSocksPort(t, 7890))
require.NoError(t, testPingPongWithSocksPort(t, 7892))
}