func()

in datahub/restclient.go [150:235]


func (client *RestClient) request(method, resource string, requestModel RequestModel, para *RequestParameter) ([]byte, *CommonResponseResult, error) {
	url := fmt.Sprintf("%s%s", client.Endpoint, resource)

	header := map[string]string{
		httpHeaderClientVersion: DATAHUB_CLIENT_VERSION,
		httpHeaderDate:          time.Now().UTC().Format(http.TimeFormat),
		httpHeaderUserAgent:     client.Useragent,
	}

	//serialization
	reqBody, err := requestModel.requestBodyEncode()
	if err != nil {
		return nil, nil, err
	}

	rawSize := len(reqBody)
	client.compressIfNeed(header, &reqBody)
	reqSize := len(reqBody)

	if client.Account.GetSecurityToken() != "" {
		header[httpHeaderSecurityToken] = client.Account.GetSecurityToken()
	}

	if credential, ok := client.Account.(*DwarfCredential); ok &&
		len(credential.DwarfToken) > 0 && len(credential.DwarfSign) > 0 {
		header[httpHeaderDwarfToken] = credential.DwarfToken
		header[httpHeaderDwarfSign] = credential.DwarfSign
	}

	req, err := http.NewRequest(method, url, bytes.NewBuffer(reqBody))
	if err != nil {
		return nil, nil, err
	}

	if para != nil {
		for k, v := range para.Header {
			header[k] = v
		}

		query := req.URL.Query()
		for k, v := range para.Query {
			query.Add(k, v)
		}
		req.URL.RawQuery = query.Encode()
	}

	for k, v := range header {
		req.Header.Add(k, v)
	}

	client.buildSignature(&req.Header, method, req.URL.RequestURI())

	resp, err := client.HttpClient.Do(req)
	if err != nil {
		if strings.Contains(err.Error(), "EOF") {
			return nil, nil, NewServiceTemporaryUnavailableError(err.Error())
		}
		return nil, nil, err
	}
	defer resp.Body.Close()
	respBody, err := io.ReadAll(resp.Body)

	if err != nil {
		return nil, nil, err
	}

	//decompress
	if err := client.decompress(&respBody, &resp.Header); err != nil {
		return nil, nil, err
	}

	//detect error
	respResult, err := newCommonResponseResult(resp.StatusCode, &resp.Header, respBody)
	if log.IsLevelEnabled(log.DebugLevel) {
		log.Debugf("request id: %s\nrequest url: %s\nrequest headers: %v\nrequest body: %s\nresponse headers: %v\nresponse body: %s",
			respResult.RequestId, url, req.Header, string(reqBody), resp.Header, string(respBody))
	}

	if err != nil {
		return nil, nil, err
	}

	respResult.RawSize = rawSize
	respResult.ReqSize = reqSize
	return respBody, respResult, nil
}