318 lines
5.7 KiB
Go
318 lines
5.7 KiB
Go
package gost
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"net/http/httptest"
|
|
"net/url"
|
|
"testing"
|
|
)
|
|
|
|
func tcpDirectForwardRoundtrip(targetURL string, data []byte) error {
|
|
ln, err := TCPListener("")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
u, err := url.Parse(targetURL)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
client := &Client{
|
|
Connector: ForwardConnector(),
|
|
Transporter: TCPTransporter(),
|
|
}
|
|
|
|
h := TCPDirectForwardHandler(u.Host)
|
|
h.Init()
|
|
server := &Server{
|
|
Listener: ln,
|
|
Handler: h,
|
|
}
|
|
|
|
go server.Run()
|
|
defer server.Close()
|
|
|
|
return proxyRoundtrip(client, server, targetURL, data)
|
|
}
|
|
|
|
func TestTCPDirectForward(t *testing.T) {
|
|
httpSrv := httptest.NewServer(httpTestHandler)
|
|
defer httpSrv.Close()
|
|
|
|
sendData := make([]byte, 128)
|
|
rand.Read(sendData)
|
|
|
|
err := tcpDirectForwardRoundtrip(httpSrv.URL, sendData)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
func BenchmarkTCPDirectForward(b *testing.B) {
|
|
httpSrv := httptest.NewServer(httpTestHandler)
|
|
defer httpSrv.Close()
|
|
|
|
sendData := make([]byte, 128)
|
|
rand.Read(sendData)
|
|
|
|
ln, err := TCPListener("")
|
|
if err != nil {
|
|
b.Error(err)
|
|
}
|
|
|
|
client := &Client{
|
|
Connector: ForwardConnector(),
|
|
Transporter: TCPTransporter(),
|
|
}
|
|
|
|
u, err := url.Parse(httpSrv.URL)
|
|
if err != nil {
|
|
b.Error(err)
|
|
}
|
|
|
|
h := TCPDirectForwardHandler(u.Host)
|
|
h.Init()
|
|
server := &Server{
|
|
Listener: ln,
|
|
Handler: h,
|
|
}
|
|
go server.Run()
|
|
defer server.Close()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
if err := proxyRoundtrip(client, server, httpSrv.URL, sendData); err != nil {
|
|
b.Error(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkTCPDirectForwardParallel(b *testing.B) {
|
|
httpSrv := httptest.NewServer(httpTestHandler)
|
|
defer httpSrv.Close()
|
|
|
|
sendData := make([]byte, 128)
|
|
rand.Read(sendData)
|
|
|
|
ln, err := TCPListener("")
|
|
if err != nil {
|
|
b.Error(err)
|
|
}
|
|
|
|
client := &Client{
|
|
Connector: ForwardConnector(),
|
|
Transporter: TCPTransporter(),
|
|
}
|
|
|
|
u, err := url.Parse(httpSrv.URL)
|
|
if err != nil {
|
|
b.Error(err)
|
|
}
|
|
|
|
h := TCPDirectForwardHandler(u.Host)
|
|
h.Init()
|
|
server := &Server{
|
|
Listener: ln,
|
|
Handler: h,
|
|
}
|
|
go server.Run()
|
|
defer server.Close()
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
if err := proxyRoundtrip(client, server, httpSrv.URL, sendData); err != nil {
|
|
b.Error(err)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
func udpDirectForwardRoundtrip(t *testing.T, host string, data []byte) error {
|
|
ln, err := UDPListener("localhost:0", nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
client := &Client{
|
|
Connector: ForwardConnector(),
|
|
Transporter: UDPTransporter(),
|
|
}
|
|
|
|
h := UDPDirectForwardHandler(host)
|
|
h.Init()
|
|
server := &Server{
|
|
Listener: ln,
|
|
Handler: h,
|
|
}
|
|
|
|
go server.Run()
|
|
defer server.Close()
|
|
|
|
return udpRoundtrip(t, client, server, host, data)
|
|
}
|
|
|
|
func TestUDPDirectForward(t *testing.T) {
|
|
udpSrv := newUDPTestServer(udpTestHandler)
|
|
udpSrv.Start()
|
|
defer udpSrv.Close()
|
|
|
|
sendData := make([]byte, 128)
|
|
rand.Read(sendData)
|
|
err := udpDirectForwardRoundtrip(t, udpSrv.Addr(), sendData)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
func BenchmarkUDPDirectForward(b *testing.B) {
|
|
udpSrv := newUDPTestServer(udpTestHandler)
|
|
udpSrv.Start()
|
|
defer udpSrv.Close()
|
|
|
|
sendData := make([]byte, 128)
|
|
rand.Read(sendData)
|
|
|
|
ln, err := UDPListener("localhost:0", nil)
|
|
if err != nil {
|
|
b.Error(err)
|
|
}
|
|
|
|
client := &Client{
|
|
Connector: ForwardConnector(),
|
|
Transporter: UDPTransporter(),
|
|
}
|
|
|
|
h := UDPDirectForwardHandler(udpSrv.Addr())
|
|
h.Init()
|
|
server := &Server{
|
|
Listener: ln,
|
|
Handler: h,
|
|
}
|
|
|
|
go server.Run()
|
|
defer server.Close()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
if err := udpRoundtrip(b, client, server, udpSrv.Addr(), sendData); err != nil {
|
|
b.Error(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkUDPDirectForwardParallel(b *testing.B) {
|
|
udpSrv := newUDPTestServer(udpTestHandler)
|
|
udpSrv.Start()
|
|
defer udpSrv.Close()
|
|
|
|
sendData := make([]byte, 128)
|
|
rand.Read(sendData)
|
|
|
|
ln, err := UDPListener("localhost:0", nil)
|
|
if err != nil {
|
|
b.Error(err)
|
|
}
|
|
|
|
client := &Client{
|
|
Connector: ForwardConnector(),
|
|
Transporter: UDPTransporter(),
|
|
}
|
|
|
|
h := UDPDirectForwardHandler(udpSrv.Addr())
|
|
h.Init()
|
|
server := &Server{
|
|
Listener: ln,
|
|
Handler: h,
|
|
}
|
|
|
|
go server.Run()
|
|
defer server.Close()
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
for pb.Next() {
|
|
if err := udpRoundtrip(b, client, server, udpSrv.Addr(), sendData); err != nil {
|
|
b.Error(err)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
func tcpRemoteForwardRoundtrip(t *testing.T, targetURL string, data []byte) error {
|
|
ln, err := TCPRemoteForwardListener("localhost:0", nil) // listening on localhost
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
u, err := url.Parse(targetURL)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
client := &Client{
|
|
Connector: ForwardConnector(),
|
|
Transporter: TCPTransporter(),
|
|
}
|
|
|
|
h := TCPRemoteForwardHandler(u.Host) // forward to u.Host
|
|
h.Init()
|
|
server := &Server{
|
|
Listener: ln,
|
|
Handler: h,
|
|
}
|
|
|
|
go server.Run()
|
|
defer server.Close()
|
|
|
|
return proxyRoundtrip(client, server, targetURL, data)
|
|
}
|
|
|
|
func TestTCPRemoteForward(t *testing.T) {
|
|
httpSrv := httptest.NewServer(httpTestHandler)
|
|
defer httpSrv.Close()
|
|
|
|
sendData := make([]byte, 128)
|
|
rand.Read(sendData)
|
|
|
|
err := tcpRemoteForwardRoundtrip(t, httpSrv.URL, sendData)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
func udpRemoteForwardRoundtrip(t *testing.T, host string, data []byte) error {
|
|
ln, err := UDPRemoteForwardListener("localhost:0", nil, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
client := &Client{
|
|
Connector: ForwardConnector(),
|
|
Transporter: UDPTransporter(),
|
|
}
|
|
|
|
h := UDPRemoteForwardHandler(host)
|
|
h.Init()
|
|
server := &Server{
|
|
Listener: ln,
|
|
Handler: h,
|
|
}
|
|
|
|
go server.Run()
|
|
defer server.Close()
|
|
|
|
return udpRoundtrip(t, client, server, host, data)
|
|
}
|
|
|
|
func TestUDPRemoteForward(t *testing.T) {
|
|
udpSrv := newUDPTestServer(udpTestHandler)
|
|
udpSrv.Start()
|
|
defer udpSrv.Close()
|
|
|
|
sendData := make([]byte, 128)
|
|
rand.Read(sendData)
|
|
|
|
err := udpRemoteForwardRoundtrip(t, udpSrv.Addr(), sendData)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|