restic/vendor/github.com/minio/minio-go/api-get-options.go

129 lines
3.6 KiB
Go
Raw Normal View History

2017-07-23 12:24:45 +00:00
/*
2017-12-08 19:45:59 +00:00
* Minio Go Library for Amazon S3 Compatible Cloud Storage
* Copyright 2015-2017 Minio, Inc.
2017-07-23 12:24:45 +00:00
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package minio
import (
"fmt"
"net/http"
"time"
2017-12-08 19:45:59 +00:00
"github.com/minio/minio-go/pkg/encrypt"
2017-07-23 12:24:45 +00:00
)
2017-12-08 19:45:59 +00:00
// GetObjectOptions are used to specify additional headers or options
// during GET requests.
type GetObjectOptions struct {
headers map[string]string
ServerSideEncryption encrypt.ServerSide
2017-12-08 19:45:59 +00:00
}
// StatObjectOptions are used to specify additional headers or options
// during GET info/stat requests.
type StatObjectOptions struct {
GetObjectOptions
2017-07-23 12:24:45 +00:00
}
2017-12-08 19:45:59 +00:00
// Header returns the http.Header representation of the GET options.
func (o GetObjectOptions) Header() http.Header {
headers := make(http.Header, len(o.headers))
for k, v := range o.headers {
headers.Set(k, v)
2017-07-23 12:24:45 +00:00
}
2018-09-03 18:23:56 +00:00
if o.ServerSideEncryption != nil && o.ServerSideEncryption.Type() == encrypt.SSEC {
o.ServerSideEncryption.Marshal(headers)
}
2017-12-08 19:45:59 +00:00
return headers
2017-07-23 12:24:45 +00:00
}
2017-12-08 19:45:59 +00:00
// Set adds a key value pair to the options. The
// key-value pair will be part of the HTTP GET request
// headers.
func (o *GetObjectOptions) Set(key, value string) {
if o.headers == nil {
o.headers = make(map[string]string)
2017-07-23 12:24:45 +00:00
}
2017-12-08 19:45:59 +00:00
o.headers[http.CanonicalHeaderKey(key)] = value
2017-07-23 12:24:45 +00:00
}
// SetMatchETag - set match etag.
2017-12-08 19:45:59 +00:00
func (o *GetObjectOptions) SetMatchETag(etag string) error {
2017-07-23 12:24:45 +00:00
if etag == "" {
return ErrInvalidArgument("ETag cannot be empty.")
}
2017-12-08 19:45:59 +00:00
o.Set("If-Match", "\""+etag+"\"")
2017-07-23 12:24:45 +00:00
return nil
}
// SetMatchETagExcept - set match etag except.
2017-12-08 19:45:59 +00:00
func (o *GetObjectOptions) SetMatchETagExcept(etag string) error {
2017-07-23 12:24:45 +00:00
if etag == "" {
return ErrInvalidArgument("ETag cannot be empty.")
}
2017-12-08 19:45:59 +00:00
o.Set("If-None-Match", "\""+etag+"\"")
2017-07-23 12:24:45 +00:00
return nil
}
// SetUnmodified - set unmodified time since.
2017-12-08 19:45:59 +00:00
func (o *GetObjectOptions) SetUnmodified(modTime time.Time) error {
2017-07-23 12:24:45 +00:00
if modTime.IsZero() {
return ErrInvalidArgument("Modified since cannot be empty.")
}
2017-12-08 19:45:59 +00:00
o.Set("If-Unmodified-Since", modTime.Format(http.TimeFormat))
2017-07-23 12:24:45 +00:00
return nil
}
// SetModified - set modified time since.
2017-12-08 19:45:59 +00:00
func (o *GetObjectOptions) SetModified(modTime time.Time) error {
2017-07-23 12:24:45 +00:00
if modTime.IsZero() {
return ErrInvalidArgument("Modified since cannot be empty.")
}
2017-12-08 19:45:59 +00:00
o.Set("If-Modified-Since", modTime.Format(http.TimeFormat))
2017-07-23 12:24:45 +00:00
return nil
}
// SetRange - set the start and end offset of the object to be read.
// See https://tools.ietf.org/html/rfc7233#section-3.1 for reference.
2017-12-08 19:45:59 +00:00
func (o *GetObjectOptions) SetRange(start, end int64) error {
2017-07-23 12:24:45 +00:00
switch {
case start == 0 && end < 0:
// Read last '-end' bytes. `bytes=-N`.
2017-12-08 19:45:59 +00:00
o.Set("Range", fmt.Sprintf("bytes=%d", end))
2017-07-23 12:24:45 +00:00
case 0 < start && end == 0:
// Read everything starting from offset
// 'start'. `bytes=N-`.
2017-12-08 19:45:59 +00:00
o.Set("Range", fmt.Sprintf("bytes=%d-", start))
2017-07-23 12:24:45 +00:00
case 0 <= start && start <= end:
// Read everything starting at 'start' till the
// 'end'. `bytes=N-M`
2017-12-08 19:45:59 +00:00
o.Set("Range", fmt.Sprintf("bytes=%d-%d", start, end))
2017-07-23 12:24:45 +00:00
default:
// All other cases such as
// bytes=-3-
// bytes=5-3
// bytes=-2-4
// bytes=-3-0
// bytes=-3--2
// are invalid.
return ErrInvalidArgument(
fmt.Sprintf(
"Invalid range specified: start=%d end=%d",
start, end))
}
return nil
}