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
}