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
}