|
|
|
@ -3,6 +3,7 @@ package gost |
|
|
|
import ( |
|
|
|
"crypto/rand" |
|
|
|
"crypto/tls" |
|
|
|
"fmt" |
|
|
|
"net/http/httptest" |
|
|
|
"net/url" |
|
|
|
"testing" |
|
|
|
@ -301,6 +302,71 @@ func TestSSOverWSS(t *testing.T) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func sniOverWSSRoundtrip(targetURL string, data []byte, host string) error { |
|
|
|
ln, err := WSSListener("", nil, nil) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
u, err := url.Parse(targetURL) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
client := &Client{ |
|
|
|
Connector: SNIConnector(host), |
|
|
|
Transporter: WSSTransporter(nil), |
|
|
|
} |
|
|
|
|
|
|
|
server := &Server{ |
|
|
|
Listener: ln, |
|
|
|
Handler: SNIHandler(HostHandlerOption(u.Host)), |
|
|
|
} |
|
|
|
|
|
|
|
go server.Run() |
|
|
|
defer server.Close() |
|
|
|
|
|
|
|
return sniRoundtrip(client, server, targetURL, data) |
|
|
|
} |
|
|
|
|
|
|
|
func TestSNIOverWSS(t *testing.T) { |
|
|
|
httpSrv := httptest.NewServer(httpTestHandler) |
|
|
|
defer httpSrv.Close() |
|
|
|
httpsSrv := httptest.NewTLSServer(httpTestHandler) |
|
|
|
defer httpsSrv.Close() |
|
|
|
|
|
|
|
sendData := make([]byte, 128) |
|
|
|
rand.Read(sendData) |
|
|
|
|
|
|
|
var sniProxyTests = []struct { |
|
|
|
targetURL string |
|
|
|
host string |
|
|
|
pass bool |
|
|
|
}{ |
|
|
|
{httpSrv.URL, "", true}, |
|
|
|
{httpSrv.URL, "example.com", true}, |
|
|
|
{httpsSrv.URL, "", true}, |
|
|
|
{httpsSrv.URL, "example.com", true}, |
|
|
|
} |
|
|
|
|
|
|
|
for i, tc := range sniProxyTests { |
|
|
|
tc := tc |
|
|
|
t.Run(fmt.Sprintf("#%d", i), func(t *testing.T) { |
|
|
|
err := sniOverWSSRoundtrip(tc.targetURL, sendData, tc.host) |
|
|
|
if err == nil { |
|
|
|
if !tc.pass { |
|
|
|
t.Errorf("#%d should failed", i) |
|
|
|
} |
|
|
|
} else { |
|
|
|
// t.Logf("#%d %v", i, err)
|
|
|
|
if tc.pass { |
|
|
|
t.Errorf("#%d got error: %v", i, err) |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func httpOverMWSSRoundtrip(targetURL string, data []byte, |
|
|
|
clientInfo *url.Userinfo, serverInfo []*url.Userinfo) error { |
|
|
|
|
|
|
|
@ -594,3 +660,68 @@ func TestSSOverMWSS(t *testing.T) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func sniOverMWSSRoundtrip(targetURL string, data []byte, host string) error { |
|
|
|
ln, err := MWSSListener("", nil, nil) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
u, err := url.Parse(targetURL) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
client := &Client{ |
|
|
|
Connector: SNIConnector(host), |
|
|
|
Transporter: MWSSTransporter(nil), |
|
|
|
} |
|
|
|
|
|
|
|
server := &Server{ |
|
|
|
Listener: ln, |
|
|
|
Handler: SNIHandler(HostHandlerOption(u.Host)), |
|
|
|
} |
|
|
|
|
|
|
|
go server.Run() |
|
|
|
defer server.Close() |
|
|
|
|
|
|
|
return sniRoundtrip(client, server, targetURL, data) |
|
|
|
} |
|
|
|
|
|
|
|
func TestSNIOverMWSS(t *testing.T) { |
|
|
|
httpSrv := httptest.NewServer(httpTestHandler) |
|
|
|
defer httpSrv.Close() |
|
|
|
httpsSrv := httptest.NewTLSServer(httpTestHandler) |
|
|
|
defer httpsSrv.Close() |
|
|
|
|
|
|
|
sendData := make([]byte, 128) |
|
|
|
rand.Read(sendData) |
|
|
|
|
|
|
|
var sniProxyTests = []struct { |
|
|
|
targetURL string |
|
|
|
host string |
|
|
|
pass bool |
|
|
|
}{ |
|
|
|
{httpSrv.URL, "", true}, |
|
|
|
{httpSrv.URL, "example.com", true}, |
|
|
|
{httpsSrv.URL, "", true}, |
|
|
|
{httpsSrv.URL, "example.com", true}, |
|
|
|
} |
|
|
|
|
|
|
|
for i, tc := range sniProxyTests { |
|
|
|
tc := tc |
|
|
|
t.Run(fmt.Sprintf("#%d", i), func(t *testing.T) { |
|
|
|
err := sniOverMWSSRoundtrip(tc.targetURL, sendData, tc.host) |
|
|
|
if err == nil { |
|
|
|
if !tc.pass { |
|
|
|
t.Errorf("#%d should failed", i) |
|
|
|
} |
|
|
|
} else { |
|
|
|
// t.Logf("#%d %v", i, err)
|
|
|
|
if tc.pass { |
|
|
|
t.Errorf("#%d got error: %v", i, err) |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|