func()

in alibabacloud-gateway-sls/golang/client/client.go [56:185]


func (client *Client) ModifyRequest(context *spi.InterceptorContext, attributeMap *spi.AttributeMap) (_err error) {
	request := context.Request
	hostMap := make(map[string]*string)
	if !tea.BoolValue(util.IsUnset(request.HostMap)) {
		hostMap = request.HostMap
	}

	project := hostMap["project"]
	config := context.Configuration
	credential := request.Credential
	credentialModel, _err := credential.GetCredential()
	if _err != nil {
		return _err
	}

	accessKeyId := credentialModel.AccessKeyId
	accessKeySecret := credentialModel.AccessKeySecret
	securityToken := credentialModel.SecurityToken
	if !tea.BoolValue(util.Empty(securityToken)) {
		request.Headers["x-acs-security-token"] = securityToken
	}

	signatureVersion := util.DefaultString(request.SignatureVersion, tea.String("v1"))
	finalCompressType, _err := client.GetFinalRequestCompressType(request.Action, request.Headers)
	if _err != nil {
		return _err
	}

	contentHash := tea.String("")
	// get body bytes
	var bodyBytes []byte
	if !tea.BoolValue(util.IsUnset(request.Body)) {
		if tea.BoolValue(string_.Equals(request.ReqBodyType, tea.String("json"))) || tea.BoolValue(string_.Equals(request.ReqBodyType, tea.String("formData"))) {
			request.Headers["content-type"] = tea.String("application/json")
			bodyStr := util.ToJSONString(request.Body)
			bodyBytes = util.ToBytes(bodyStr)
		} else if tea.BoolValue(string_.Equals(request.ReqBodyType, tea.String("binary"))) {
			// content-type: application/octet-stream
			bodyBytes, _err = util.AssertAsBytes(request.Body)
			if _err != nil {
				return _err
			}

		}

	}

	// get body raw size
	bodyRawSize := tea.String("0")
	rawSizeRef := request.Headers["x-log-bodyrawsize"]
	// for php bug, Argument #1 ($value) could not be passed by reference
	if !tea.BoolValue(util.IsUnset(rawSizeRef)) {
		bodyRawSize = rawSizeRef
	} else if !tea.BoolValue(util.IsUnset(request.Body)) {
		bodyRawSize = tea.String(tea.ToString(tea.Int64Value(sls_util.BytesLength(bodyBytes))))
	}

	// compress if needed, and set body and hash
	if !tea.BoolValue(util.IsUnset(request.Body)) {
		if !tea.BoolValue(util.Empty(finalCompressType)) {
			compressed, _err := sls_util.Compress(bodyBytes, finalCompressType)
			if _err != nil {
				return _err
			}

			bodyBytes = compressed
		}

		contentHash, _err = client.MakeContentHash(bodyBytes, signatureVersion)
		if _err != nil {
			return _err
		}

		request.Stream = tea.ToReader(bodyBytes)
	}

	host, _err := client.GetHost(config.Network, project, config.Endpoint)
	if _err != nil {
		return _err
	}

	request.Headers = tea.Merge(map[string]*string{
		"accept":           tea.String("application/json"),
		"host":             host,
		"user-agent":       request.UserAgent,
		"x-log-apiversion": tea.String("0.6.0"),
	}, request.Headers)
	request.Headers["x-log-bodyrawsize"] = bodyRawSize
	_err = client.SetDefaultAcceptEncoding(request.Action, request.Headers)
	if _err != nil {
		return _err
	}
	_err = client.BuildRequest(context)
	if _err != nil {
		return _err
	}
	// move param in path to query
	if tea.BoolValue(string_.Equals(signatureVersion, tea.String("v4"))) {
		if tea.BoolValue(util.Empty(contentHash)) {
			contentHash = tea.String("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
		}

		date, _err := client.GetDateISO8601()
		if _err != nil {
			return _err
		}

		request.Headers["x-log-date"] = date
		request.Headers["x-log-content-sha256"] = contentHash
		request.Headers["authorization"], _err = client.GetAuthorizationV4(context, date, contentHash, accessKeyId, accessKeySecret)
		if _err != nil {
			return _err
		}

		return _err
	}

	if !tea.BoolValue(util.Empty(accessKeyId)) {
		request.Headers["x-log-signaturemethod"] = tea.String("hmac-sha256")
	}

	request.Headers["date"] = util.GetDateUTCString()
	request.Headers["content-md5"] = contentHash
	request.Headers["authorization"], _err = client.GetAuthorization(request.Pathname, request.Method, request.Query, request.Headers, accessKeyId, accessKeySecret)
	if _err != nil {
		return _err
	}

	return _err
}