123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- package process
- import (
- "crypto/tls"
- "ehang.io/nps/core/action"
- "ehang.io/nps/lib/common"
- "ehang.io/nps/lib/enet"
- "fmt"
- "github.com/stretchr/testify/assert"
- "golang.org/x/net/proxy"
- "net"
- "net/http"
- "net/url"
- "testing"
- "time"
- )
- func TestSocks5ProxyProcess(t *testing.T) {
- sAddr, err := startHttps(t)
- assert.NoError(t, err)
- h := Socks5Process{
- DefaultProcess: DefaultProcess{},
- }
- ac := &action.LocalAction{}
- ac.Init()
- assert.NoError(t, h.Init(ac))
- ln, err := net.Listen("tcp", "127.0.0.1:0")
- assert.NoError(t, err)
- go func() {
- for {
- c, err := ln.Accept()
- assert.NoError(t, err)
- go h.ProcessConn(enet.NewReaderConn(c))
- }
- }()
- transport := &http.Transport{
- TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
- Proxy: func(_ *http.Request) (*url.URL, error) {
- return url.Parse(fmt.Sprintf("socks5://%s", ln.Addr().String()))
- },
- }
- client := &http.Client{Transport: transport}
- resp, err := client.Get(fmt.Sprintf("https://%s/now", sAddr))
- assert.NoError(t, err)
- assert.Equal(t, 200, resp.StatusCode)
- }
- func TestSocks5ProxyProcessAuth(t *testing.T) {
- sAddr, err := startHttps(t)
- h := Socks5Process{
- DefaultProcess: DefaultProcess{},
- Accounts: map[string]string{"aaa": "bbb"},
- }
- ac := &action.LocalAction{}
- ac.Init()
- assert.NoError(t, h.Init(ac))
- ln, err := net.Listen("tcp", "127.0.0.1:0")
- assert.NoError(t, err)
- go func() {
- for {
- c, err := ln.Accept()
- assert.NoError(t, err)
- go func() {
- _, _ = h.ProcessConn(enet.NewReaderConn(c))
- _ = c.Close()
- }()
- }
- }()
- auth := proxy.Auth{
- User: "aaa",
- Password: "bbb",
- }
- dialer, err := proxy.SOCKS5("tcp", ln.Addr().String(), nil, proxy.Direct)
- assert.NoError(t, err)
- tr := &http.Transport{Dial: dialer.Dial, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
- client := &http.Client{
- Transport: tr,
- }
- resp, err := client.Get(fmt.Sprintf("https://%s/now", sAddr))
- assert.Error(t, err)
- dialer, err = proxy.SOCKS5("tcp", ln.Addr().String(), &auth, proxy.Direct)
- assert.NoError(t, err)
- tr = &http.Transport{Dial: dialer.Dial, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
- client = &http.Client{
- Transport: tr,
- }
- resp, err = client.Get(fmt.Sprintf("https://%s/now", sAddr))
- assert.NoError(t, err)
- assert.Equal(t, 200, resp.StatusCode)
- }
- func TestSocks5ProxyProcessUdp(t *testing.T) {
- h := Socks5Process{
- DefaultProcess: DefaultProcess{},
- }
- ac := &action.LocalAction{}
- ac.Init()
- assert.NoError(t, h.Init(ac))
- h.ipStore.Set("127.0.0.1", true, time.Minute)
- serverPc, err := net.ListenPacket("udp", "127.0.0.1:0")
- assert.NoError(t, err)
- localPc, err := net.ListenPacket("udp", "127.0.0.1:0")
- assert.NoError(t, err)
- appPc, err := net.ListenPacket("udp", "127.0.0.1:0")
- assert.NoError(t, err)
- data := []byte("test")
- go func() {
- p := make([]byte, 1500)
- n, addr, err := appPc.ReadFrom(p)
- assert.NoError(t, err)
- assert.Equal(t, p[:n], data)
- _, err = appPc.WriteTo(data, addr)
- assert.NoError(t, err)
- }()
- go func() {
- p := make([]byte, 1500)
- n, addr, err := serverPc.ReadFrom(p)
- assert.NoError(t, err)
- pc := enet.NewReaderPacketConn(serverPc, p[:n], addr)
- err = pc.SendPacket(p[:n], addr)
- assert.NoError(t, err)
- b, err := h.ProcessPacketConn(pc)
- assert.Equal(t, b, true)
- assert.NoError(t, err)
- }()
- b := []byte{0, 0, 0}
- pAddr, err := common.ParseAddr(appPc.LocalAddr().String())
- assert.NoError(t, err)
- b = append(b, pAddr...)
- b = append(b, data...)
- _, err = localPc.WriteTo(b, serverPc.LocalAddr())
- assert.NoError(t, err)
- p := make([]byte, 1500)
- n, _, err := localPc.ReadFrom(p)
- assert.NoError(t, err)
- respAddr, err := common.SplitAddr(p[3:])
- assert.NoError(t, err)
- assert.Equal(t, respAddr.String(), appPc.LocalAddr().String())
- assert.Equal(t, p[3+len(respAddr):n], data)
- }
|