docker/docker_client.go
func (c *dockerClient) detectPropertiesHelper(ctx context.Context) error {
	if c.scheme != "" {
		return nil
	}

	// We overwrite the TLS clients `InsecureSkipVerify` only if explicitly
	// specified by the system context
	if c.sys != nil && c.sys.DockerInsecureSkipTLSVerify != types.OptionalBoolUndefined {
		c.tlsClientConfig.InsecureSkipVerify = c.sys.DockerInsecureSkipTLSVerify == types.OptionalBoolTrue
	}

	ping := func(scheme string) error {
		url := fmt.Sprintf(resolvedPingV2URL, scheme, c.registry)
		resp, err := c.makeRequestToResolvedURL(ctx, "GET", url, nil, nil, -1, noAuth, nil)
		if err != nil {
			logrus.Debugf("Ping %s err %s (%#v)", url, err.Error(), err)
			return err
		}
		defer resp.Body.Close()
		logrus.Debugf("Ping %s status %d", url, resp.StatusCode)
		if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusUnauthorized {
			return errors.Errorf("error pinging registry %s, response code %d (%s)", c.registry, resp.StatusCode, http.StatusText(resp.StatusCode))
		}
		c.challenges = parseAuthHeader(resp.Header)
		c.scheme = scheme
		c.supportsSignatures = resp.Header.Get("X-Registry-Supports-Signatures") == "1"
		return nil
	}
	err := ping("https")
	if err != nil && c.tlsClientConfig.InsecureSkipVerify {
		err = ping("http")
	}
	if err != nil {
		err = errors.Wrap(err, "pinging docker registry returned")
		if c.sys != nil && c.sys.DockerDisableV1Ping {
			return err
		}
		// best effort to understand if we're talking to a V1 registry
		pingV1 := func(scheme string) bool {
			url := fmt.Sprintf(resolvedPingV1URL, scheme, c.registry)
			resp, err := c.makeRequestToResolvedURL(ctx, "GET", url, nil, nil, -1, noAuth, nil)
			if err != nil {
				logrus.Debugf("Ping %s err %s (%#v)", url, err.Error(), err)
				return false
			}
			defer resp.Body.Close()
			logrus.Debugf("Ping %s status %d", url, resp.StatusCode)
			if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusUnauthorized {
				return false
			}
			return true
		}
		isV1 := pingV1("https")
		if !isV1 && c.tlsClientConfig.InsecureSkipVerify {
			isV1 = pingV1("http")
		}
		if isV1 {
			err = ErrV1NotSupported
		}
	}
	return err
}
func (c *dockerClient) detectPropertiesHelper(ctx context.Context) error {
	if c.scheme != "" {
		return nil
	}

	// We overwrite the TLS clients `InsecureSkipVerify` only if explicitly
	// specified by the system context
	if c.sys != nil && c.sys.DockerInsecureSkipTLSVerify != types.OptionalBoolUndefined {
		c.tlsClientConfig.InsecureSkipVerify = c.sys.DockerInsecureSkipTLSVerify == types.OptionalBoolTrue
	}

	ping := func(scheme string) error {
		url := fmt.Sprintf(resolvedPingV2URL, scheme, c.registry)
		resp, err := c.makeRequestToResolvedURL(ctx, "GET", url, nil, nil, -1, noAuth, nil)
		if err != nil {
			logrus.Debugf("Ping %s err %s (%#v)", url, err.Error(), err)
			return err
		}
		defer resp.Body.Close()
		logrus.Debugf("Ping %s status %d", url, resp.StatusCode)
		if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusUnauthorized {
			return errors.Errorf("error pinging registry %s, response code %d (%s)", c.registry, resp.StatusCode, http.StatusText(resp.StatusCode))
		}
		c.challenges = parseAuthHeader(resp.Header)
		c.scheme = scheme
		c.supportsSignatures = resp.Header.Get("X-Registry-Supports-Signatures") == "1"
		return nil
	}
	err := ping("https")
	if err != nil && c.tlsClientConfig.InsecureSkipVerify {
		err = ping("http")
	}
	if err != nil {
		err = errors.Wrap(err, "pinging docker registry returned")
		if c.sys != nil && c.sys.DockerDisableV1Ping {
			return err
		}
		// best effort to understand if we're talking to a V1 registry
		pingV1 := func(scheme string) bool {
			url := fmt.Sprintf(resolvedPingV1URL, scheme, c.registry)
			resp, err := c.makeRequestToResolvedURL(ctx, "GET", url, nil, nil, -1, noAuth, nil)
			if err != nil {
				logrus.Debugf("Ping %s err %s (%#v)", url, err.Error(), err)
				return false
			}
			defer resp.Body.Close()
			logrus.Debugf("Ping %s status %d", url, resp.StatusCode)
			if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusUnauthorized {
				return false
			}
			return true
		}
		isV1 := pingV1("https")
		if !isV1 && c.tlsClientConfig.InsecureSkipVerify {
			isV1 = pingV1("http")
		}
		if isV1 {
			err = ErrV1NotSupported
		}
	}
	return err
}
func ( c * dockerClient ) detectPropertiesHelper ( ctx context . Context ) error { if c . scheme != " " { return nil } // We overwrite the TLS clients `InsecureSkipVerify` only if explicitly // specified by the system context if c . sys != nil && c . sys . DockerInsecureSkipTLSVerify != types . OptionalBoolUndefined { c . tlsClientConfig . InsecureSkipVerify = c . sys . DockerInsecureSkipTLSVerify == types . OptionalBoolTrue } ping := func ( scheme string ) error { url := fmt . Sprintf ( resolvedPingV2URL , scheme , c . registry ) resp , err := c . makeRequestToResolvedURL ( ctx , " " , url , nil , nil , - 1 , noAuth , nil ) if err != nil { logrus . Debugf ( " " , url , err . Error ( ) , err ) return err } defer resp . Body . Close ( ) logrus . Debugf ( " " , url , resp . StatusCode ) if resp . StatusCode != http . StatusOK && resp . StatusCode != http . StatusUnauthorized { return errors . Errorf ( " " , c . registry , resp . StatusCode , http . StatusText ( resp . StatusCode ) ) } c . challenges = parseAuthHeader ( resp . Header ) c . scheme = scheme c . supportsSignatures = resp . Header . Get ( " " ) == " " return nil } err := ping ( " " ) if err != nil && c . tlsClientConfig . InsecureSkipVerify { err = ping ( " " ) } if err != nil { err = errors . Wrap ( err , " " ) if c . sys != nil && c . sys . DockerDisableV1Ping { return err } // best effort to understand if we're talking to a V1 registry pingV1 := func ( scheme string ) bool { url := fmt . Sprintf ( resolvedPingV1URL , scheme , c . registry ) resp , err := c . makeRequestToResolvedURL ( ctx , " " , url , nil , nil , - 1 , noAuth , nil ) if err != nil { logrus . Debugf ( " " , url , err . Error ( ) , err ) return false } defer resp . Body . Close ( ) logrus . Debugf ( " " , url , resp . StatusCode ) if resp . StatusCode != http . StatusOK && resp . StatusCode != http . StatusUnauthorized { return false } return true } isV1 := pingV1 ( " " ) if ! isV1 && c . tlsClientConfig . InsecureSkipVerify { isV1 = pingV1 ( " " ) } if isV1 { err = ErrV1NotSupported } } return err }
// detectPropertiesHelper performs the work of detectProperties which executes
// it at most once.
detectPropertiesHelper performs the work of detectProperties which executes it at most once .