forked from TrueCloudLab/frostfs-s3-gw
[#94] CopyObject support conditional headers
Supported X-Amz-Copy-Source-If-Modified-Since and X-Amz-Copy-Source-If-Unmodified-Since. Signed-off-by: Denis Kirillov <denis@nspcc.ru>
This commit is contained in:
parent
da4eca5da5
commit
ab8dd4201c
4 changed files with 84 additions and 51 deletions
|
@ -81,6 +81,7 @@ func (h *handler) GetObjectHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
args, err := parseGetObjectArgs(r.Header)
|
||||
if err != nil {
|
||||
writeError(w, r, h.log, "could not parse request params", rid, bkt, obj, err)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -122,23 +123,30 @@ func parseGetObjectArgs(headers http.Header) (*getObjectArgs, error) {
|
|||
var err error
|
||||
args := &getObjectArgs{}
|
||||
|
||||
ifModifiedSince := headers.Get(api.IfModifiedSince)
|
||||
if len(ifModifiedSince) > 0 {
|
||||
if args.IfModifiedSince, err = time.Parse(http.TimeFormat, ifModifiedSince); err != nil {
|
||||
return nil, fmt.Errorf("couldn't parse %s header: %w", api.IfModifiedSince, err)
|
||||
}
|
||||
if args.IfModifiedSince, err = parseHTTPTime(headers.Get(api.IfModifiedSince)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ifUnmodifiedSince := headers.Get(api.IfUnmodifiedSince)
|
||||
if len(ifUnmodifiedSince) > 0 {
|
||||
if args.IfUnmodifiedSince, err = time.Parse(http.TimeFormat, ifUnmodifiedSince); err != nil {
|
||||
return nil, fmt.Errorf("couldn't parse %s header: %w", api.IfUnmodifiedSince, err)
|
||||
}
|
||||
if args.IfUnmodifiedSince, err = parseHTTPTime(headers.Get(api.IfUnmodifiedSince)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return args, nil
|
||||
}
|
||||
|
||||
func parseHTTPTime(data string) (time.Time, error) {
|
||||
var result time.Time
|
||||
var err error
|
||||
|
||||
if len(data) == 0 {
|
||||
return result, nil
|
||||
}
|
||||
|
||||
if result, err = time.Parse(http.TimeFormat, data); err != nil {
|
||||
return result, fmt.Errorf("couldn't parse http time %s: %w", data, err)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func writeRangeHeaders(w http.ResponseWriter, params *layer.RangeParams, size int64) {
|
||||
w.Header().Set("Accept-Ranges", "bytes")
|
||||
w.Header().Set("Content-Range", fmt.Sprintf("bytes %d-%d/%d", params.Start, params.End, size))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue