mirror of
https://github.com/rclone/rclone.git
synced 2024-12-04 22:34:48 +01:00
71 lines
1.4 KiB
Go
71 lines
1.4 KiB
Go
|
package s3crypto
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"io"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
|
||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||
|
)
|
||
|
|
||
|
func getWriterStore(req *request.Request, path string, useTempFile bool) (io.ReadWriteSeeker, error) {
|
||
|
if !useTempFile {
|
||
|
return &bytesReadWriteSeeker{}, nil
|
||
|
}
|
||
|
// Create temp file to be used later for calculating the SHA256 header
|
||
|
f, err := ioutil.TempFile(path, "")
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
req.Handlers.Send.PushBack(func(r *request.Request) {
|
||
|
// Close the temp file and cleanup
|
||
|
f.Close()
|
||
|
fpath := filepath.Join(path, f.Name())
|
||
|
os.Remove(fpath)
|
||
|
})
|
||
|
return f, nil
|
||
|
}
|
||
|
|
||
|
type bytesReadWriteSeeker struct {
|
||
|
buf []byte
|
||
|
i int64
|
||
|
}
|
||
|
|
||
|
// Copied from Go stdlib bytes.Reader
|
||
|
func (ws *bytesReadWriteSeeker) Read(b []byte) (int, error) {
|
||
|
if ws.i >= int64(len(ws.buf)) {
|
||
|
return 0, io.EOF
|
||
|
}
|
||
|
n := copy(b, ws.buf[ws.i:])
|
||
|
ws.i += int64(n)
|
||
|
return n, nil
|
||
|
}
|
||
|
|
||
|
func (ws *bytesReadWriteSeeker) Write(b []byte) (int, error) {
|
||
|
ws.buf = append(ws.buf, b...)
|
||
|
return len(b), nil
|
||
|
}
|
||
|
|
||
|
// Copied from Go stdlib bytes.Reader
|
||
|
func (ws *bytesReadWriteSeeker) Seek(offset int64, whence int) (int64, error) {
|
||
|
var abs int64
|
||
|
switch whence {
|
||
|
case 0:
|
||
|
abs = offset
|
||
|
case 1:
|
||
|
abs = int64(ws.i) + offset
|
||
|
case 2:
|
||
|
abs = int64(len(ws.buf)) + offset
|
||
|
default:
|
||
|
return 0, errors.New("bytes.Reader.Seek: invalid whence")
|
||
|
}
|
||
|
if abs < 0 {
|
||
|
return 0, errors.New("bytes.Reader.Seek: negative position")
|
||
|
}
|
||
|
ws.i = abs
|
||
|
return abs, nil
|
||
|
}
|