|
|
@@ -10,6 +10,9 @@ import ( |
|
|
|
"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" |
|
|
|
"net" |
|
|
|
"net/http" |
|
|
|
"net/url" |
|
|
|
"os" |
|
|
|
"regexp" |
|
|
|
"runtime" |
|
|
|
"strings" |
|
|
|
"time" |
|
|
@@ -28,6 +31,33 @@ type Client struct { |
|
|
|
readTimeout time.Duration |
|
|
|
connectTimeout time.Duration |
|
|
|
config *Config |
|
|
|
httpProxy string |
|
|
|
httpsProxy string |
|
|
|
noProxy string |
|
|
|
} |
|
|
|
|
|
|
|
func (client *Client) GetNoProxy() string { |
|
|
|
return client.noProxy |
|
|
|
} |
|
|
|
|
|
|
|
func (client *Client) SetNoProxy(noProxy string) { |
|
|
|
client.noProxy = noProxy |
|
|
|
} |
|
|
|
|
|
|
|
func (client *Client) GetHttpsProxy() string { |
|
|
|
return client.httpsProxy |
|
|
|
} |
|
|
|
|
|
|
|
func (client *Client) SetHttpsProxy(httpsProxy string) { |
|
|
|
client.httpsProxy = httpsProxy |
|
|
|
} |
|
|
|
|
|
|
|
func (client *Client) SetHttpProxy(httpProxy string) { |
|
|
|
client.httpProxy = httpProxy |
|
|
|
} |
|
|
|
|
|
|
|
func (client *Client) GetHttpProxy() string { |
|
|
|
return client.httpProxy |
|
|
|
} |
|
|
|
|
|
|
|
func (client *Client) GetHTTPSInsecure() bool { |
|
|
@@ -146,7 +176,32 @@ func (client *Client) DoAction(request requests.AcsRequest, response responses.A |
|
|
|
|
|
|
|
func (client *Client) DoActionWithSigner(request requests.AcsRequest, response responses.AcsResponse, signer auth.Signer) (err error) { |
|
|
|
|
|
|
|
httpRequest, err := client.buildRequestWithSigner(request, signer) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
client.setTimeOut(request) |
|
|
|
proxy, err := client.getHttpProxy(httpRequest.URL.Scheme) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
|
|
|
|
noProxy := client.getNoProxy(httpRequest.URL.Scheme) |
|
|
|
var flag bool |
|
|
|
for _, value := range noProxy { |
|
|
|
if strings.HasPrefix(value, "*") { |
|
|
|
value = fmt.Sprint(".%s", value) |
|
|
|
} |
|
|
|
noProxyReg, err := regexp.Compile(value) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
if noProxyReg.MatchString(httpRequest.Host) { |
|
|
|
flag = true |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if trans, ok := client.httpClient.Transport.(*http.Transport); ok && trans != nil { |
|
|
|
if trans.TLSClientConfig != nil { |
|
|
@@ -157,13 +212,95 @@ func (client *Client) DoActionWithSigner(request requests.AcsRequest, response r |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if proxy != nil && !flag { |
|
|
|
trans.Proxy = http.ProxyURL(proxy) |
|
|
|
} |
|
|
|
|
|
|
|
client.httpClient.Transport = trans |
|
|
|
} |
|
|
|
|
|
|
|
var httpResponse *http.Response |
|
|
|
|
|
|
|
httpResponse, err = hookDo(client.httpClient.Do)(httpRequest) |
|
|
|
if err == nil { |
|
|
|
for key, val := range httpResponse.Header { |
|
|
|
fmt.Println(key, val) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
func (client *Client) buildRequestWithSigner(request requests.AcsRequest, signer auth.Signer) (httpRequest *http.Request, err error) { |
|
|
|
// init param |
|
|
|
request.SetDomain("") |
|
|
|
if request.GetScheme() == "" { |
|
|
|
request.SetScheme(client.config.Scheme) |
|
|
|
} |
|
|
|
|
|
|
|
err = requests.InitParam(request) |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|
} |
|
|
|
// build request |
|
|
|
err = auth.Sign(request, signer) |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|
} |
|
|
|
requestMethod := request.GetMethod() |
|
|
|
requestUrl := request.BuildUrl() |
|
|
|
body := request.GetBodyReader() |
|
|
|
httpRequest, err = http.NewRequest(requestMethod, requestUrl, body) |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
for key, val := range request.GetHeaders() { |
|
|
|
httpRequest.Header[key] = []string{val} |
|
|
|
} |
|
|
|
|
|
|
|
if host, isContainsHost := request.GetHeaders()["host"]; isContainsHost { |
|
|
|
httpRequest.Host = host |
|
|
|
} |
|
|
|
userAgent := DefaultUserAgent |
|
|
|
httpRequest.Header.Set("User-Agent", userAgent) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
func (client *Client) getHttpProxy(scheme string) (proxy *url.URL, err error) { |
|
|
|
switch scheme { |
|
|
|
case "https": |
|
|
|
if client.GetHttpsProxy() != "" { |
|
|
|
proxy, err = url.Parse(client.httpsProxy) |
|
|
|
} else if rawurl := os.Getenv("HTTPS_PROXY"); rawurl != "" { |
|
|
|
proxy, err = url.Parse(rawurl) |
|
|
|
} else if rawurl := os.Getenv("https_proxy"); rawurl != "" { |
|
|
|
proxy, err = url.Parse(rawurl) |
|
|
|
} |
|
|
|
default: |
|
|
|
if client.GetHttpProxy() != "" { |
|
|
|
proxy, err = url.Parse(client.httpProxy) |
|
|
|
} else if rawurl := os.Getenv("HTTP_PROXY"); rawurl != "" { |
|
|
|
proxy, err = url.Parse(rawurl) |
|
|
|
} else if rawurl := os.Getenv("http_proxy"); rawurl != "" { |
|
|
|
proxy, err = url.Parse(rawurl) |
|
|
|
} |
|
|
|
} |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
func (client *Client) buildRequestWithSigner(request requests.AcsRequest, signer auth.Signer) (httpRequest *requests.HttpRequest, err error) { |
|
|
|
func (client *Client) getNoProxy(scheme string) []string { |
|
|
|
var urls []string |
|
|
|
if client.GetNoProxy() != "" { |
|
|
|
urls = strings.Split(client.noProxy, ",") |
|
|
|
} else if rawurl := os.Getenv("NO_PROXY"); rawurl != "" { |
|
|
|
urls = strings.Split(rawurl, ",") |
|
|
|
} else if rawurl := os.Getenv("no_proxy"); rawurl != "" { |
|
|
|
urls = strings.Split(rawurl, ",") |
|
|
|
} |
|
|
|
return urls |
|
|
|
} |
|
|
|
|
|
|
|
func hookDo(fn func(req *http.Request) (*http.Response, error)) func(req *http.Request) (*http.Response, error) { |
|
|
|
return fn |
|
|
|
} |