package playback import ( "encoding/xml" "fmt" "net/http" ) type MultipartUpload struct { XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ InitiateMultipartUploadResult" json:"-"` Bucket string `json:"bucket" xml:"Bucket"` Key string `json:"key" xml:"Key"` UploadID string `json:"uploadId" xml:"UploadId"` } func HandleResponse(r *http.Request, mparts map[string]MultipartUpload, resp []byte, logResponse []byte) error { var mpart, mpartOld MultipartUpload if r.Method != "POST" || !r.URL.Query().Has("uploads") { return nil } // get new uploadId from response err := xml.Unmarshal(resp, &mpart) if err != nil { return fmt.Errorf("xml unmarshal error: %w", err) } // get old uploadId from logs err = xml.Unmarshal(logResponse, &mpartOld) if err != nil { return fmt.Errorf("xml unmarshal error: %w", err) } if mpartOld.UploadID != "" { mparts[mpartOld.UploadID] = mpart } return nil } func SwapUploadID(r *http.Request, settings *Settings) error { var uploadID string query := r.URL.Query() uploadID = query.Get("uploadId") mpart, ok := settings.Multiparts[uploadID] if !ok { return fmt.Errorf("no multipart upload with specified uploadId") } query.Set("uploadId", mpart.UploadID) r.URL.RawQuery = query.Encode() return nil }