123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- package docker
- import (
- "crypto/tls"
- "errors"
- "net"
- "strings"
- "time"
- )
- type tlsClientCon struct {
- *tls.Conn
- rawConn net.Conn
- }
- func (c *tlsClientCon) CloseWrite() error {
-
-
- if cwc, ok := c.rawConn.(interface {
- CloseWrite() error
- }); ok {
- return cwc.CloseWrite()
- }
- return nil
- }
- func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Config) (net.Conn, error) {
-
-
-
- timeout := dialer.Timeout
- if !dialer.Deadline.IsZero() {
- deadlineTimeout := dialer.Deadline.Sub(time.Now())
- if timeout == 0 || deadlineTimeout < timeout {
- timeout = deadlineTimeout
- }
- }
- var errChannel chan error
- if timeout != 0 {
- errChannel = make(chan error, 2)
- time.AfterFunc(timeout, func() {
- errChannel <- errors.New("")
- })
- }
- rawConn, err := dialer.Dial(network, addr)
- if err != nil {
- return nil, err
- }
- colonPos := strings.LastIndex(addr, ":")
- if colonPos == -1 {
- colonPos = len(addr)
- }
- hostname := addr[:colonPos]
-
-
- if config.ServerName == "" {
-
- config = copyTLSConfig(config)
- config.ServerName = hostname
- }
- conn := tls.Client(rawConn, config)
- if timeout == 0 {
- err = conn.Handshake()
- } else {
- go func() {
- errChannel <- conn.Handshake()
- }()
- err = <-errChannel
- }
- if err != nil {
- rawConn.Close()
- return nil, err
- }
-
-
- return &tlsClientCon{conn, rawConn}, nil
- }
- func copyTLSConfig(cfg *tls.Config) *tls.Config {
- return &tls.Config{
- Certificates: cfg.Certificates,
- CipherSuites: cfg.CipherSuites,
- ClientAuth: cfg.ClientAuth,
- ClientCAs: cfg.ClientCAs,
- ClientSessionCache: cfg.ClientSessionCache,
- CurvePreferences: cfg.CurvePreferences,
- InsecureSkipVerify: cfg.InsecureSkipVerify,
- MaxVersion: cfg.MaxVersion,
- MinVersion: cfg.MinVersion,
- NameToCertificate: cfg.NameToCertificate,
- NextProtos: cfg.NextProtos,
- PreferServerCipherSuites: cfg.PreferServerCipherSuites,
- Rand: cfg.Rand,
- RootCAs: cfg.RootCAs,
- ServerName: cfg.ServerName,
- SessionTicketKey: cfg.SessionTicketKey,
- SessionTicketsDisabled: cfg.SessionTicketsDisabled,
- }
- }
|