| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- package ws_test
- import (
- "io/ioutil"
- "testing"
- "time"
- v2net "v2ray.com/core/common/net"
- "v2ray.com/core/testing/assert"
- "v2ray.com/core/transport/internet"
- v2tls "v2ray.com/core/transport/internet/tls"
- . "v2ray.com/core/transport/internet/ws"
- "github.com/golang/protobuf/ptypes"
- "github.com/golang/protobuf/ptypes/any"
- )
- func MarshalSettings(config *Config, assert *assert.Assert) *any.Any {
- anySettings, err := ptypes.MarshalAny(config)
- assert.Error(err).IsNil()
- return anySettings
- }
- func Test_Connect_ws(t *testing.T) {
- assert := assert.On(t)
- conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 80), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "",
- }, assert),
- },
- },
- },
- })
- assert.Error(err).IsNil()
- conn.Write([]byte("echo"))
- s := make(chan int)
- go func() {
- buf := make([]byte, 4)
- conn.Read(buf)
- str := string(buf)
- if str != "echo" {
- assert.Fail("Data mismatch")
- }
- s <- 0
- }()
- <-s
- conn.Close()
- }
- func Test_Connect_wss(t *testing.T) {
- assert := assert.On(t)
- conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "",
- }, assert),
- },
- },
- SecurityType: internet.SecurityType_TLS,
- },
- })
- assert.Error(err).IsNil()
- conn.Write([]byte("echo"))
- s := make(chan int)
- go func() {
- buf := make([]byte, 4)
- conn.Read(buf)
- str := string(buf)
- if str != "echo" {
- assert.Fail("Data mismatch")
- }
- s <- 0
- }()
- <-s
- conn.Close()
- }
- func Test_Connect_wss_1_nil(t *testing.T) {
- assert := assert.On(t)
- conn, err := Dial(nil, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "",
- }, assert),
- },
- },
- SecurityType: internet.SecurityType_TLS,
- },
- })
- assert.Error(err).IsNil()
- conn.Write([]byte("echo"))
- s := make(chan int)
- go func() {
- buf := make([]byte, 4)
- conn.Read(buf)
- str := string(buf)
- if str != "echo" {
- assert.Fail("Data mismatch")
- }
- s <- 0
- }()
- <-s
- conn.Close()
- }
- func Test_Connect_ws_guess(t *testing.T) {
- assert := assert.On(t)
- conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 80), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "",
- }, assert),
- },
- },
- },
- })
- assert.Error(err).IsNil()
- conn.Write([]byte("echo"))
- s := make(chan int)
- go func() {
- buf := make([]byte, 4)
- conn.Read(buf)
- str := string(buf)
- if str != "echo" {
- assert.Fail("Data mismatch")
- }
- s <- 0
- }()
- <-s
- conn.Close()
- }
- func Test_Connect_wss_guess(t *testing.T) {
- assert := assert.On(t)
- conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "",
- }, assert),
- },
- },
- SecurityType: internet.SecurityType_TLS,
- },
- })
- assert.Error(err).IsNil()
- conn.Write([]byte("echo"))
- s := make(chan int)
- go func() {
- buf := make([]byte, 4)
- conn.Read(buf)
- str := string(buf)
- if str != "echo" {
- assert.Fail("Data mismatch")
- }
- s <- 0
- }()
- <-s
- conn.Close()
- }
- func Test_Connect_wss_guess_fail(t *testing.T) {
- assert := assert.On(t)
- _, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("static.kkdev.org"), 443), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "",
- }, assert),
- },
- },
- SecurityType: internet.SecurityType_TLS,
- },
- })
- assert.Error(err).IsNotNil()
- }
- func Test_Connect_wss_guess_reuse(t *testing.T) {
- assert := assert.On(t)
- i := 3
- for i != 0 {
- conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("echo.websocket.org"), 443), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "",
- ConnectionReuse: true,
- }, assert),
- },
- },
- SecurityType: internet.SecurityType_TLS,
- },
- })
- assert.Error(err).IsNil()
- conn.Write([]byte("echo"))
- s := make(chan int)
- go func() {
- buf := make([]byte, 4)
- conn.Read(buf)
- str := string(buf)
- if str != "echo" {
- assert.Fail("Data mismatch")
- }
- s <- 0
- }()
- <-s
- if i == 0 {
- conn.SetDeadline(time.Now())
- conn.SetReadDeadline(time.Now())
- conn.SetWriteDeadline(time.Now())
- conn.SetReusable(false)
- }
- conn.Close()
- i--
- }
- }
- func Test_listenWSAndDial(t *testing.T) {
- assert := assert.On(t)
- listen, err := ListenWS(v2net.DomainAddress("localhost"), 13142, internet.ListenOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "ws",
- }, assert),
- },
- },
- },
- })
- assert.Error(err).IsNil()
- go func() {
- conn, err := listen.Accept()
- assert.Error(err).IsNil()
- conn.Close()
- conn, err = listen.Accept()
- assert.Error(err).IsNil()
- conn.Close()
- conn, err = listen.Accept()
- assert.Error(err).IsNil()
- conn.Close()
- listen.Close()
- }()
- conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13142), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "ws",
- }, assert),
- },
- },
- },
- })
- assert.Error(err).IsNil()
- conn.Close()
- <-time.After(time.Second * 5)
- conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13142), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "ws",
- }, assert),
- },
- },
- },
- })
- assert.Error(err).IsNil()
- conn.Close()
- <-time.After(time.Second * 15)
- conn, err = Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13142), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "ws",
- }, assert),
- },
- },
- },
- })
- assert.Error(err).IsNil()
- conn.Close()
- }
- func Test_listenWSAndDial_TLS(t *testing.T) {
- assert := assert.On(t)
- go func() {
- <-time.After(time.Second * 5)
- assert.Fail("Too slow")
- }()
- tlsSettings := &v2tls.Config{
- AllowInsecure: true,
- Certificate: []*v2tls.Certificate{
- {
- Certificate: ReadFile("./../../../testing/tls/cert.pem", assert),
- Key: ReadFile("./../../../testing/tls/key.pem", assert),
- },
- },
- }
- anyTlsSettings, err := ptypes.MarshalAny(tlsSettings)
- assert.Error(err).IsNil()
- listen, err := ListenWS(v2net.DomainAddress("localhost"), 13143, internet.ListenOptions{
- Stream: &internet.StreamConfig{
- SecurityType: internet.SecurityType_TLS,
- SecuritySettings: []*internet.SecuritySettings{{
- Type: internet.SecurityType_TLS,
- Settings: anyTlsSettings,
- }},
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "wss",
- ConnectionReuse: true,
- }, assert),
- },
- },
- },
- })
- assert.Error(err).IsNil()
- go func() {
- conn, err := listen.Accept()
- assert.Error(err).IsNil()
- conn.Close()
- listen.Close()
- }()
- conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13143), internet.DialerOptions{
- Stream: &internet.StreamConfig{
- SecurityType: internet.SecurityType_TLS,
- SecuritySettings: []*internet.SecuritySettings{{
- Type: internet.SecurityType_TLS,
- Settings: anyTlsSettings,
- }},
- Network: v2net.Network_WebSocket,
- NetworkSettings: []*internet.NetworkSettings{
- {
- Network: v2net.Network_WebSocket,
- Settings: MarshalSettings(&Config{
- Path: "wss",
- ConnectionReuse: true,
- }, assert),
- },
- },
- },
- })
- assert.Error(err).IsNil()
- conn.Close()
- }
- func ReadFile(file string, assert *assert.Assert) []byte {
- b, err := ioutil.ReadFile(file)
- assert.Error(err).IsNil()
- return b
- }
|