func()

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
}