func()

in sharedlibraries/storage/multipart.go [265:305]


func (w *MultipartWriter) completeMultipartUpload() error {
	bodyXML, err := completeMultipartUploadXML(w.parts)
	if err != nil {
		return fmt.Errorf("failed to build complete multipart upload XML for %v, err: %w", w.objectName, err)
	}
	completeURL := fmt.Sprintf("%s?uploadId=%s", w.baseURL, w.uploadID)

	req, err := http.NewRequest("POST", completeURL, strings.NewReader(bodyXML))
	if err != nil {
		return err
	}
	req.Header.Add("Content-Length", fmt.Sprintf("%v", len(bodyXML)))
	req.Header.Add("Date", time.Now().Format(http.TimeFormat))
	req.Header.Add("Content-Type", "application/xml")
	w.token.SetAuthHeader(req)
	resp, err := w.httpClient.Do(req)
	defer googleapi.CloseBody(resp)
	if err != nil {
		return err
	}
	if err := checkResponse(resp); err != nil {
		return err
	}

	// XML headers will force this key to be lowercase, set it after the upload.
	update := storage.ObjectAttrsToUpdate{
		Metadata:   map[string]string{"X-Backup-Type": w.fileType},
		CustomTime: w.customTime,
	}
	if w.retentionMode != "" {
		update.Retention = &storage.ObjectRetention{
			Mode:        w.retentionMode,
			RetainUntil: w.retentionTime,
		}
	}
	log.Logger.Infow("Updating object attrs", "object", w.objectName, "update", update)
	if _, err := w.bucket.Object(w.objectName).Update(req.Context(), update); err != nil {
		return err
	}
	return nil
}