| // Copyright 2015 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package websocket | |
| import ( | |
| "context" | |
| "crypto/tls" | |
| "errors" | |
| "fmt" | |
| "log" | |
| "net" | |
| "net/http" | |
| "net/http/httptest" | |
| "testing" | |
| "time" | |
| ) | |
| // This test depend on Go 1.3+ because in earlier versions the Dialer won't be | |
| // used in TLS connections and a timeout won't be triggered. | |
| func TestDialConfigTLSWithDialer(t *testing.T) { | |
| tlsServer := httptest.NewTLSServer(nil) | |
| tlsServerAddr := tlsServer.Listener.Addr().String() | |
| log.Print("Test TLS WebSocket server listening on ", tlsServerAddr) | |
| defer tlsServer.Close() | |
| config, _ := NewConfig(fmt.Sprintf("wss://%s/echo", tlsServerAddr), "http://localhost") | |
| config.Dialer = &net.Dialer{ | |
| Deadline: time.Now().Add(-time.Minute), | |
| } | |
| config.TlsConfig = &tls.Config{ | |
| InsecureSkipVerify: true, | |
| } | |
| _, err := DialConfig(config) | |
| dialerr, ok := err.(*DialError) | |
| if !ok { | |
| t.Fatalf("DialError expected, got %#v", err) | |
| } | |
| neterr, ok := dialerr.Err.(*net.OpError) | |
| if !ok { | |
| t.Fatalf("net.OpError error expected, got %#v", dialerr.Err) | |
| } | |
| if !neterr.Timeout() { | |
| t.Fatalf("expected timeout error, got %#v", neterr) | |
| } | |
| } | |
| func TestDialConfigTLSWithTimeouts(t *testing.T) { | |
| t.Parallel() | |
| finishedRequest := make(chan bool) | |
| // Context for cancellation | |
| ctx, cancel := context.WithCancel(context.Background()) | |
| // This is a TLS server that blocks each request indefinitely (and cancels the context) | |
| tlsServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | |
| cancel() | |
| <-finishedRequest | |
| })) | |
| tlsServerAddr := tlsServer.Listener.Addr().String() | |
| log.Print("Test TLS WebSocket server listening on ", tlsServerAddr) | |
| defer tlsServer.Close() | |
| defer close(finishedRequest) | |
| config, _ := NewConfig(fmt.Sprintf("wss://%s/echo", tlsServerAddr), "http://localhost") | |
| config.TlsConfig = &tls.Config{ | |
| InsecureSkipVerify: true, | |
| } | |
| _, err := config.DialContext(ctx) | |
| dialerr, ok := err.(*DialError) | |
| if !ok { | |
| t.Fatalf("DialError expected, got %#v", err) | |
| } | |
| if !errors.Is(dialerr.Err, context.Canceled) { | |
| t.Fatalf("context.Canceled error expected, got %#v", dialerr.Err) | |
| } | |
| } |