forked from TrueCloudLab/frostfs-s3-gw
51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
|
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
|
||
|
}
|