socks5_test.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package handler
  2. import (
  3. "crypto/tls"
  4. "ehang.io/nps/lib/enet"
  5. "fmt"
  6. "github.com/stretchr/testify/assert"
  7. "net"
  8. "net/http"
  9. "net/url"
  10. "testing"
  11. )
  12. func TestHandleSocks5Conn(t *testing.T) {
  13. h := Socks5Handler{}
  14. rule := &testRule{}
  15. h.AddRule(rule)
  16. finish := make(chan struct{}, 0)
  17. ln, err := net.Listen("tcp", "127.0.0.1:0")
  18. assert.NoError(t, err)
  19. go func() {
  20. conn, err := ln.Accept()
  21. assert.NoError(t, err)
  22. buf := make([]byte, 1024)
  23. n, err := conn.Read(buf)
  24. assert.NoError(t, err)
  25. res, err := h.HandleConn(buf[:n], enet.NewReaderConn(conn))
  26. assert.NoError(t, err)
  27. assert.Equal(t, true, res)
  28. assert.Equal(t, true, rule.run)
  29. finish <- struct{}{}
  30. }()
  31. go func() {
  32. transport := &http.Transport{
  33. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  34. Proxy: func(_ *http.Request) (*url.URL, error) {
  35. return url.Parse(fmt.Sprintf("socks5://%s", ln.Addr().String()))
  36. },
  37. }
  38. client := &http.Client{Transport: transport}
  39. _, _ = client.Get("https://google.com/")
  40. }()
  41. <-finish
  42. }