调试huawei obs go 程序为何没有使用http_proxy?

obs go

https://github.com/huaweicloud/huaweicloud-sdk-go-obs/tree/master

// New creates a new ObsClient instance.
func New(ak, sk, endpoint string, configurers ...configurer) (*ObsClient, error) {
	conf := &config{endpoint: endpoint}
	conf.securityProviders = make([]securityProvider, 0, 3)
	conf.securityProviders = append(conf.securityProviders, NewBasicSecurityProvider(ak, sk, ""))

	conf.maxRetryCount = -1
	conf.maxRedirectCount = -1
	for _, configurer := range configurers {
		configurer(conf)
	}

	if err := conf.initConfigWithDefault(); err != nil {
		return nil, err
	}
	err := conf.getTransport()
	if err != nil {
		return nil, err
	}
    //....
}
func (conf *config) getTransport() error {
	if conf.transport == nil {
		conf.transport = &http.Transport{
			Dial: func(network, addr string) (net.Conn, error) {
				conn, err := net.DialTimeout(network, addr, time.Second*time.Duration(conf.connectTimeout))
				if err != nil {
					return nil, err
				}
				return getConnDelegate(conn, conf.socketTimeout, conf.finalTimeout), nil
			},
			MaxIdleConns:          conf.maxConnsPerHost,
			MaxIdleConnsPerHost:   conf.maxConnsPerHost,
			ResponseHeaderTimeout: time.Second * time.Duration(conf.headerTimeout),
			IdleConnTimeout:       time.Second * time.Duration(conf.idleConnTimeout),
			DisableKeepAlives:     conf.disableKeepAlive,
		}
		if conf.proxyURL != "" {
			conf.transport.Proxy = conf.customProxyFromEnvironment
		} else if conf.proxyFromEnv {
			conf.transport.Proxy = http.ProxyFromEnvironment                 //需要设置conf.proxyFromEnv
		}

		tlsConfig := &tls.Config{InsecureSkipVerify: !conf.sslVerify}
		if conf.sslVerify && conf.pemCerts != nil {
			pool := x509.NewCertPool()
			pool.AppendCertsFromPEM(conf.pemCerts)
			tlsConfig.RootCAs = pool
		}

		conf.transport.TLSClientConfig = tlsConfig
		conf.transport.DisableCompression = !conf.enableCompression
	}

	return nil
}

func newDownloadSample(ak, sk, endpoint, bucketName, objectKey, location string) *DownloadSample {
	obsClient, err := obs.New(ak, sk, endpoint)
	if err != nil {
		panic(err)
	}
	return &DownloadSample{obsClient: obsClient, bucketName: bucketName, objectKey: objectKey, location: location}
}

在 obs.New 之后可以加一个打印:

obsClient.conf.proxyURL,
obsClient.conf.noProxyURL,
obsClient.conf.proxyFromEnv

func WithProxyUrl(proxyURL string) configurer {
	return func(conf *config) {
		conf.proxyURL = proxyURL
	}
}

// WithNoProxyUrl is a configurer for ObsClient to set HTTP no_proxy.
func WithNoProxyUrl(noProxyURL string) configurer {
	return func(conf *config) {
		conf.noProxyURL = noProxyURL
	}
}

当要使用代理时,需要这样去显示的定义obsclient

obsClient, err := obs.New(ak, sk, endpoint, obs.WithProxyUrl("http://xxxx:YYYY"),obs.WithNoProxyUrl(""))

python sdk 没有问题吗?

https://github.com/huaweicloud/huaweicloud-sdk-python-obs/tree/master

我看代码,不会读取os env : http_proxy

class _BasicClient(object):
    def __init__(self, access_key_id='', secret_access_key='', is_secure=True, server=None,
                 signature='obs', region='region', path_style=False, ssl_verify=False,
                 port=None, max_retry_count=3, timeout=60, chunk_size=const.READ_ONCE_LENGTH,
                 long_conn_mode=False, proxy_host=None, proxy_port=None,
                 proxy_username=None, proxy_password=None, security_token=None,
                 custom_ciphers=None, use_http2=False, is_signature_negotiation=True, is_cname=False,
                 max_redirect_count=10, security_providers=None, security_provider_policy=None, client_mode='obs',
                 use_http_conns=False, pool_size=const.CONNECTION_POOL_SIZE, trust_env=False):
        self.securityProvider = _SecurityProvider(access_key_id, secret_access_key, security_token)
        server = server if server is not None else ''
        server = util.to_string(util.safe_encode(server))

        _server = urlparse(server)

        hostname = self._parse_server_hostname(_server)
        is_secure = self._check_server_secure(_server, is_secure)
        host_port, port = self._split_host_port(hostname, port)
        self.security_provider_policy = security_provider_policy
        self._parse_security_providers(security_providers)

        self.is_secure = is_secure
        self.server = host_port[0]

        path_style = self._check_path_style(path_style)
        self.signature = util.to_string(util.safe_encode(signature))
        self.region = region
        self.path_style = path_style
        self.ssl_verify = ssl_verify
        self.calling_format = self._parse_calling_format()
        self.port = self._parse_port(port, is_secure)

        if timeout is None:
            raise Exception('timeout can not be None')
        self.max_retry_count = max_retry_count
        self.timeout = timeout
        self.chunk_size = chunk_size
        self.log_client = NoneLogClient()
        self.use_http2 = use_http2
        self.is_signature_negotiation = is_signature_negotiation
        self.is_cname = is_cname
        self.max_redirect_count = max_redirect_count

        if client_mode == 'obs':
            if self.path_style or self.is_cname:
                self.is_signature_negotiation = False
                if self.signature == 'obs':
                    self.signature = 'v2'
        elif client_mode == 'workflow':
            self.is_signature_negotiation = False

        self.context = None
        if self.is_secure:
            if self.use_http2:
                from obs import http2
                self.context = http2._get_ssl_context(self.ssl_verify)
            else:
                self._init_ssl_context(custom_ciphers)

        self.long_conn_mode = long_conn_mode
        self.use_http_conns = use_http_conns
        self.connHolder = None
        if self.long_conn_mode and not self.use_http_conns:
            self._init_connHolder()

        self.proxy_host = proxy_host
        self.proxy_port = proxy_port
        self.proxy_username = proxy_username
        self.proxy_password = proxy_password

问题: 为何obsutils 可以读取http_proxy环境变量?

https://github.com/huaweicloud/huaweicloud-obs-obsutil.git

func createObsClient(suffix string, autoChooseSecurityProvider bool) (*obs.ObsClient, error) {
	connectTimeout := assist.StringToInt(config["connectTimeout"], defaultConnectTimeout)
	socketTimeout := assist.StringToInt(config["socketTimeout"], defaultSocketTimeout)
	maxRetryCount := assist.StringToInt(config["maxRetryCount"], defaultMaxRetryCount)
	maxConnections := assist.StringToInt(config["maxConnections"], defaultMaxConnections)

	endpoint := strings.TrimSpace(config["endpoint"+suffix])
	if endpoint == "" {
		endpoint = defaultEndpoint
	}

	proxyUrl := strings.TrimSpace(config["proxyUrl"])
	if proxyUrl == "" {
		proxyUrl = strings.TrimSpace(os.Getenv("HTTPS_PROXY"))
		if proxyUrl == "" {
			proxyUrl = strings.TrimSpace(os.Getenv("HTTP_PROXY"))
		}
	}
    //

}
posted @ 2025-05-01 20:14  todaygood  阅读(9)  评论(0)    收藏  举报