|
|
@ -2,6 +2,7 @@ package tcp
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
"crypto/tls"
|
|
|
|
"crypto/tls"
|
|
|
|
|
|
|
|
"errors"
|
|
|
|
"net"
|
|
|
|
"net"
|
|
|
|
"os"
|
|
|
|
"os"
|
|
|
|
"testing"
|
|
|
|
"testing"
|
|
|
@ -28,7 +29,7 @@ func Test_DialerNoConnect(t *testing.T) {
|
|
|
|
func Test_DialerHeader(t *testing.T) {
|
|
|
|
func Test_DialerHeader(t *testing.T) {
|
|
|
|
s := mustNewEchoServer()
|
|
|
|
s := mustNewEchoServer()
|
|
|
|
defer s.Close()
|
|
|
|
defer s.Close()
|
|
|
|
go s.MustStart()
|
|
|
|
go s.Start(t)
|
|
|
|
|
|
|
|
|
|
|
|
d := NewDialer(64, false, false)
|
|
|
|
d := NewDialer(64, false, false)
|
|
|
|
conn, err := d.Dial(s.Addr(), 10*time.Second)
|
|
|
|
conn, err := d.Dial(s.Addr(), 10*time.Second)
|
|
|
@ -37,6 +38,8 @@ func Test_DialerHeader(t *testing.T) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
buf := make([]byte, 1)
|
|
|
|
buf := make([]byte, 1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
conn.SetReadDeadline(time.Now().Add(5 * time.Second))
|
|
|
|
_, err = conn.Read(buf)
|
|
|
|
_, err = conn.Read(buf)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("failed to read from echo server: %s", err.Error())
|
|
|
|
t.Fatalf("failed to read from echo server: %s", err.Error())
|
|
|
@ -51,15 +54,17 @@ func Test_DialerHeaderTLS(t *testing.T) {
|
|
|
|
defer s.Close()
|
|
|
|
defer s.Close()
|
|
|
|
defer os.Remove(cert)
|
|
|
|
defer os.Remove(cert)
|
|
|
|
defer os.Remove(key)
|
|
|
|
defer os.Remove(key)
|
|
|
|
go s.MustStart()
|
|
|
|
go s.Start(t)
|
|
|
|
|
|
|
|
|
|
|
|
d := NewDialer(23, true, true)
|
|
|
|
d := NewDialer(23, true, true)
|
|
|
|
conn, err := d.Dial(s.Addr(), 10*time.Second)
|
|
|
|
conn, err := d.Dial(s.Addr(), 5*time.Second)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("failed to dial TLS echo server: %s", err.Error())
|
|
|
|
t.Fatalf("failed to dial TLS echo server: %s", err.Error())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
buf := make([]byte, 1)
|
|
|
|
buf := make([]byte, 1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
conn.SetReadDeadline(time.Now().Add(5 * time.Second))
|
|
|
|
_, err = conn.Read(buf)
|
|
|
|
_, err = conn.Read(buf)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("failed to read from TLS echo server: %s", err.Error())
|
|
|
|
t.Fatalf("failed to read from TLS echo server: %s", err.Error())
|
|
|
@ -69,6 +74,30 @@ func Test_DialerHeaderTLS(t *testing.T) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func Test_DialerHeaderTLSBadConnect(t *testing.T) {
|
|
|
|
|
|
|
|
s, cert, key := mustNewEchoServerTLS()
|
|
|
|
|
|
|
|
defer s.Close()
|
|
|
|
|
|
|
|
defer os.Remove(cert)
|
|
|
|
|
|
|
|
defer os.Remove(key)
|
|
|
|
|
|
|
|
go s.Start(t)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Connect to a TLS server with a unencrypted client, to make sure
|
|
|
|
|
|
|
|
// code can handle that misconfig.
|
|
|
|
|
|
|
|
d := NewDialer(56, false, false)
|
|
|
|
|
|
|
|
conn, err := d.Dial(s.Addr(), 5*time.Second)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
t.Fatalf("failed to dial TLS echo server: %s", err.Error())
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
buf := make([]byte, 1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
conn.SetReadDeadline(time.Now().Add(2 * time.Second))
|
|
|
|
|
|
|
|
_, err = conn.Read(buf)
|
|
|
|
|
|
|
|
if err != nil && !errors.Is(err, os.ErrDeadlineExceeded) {
|
|
|
|
|
|
|
|
t.Fatalf("unexpected error from TLS echo server: %s", err.Error())
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type echoServer struct {
|
|
|
|
type echoServer struct {
|
|
|
|
ln net.Listener
|
|
|
|
ln net.Listener
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -78,22 +107,26 @@ func (e *echoServer) Addr() string {
|
|
|
|
return e.ln.Addr().String()
|
|
|
|
return e.ln.Addr().String()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// MustStart starts the echo server.
|
|
|
|
// Start starts the echo server.
|
|
|
|
func (e *echoServer) MustStart() {
|
|
|
|
func (e *echoServer) Start(t *testing.T) {
|
|
|
|
for {
|
|
|
|
for {
|
|
|
|
conn, err := e.ln.Accept()
|
|
|
|
conn, err := e.ln.Accept()
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
if errors.Is(err, net.ErrClosed) {
|
|
|
|
|
|
|
|
// Successful testing can cause this.
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Fatalf("failed to accept a connection: %s", err.Error())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
go func(c net.Conn) {
|
|
|
|
go func(c net.Conn) {
|
|
|
|
buf := make([]byte, 1)
|
|
|
|
buf := make([]byte, 1)
|
|
|
|
_, err := c.Read(buf)
|
|
|
|
_, err := c.Read(buf)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
panic("failed to read byte")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_, err = c.Write(buf)
|
|
|
|
_, err = c.Write(buf)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
panic("failed to echo received byte")
|
|
|
|
t.Fatalf("failed to write byte: %s", err.Error())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
c.Close()
|
|
|
|
c.Close()
|
|
|
|
}(conn)
|
|
|
|
}(conn)
|
|
|
|