func()

in pkg/rest/client.go [93:150]


func (client *URLClient) HTTPDoWithContext(ctx context.Context, method string, rawURL string, headers http.Header, body []byte) (resp *http.Response, err error) {
	if strings.HasPrefix(rawURL, "https") {
		if transport, ok := client.Client.Transport.(*http.Transport); ok {
			transport.TLSClientConfig = client.TLS
		}
	}

	if headers == nil {
		headers = make(http.Header)
	}

	if _, ok := headers[HeaderHost]; !ok {
		parsedURL, err := url.Parse(rawURL)
		if err != nil {
			return nil, err
		}
		headers.Set(HeaderHost, parsedURL.Host)
	}
	if _, ok := headers[HeaderAccept]; !ok {
		headers.Set(HeaderAccept, AcceptAny)
	}
	if _, ok := headers[HeaderAcceptEncoding]; !ok && client.Cfg.Compressed {
		headers.Set(HeaderAcceptEncoding, "deflate, gzip")
	}

	req, err := http.NewRequest(method, rawURL, bytes.NewBuffer(body))
	if err != nil {
		return nil, fmt.Errorf("create request failed: %s", err.Error())
	}
	req = req.WithContext(ctx)
	req.Header = headers

	DumpRequestOut(req)

	resp, err = client.Client.Do(req)
	if err != nil {
		return nil, err
	}
	DumpResponse(resp)

	switch resp.Header.Get(HeaderContentEncoding) {
	case "gzip":
		reader, err := NewGZipBodyReader(resp.Body)
		if err != nil {
			_, err = io.Copy(io.Discard, resp.Body)
			if err != nil {
				log.Error("", err)
				resp.Body.Close()
				return nil, err
			}
			resp.Body.Close()
			return nil, err
		}
		resp.Body = reader
	}

	return resp, nil
}