mirror of
https://github.com/golang/net.git
synced 2026-03-31 18:37:08 +09:00
Right now there is no way to pass context.Context to websocket.Dial.
In addition, this method can block indefinitely in the NewClient call.
Fixes golang/go#57953.
Change-Id: Ic52d4b8306cd0850e78d683abb1bf11f0d4247ca
GitHub-Last-Rev: 5e8c3a7cba
GitHub-Pull-Request: golang/net#160
Reviewed-on: https://go-review.googlesource.com/c/net/+/463097
Auto-Submit: Damien Neil <dneil@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
81 lines
2.2 KiB
Go
81 lines
2.2 KiB
Go
// 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)
|
|
}
|
|
}
|