mirror of
https://github.com/rclone/rclone.git
synced 2025-08-17 09:01:33 +02:00
fs: add UploadHeaders, DownloadHeaders to Update/Put/Open options
This commit is contained in:
committed by
Nick Craig-Wood
parent
93caa459e3
commit
9bf3d3da4c
@ -12,17 +12,16 @@ import (
|
||||
|
||||
// ReOpen is a wrapper for an object reader which reopens the stream on error
|
||||
type ReOpen struct {
|
||||
ctx context.Context
|
||||
mu sync.Mutex // mutex to protect the below
|
||||
src fs.Object // object to open
|
||||
hashOption *fs.HashesOption // option to pass to initial open
|
||||
rangeOption *fs.RangeOption // option to pass to initial open
|
||||
rc io.ReadCloser // underlying stream
|
||||
read int64 // number of bytes read from this stream
|
||||
maxTries int // maximum number of retries
|
||||
tries int // number of retries we've had so far in this stream
|
||||
err error // if this is set then Read/Close calls will return it
|
||||
opened bool // if set then rc is valid and needs closing
|
||||
ctx context.Context
|
||||
mu sync.Mutex // mutex to protect the below
|
||||
src fs.Object // object to open
|
||||
options []fs.OpenOption // option to pass to initial open
|
||||
rc io.ReadCloser // underlying stream
|
||||
read int64 // number of bytes read from this stream
|
||||
maxTries int // maximum number of retries
|
||||
tries int // number of retries we've had so far in this stream
|
||||
err error // if this is set then Read/Close calls will return it
|
||||
opened bool // if set then rc is valid and needs closing
|
||||
}
|
||||
|
||||
var (
|
||||
@ -36,13 +35,12 @@ var (
|
||||
//
|
||||
// If rangeOption is set then this will applied when reading from the
|
||||
// start, and updated on retries.
|
||||
func NewReOpen(ctx context.Context, src fs.Object, hashOption *fs.HashesOption, rangeOption *fs.RangeOption, maxTries int) (rc io.ReadCloser, err error) {
|
||||
func NewReOpen(ctx context.Context, src fs.Object, maxTries int, options ...fs.OpenOption) (rc io.ReadCloser, err error) {
|
||||
h := &ReOpen{
|
||||
ctx: ctx,
|
||||
src: src,
|
||||
hashOption: hashOption,
|
||||
rangeOption: rangeOption,
|
||||
maxTries: maxTries,
|
||||
ctx: ctx,
|
||||
src: src,
|
||||
maxTries: maxTries,
|
||||
options: options,
|
||||
}
|
||||
h.mu.Lock()
|
||||
defer h.mu.Unlock()
|
||||
@ -57,20 +55,35 @@ func NewReOpen(ctx context.Context, src fs.Object, hashOption *fs.HashesOption,
|
||||
//
|
||||
// we don't retry here as the Open() call will itself have low level retries
|
||||
func (h *ReOpen) open() error {
|
||||
var optsArray [2]fs.OpenOption
|
||||
var opts = optsArray[:0]
|
||||
if h.read == 0 {
|
||||
if h.rangeOption != nil {
|
||||
opts = append(opts, h.rangeOption)
|
||||
opts := []fs.OpenOption{}
|
||||
var hashOption *fs.HashesOption
|
||||
var rangeOption *fs.RangeOption
|
||||
for _, option := range h.options {
|
||||
switch option.(type) {
|
||||
case *fs.HashesOption:
|
||||
hashOption = option.(*fs.HashesOption)
|
||||
case *fs.RangeOption:
|
||||
rangeOption = option.(*fs.RangeOption)
|
||||
case *fs.HTTPOption:
|
||||
opts = append(opts, option)
|
||||
default:
|
||||
if option.Mandatory() {
|
||||
fs.Logf(h.src, "Unsupported mandatory option: %v", option)
|
||||
}
|
||||
}
|
||||
if h.hashOption != nil {
|
||||
}
|
||||
if h.read == 0 {
|
||||
if rangeOption != nil {
|
||||
opts = append(opts, rangeOption)
|
||||
}
|
||||
if hashOption != nil {
|
||||
// put hashOption on if reading from the start, ditch otherwise
|
||||
opts = append(opts, h.hashOption)
|
||||
opts = append(opts, hashOption)
|
||||
}
|
||||
} else {
|
||||
if h.rangeOption != nil {
|
||||
if rangeOption != nil {
|
||||
// range to the read point
|
||||
opts = append(opts, &fs.RangeOption{Start: h.rangeOption.Start + h.read, End: h.rangeOption.End})
|
||||
opts = append(opts, &fs.RangeOption{Start: rangeOption.Start + h.read, End: rangeOption.End})
|
||||
} else {
|
||||
// seek to the read point
|
||||
opts = append(opts, &fs.SeekOption{Offset: h.read})
|
||||
|
Reference in New Issue
Block a user