agent/wsclient/client.go
func (cs *ClientServerImpl) Connect() error {
	seelog.Infof("Establishing a Websocket connection to %s", cs.URL)
	parsedURL, err := url.Parse(cs.URL)
	if err != nil {
		return err
	}

	wsScheme, err := websocketScheme(parsedURL.Scheme)
	if err != nil {
		return err
	}
	parsedURL.Scheme = wsScheme

	// NewRequest never returns an error if the url parses and we just verified
	// it did above
	request, _ := http.NewRequest("GET", parsedURL.String(), nil)

	// Sign the request; we'll send its headers via the websocket client which includes the signature
	err = utils.SignHTTPRequest(request, cs.AgentConfig.AWSRegion, ServiceName, cs.CredentialProvider, nil)
	if err != nil {
		return err
	}

	timeoutDialer := &net.Dialer{Timeout: wsConnectTimeout}
	tlsConfig := &tls.Config{ServerName: parsedURL.Host, InsecureSkipVerify: cs.AgentConfig.AcceptInsecureCert}
	cipher.WithSupportedCipherSuites(tlsConfig)

	// Ensure that NO_PROXY gets set
	noProxy := os.Getenv("NO_PROXY")
	if noProxy == "" {
		dockerHost, err := url.Parse(cs.AgentConfig.DockerEndpoint)
		if err == nil {
			dockerHost.Scheme = ""
			os.Setenv("NO_PROXY", fmt.Sprintf("%s,%s", defaultNoProxyIP, dockerHost.String()))
			seelog.Info("NO_PROXY set:", os.Getenv("NO_PROXY"))
		} else {
			seelog.Errorf("NO_PROXY unable to be set: the configured Docker endpoint is invalid.")
		}
	}

	dialer := websocket.Dialer{
		ReadBufferSize:   readBufSize,
		WriteBufferSize:  writeBufSize,
		TLSClientConfig:  tlsConfig,
		Proxy:            http.ProxyFromEnvironment,
		NetDial:          timeoutDialer.Dial,
		HandshakeTimeout: wsHandshakeTimeout,
	}

	websocketConn, httpResponse, err := dialer.Dial(parsedURL.String(), request.Header)
	if httpResponse != nil {
		defer httpResponse.Body.Close()
	}

	if err != nil {
		var resp []byte
		if httpResponse != nil {
			var readErr error
			resp, readErr = ioutil.ReadAll(httpResponse.Body)
			if readErr != nil {
				return fmt.Errorf("Unable to read websocket connection: " + readErr.Error() + ", " + err.Error())
			}
			// If there's a response, we can try to unmarshal it into one of the
			// modeled error types
			possibleError, _, decodeErr := DecodeData(resp, cs.TypeDecoder)
			if decodeErr == nil {
				return cs.NewError(possibleError)
			}
		}
		seelog.Warnf("Error creating a websocket client: %v", err)
		return errors.Wrapf(err, "websocket client: unable to dial %s response: %s",
			parsedURL.Host, string(resp))
	}

	cs.writeLock.Lock()
	defer cs.writeLock.Unlock()

	cs.conn = websocketConn
	seelog.Debugf("Established a Websocket connection to %s", cs.URL)
	return nil
}
func (cs *ClientServerImpl) Connect() error {
	seelog.Infof("Establishing a Websocket connection to %s", cs.URL)
	parsedURL, err := url.Parse(cs.URL)
	if err != nil {
		return err
	}

	wsScheme, err := websocketScheme(parsedURL.Scheme)
	if err != nil {
		return err
	}
	parsedURL.Scheme = wsScheme

	// NewRequest never returns an error if the url parses and we just verified
	// it did above
	request, _ := http.NewRequest("GET", parsedURL.String(), nil)

	// Sign the request; we'll send its headers via the websocket client which includes the signature
	err = utils.SignHTTPRequest(request, cs.AgentConfig.AWSRegion, ServiceName, cs.CredentialProvider, nil)
	if err != nil {
		return err
	}

	timeoutDialer := &net.Dialer{Timeout: wsConnectTimeout}
	tlsConfig := &tls.Config{ServerName: parsedURL.Host, InsecureSkipVerify: cs.AgentConfig.AcceptInsecureCert}
	cipher.WithSupportedCipherSuites(tlsConfig)

	// Ensure that NO_PROXY gets set
	noProxy := os.Getenv("NO_PROXY")
	if noProxy == "" {
		dockerHost, err := url.Parse(cs.AgentConfig.DockerEndpoint)
		if err == nil {
			dockerHost.Scheme = ""
			os.Setenv("NO_PROXY", fmt.Sprintf("%s,%s", defaultNoProxyIP, dockerHost.String()))
			seelog.Info("NO_PROXY set:", os.Getenv("NO_PROXY"))
		} else {
			seelog.Errorf("NO_PROXY unable to be set: the configured Docker endpoint is invalid.")
		}
	}

	dialer := websocket.Dialer{
		ReadBufferSize:   readBufSize,
		WriteBufferSize:  writeBufSize,
		TLSClientConfig:  tlsConfig,
		Proxy:            http.ProxyFromEnvironment,
		NetDial:          timeoutDialer.Dial,
		HandshakeTimeout: wsHandshakeTimeout,
	}

	websocketConn, httpResponse, err := dialer.Dial(parsedURL.String(), request.Header)
	if httpResponse != nil {
		defer httpResponse.Body.Close()
	}

	if err != nil {
		var resp []byte
		if httpResponse != nil {
			var readErr error
			resp, readErr = ioutil.ReadAll(httpResponse.Body)
			if readErr != nil {
				return fmt.Errorf("Unable to read websocket connection: " + readErr.Error() + ", " + err.Error())
			}
			// If there's a response, we can try to unmarshal it into one of the
			// modeled error types
			possibleError, _, decodeErr := DecodeData(resp, cs.TypeDecoder)
			if decodeErr == nil {
				return cs.NewError(possibleError)
			}
		}
		seelog.Warnf("Error creating a websocket client: %v", err)
		return errors.Wrapf(err, "websocket client: unable to dial %s response: %s",
			parsedURL.Host, string(resp))
	}

	cs.writeLock.Lock()
	defer cs.writeLock.Unlock()

	cs.conn = websocketConn
	seelog.Debugf("Established a Websocket connection to %s", cs.URL)
	return nil
}
func ( cs * ClientServerImpl ) Connect ( ) error { seelog . Infof ( " " , cs . URL ) parsedURL , err := url . Parse ( cs . URL ) if err != nil { return err } wsScheme , err := websocketScheme ( parsedURL . Scheme ) if err != nil { return err } parsedURL . Scheme = wsScheme // NewRequest never returns an error if the url parses and we just verified // it did above request , _ := http . NewRequest ( " " , parsedURL . String ( ) , nil ) // Sign the request; we'll send its headers via the websocket client which includes the signature err = utils . SignHTTPRequest ( request , cs . AgentConfig . AWSRegion , ServiceName , cs . CredentialProvider , nil ) if err != nil { return err } timeoutDialer := & net . Dialer { Timeout : wsConnectTimeout } tlsConfig := & tls . Config { ServerName : parsedURL . Host , InsecureSkipVerify : cs . AgentConfig . AcceptInsecureCert } cipher . WithSupportedCipherSuites ( tlsConfig ) // Ensure that NO_PROXY gets set noProxy := os . Getenv ( " " ) if noProxy == " " { dockerHost , err := url . Parse ( cs . AgentConfig . DockerEndpoint ) if err == nil { dockerHost . Scheme = " " os . Setenv ( " " , fmt . Sprintf ( " " , defaultNoProxyIP , dockerHost . String ( ) ) ) seelog . Info ( " " , os . Getenv ( " " ) ) } else { seelog . Errorf ( " " ) } } dialer := websocket . Dialer { ReadBufferSize : readBufSize , WriteBufferSize : writeBufSize , TLSClientConfig : tlsConfig , Proxy : http . ProxyFromEnvironment , NetDial : timeoutDialer . Dial , HandshakeTimeout : wsHandshakeTimeout , } websocketConn , httpResponse , err := dialer . Dial ( parsedURL . String ( ) , request . Header ) if httpResponse != nil { defer httpResponse . Body . Close ( ) } if err != nil { var resp [ ] byte if httpResponse != nil { var readErr error resp , readErr = ioutil . ReadAll ( httpResponse . Body ) if readErr != nil { return fmt . Errorf ( " " + readErr . Error ( ) + " " + err . Error ( ) ) } // If there's a response, we can try to unmarshal it into one of the // modeled error types possibleError , _ , decodeErr := DecodeData ( resp , cs . TypeDecoder ) if decodeErr == nil { return cs . NewError ( possibleError ) } } seelog . Warnf ( " " , err ) return errors . Wrapf ( err , " " , parsedURL . Host , string ( resp ) ) } cs . writeLock . Lock ( ) defer cs . writeLock . Unlock ( ) cs . conn = websocketConn seelog . Debugf ( " " , cs . URL ) return nil }
// Connect opens a connection to the backend and upgrades it to a websocket. Calls to
// 'MakeRequest' can be made after calling this, but responses will not be
// receivable until 'Serve' is also called.
Connect opens a connection to the backend and upgrades it to a websocket . Calls to MakeRequest can be made after calling this but responses will not be receivable until Serve is also called .