in oss/api_op_object.go [683:735]
func (c *Client) AppendObject(ctx context.Context, request *AppendObjectRequest, optFns ...func(*Options)) (*AppendObjectResult, error) {
var err error
if request == nil {
request = &AppendObjectRequest{}
}
input := &OperationInput{
OpName: "AppendObject",
Method: "POST",
Parameters: map[string]string{"append": ""},
Bucket: request.Bucket,
Key: request.Key,
}
marshalFns := []func(any, *OperationInput) error{
addProgress,
c.updateContentType,
}
unmarshalFns := []func(any, *OperationOutput) error{
discardBody,
unmarshalHeader,
}
// AppendObject is not idempotent, and cannot be retried
if c.hasFeature(FeatureEnableCRC64CheckUpload) && request.InitHashCRC64 != nil {
var init uint64
init, err = strconv.ParseUint(ToString(request.InitHashCRC64), 10, 64)
if err != nil {
return nil, NewErrParamInvalid("request.InitHashCRC64")
}
var w io.Writer = NewCRC64(init)
input.OpMetadata.Add(OpMetaKeyRequestBodyTracker, w)
unmarshalFns = append(unmarshalFns, func(result any, output *OperationOutput) error {
return checkResponseHeaderCRC64(fmt.Sprint(w.(hash.Hash64).Sum64()), output.Headers)
})
}
if err = c.marshalInput(request, input, marshalFns...); err != nil {
return nil, err
}
output, err := c.invokeOperation(ctx, input, optFns)
if err != nil {
return nil, err
}
result := &AppendObjectResult{}
if err = c.unmarshalOutput(result, output, unmarshalFns...); err != nil {
return nil, c.toClientError(err, "UnmarshalOutputFail", output)
}
return result, err
}