[#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:
Denis Kirillov 2021-07-01 10:45:55 +03:00
parent da4eca5da5
commit ab8dd4201c
4 changed files with 84 additions and 51 deletions

View file

@ -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))