mirror of
https://github.com/drakkan/sftpgo.git
synced 2024-11-25 09:00:27 +00:00
vfs: make PipeReader an interface
Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
parent
8180b75ef1
commit
eec9c449d4
13 changed files with 36 additions and 23 deletions
|
@ -32,7 +32,7 @@ type transfer struct {
|
||||||
expectedOffset int64
|
expectedOffset int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTransfer(baseTransfer *common.BaseTransfer, pipeWriter vfs.PipeWriter, pipeReader *vfs.PipeReader,
|
func newTransfer(baseTransfer *common.BaseTransfer, pipeWriter vfs.PipeWriter, pipeReader vfs.PipeReader,
|
||||||
expectedOffset int64) *transfer {
|
expectedOffset int64) *transfer {
|
||||||
var writer io.WriteCloser
|
var writer io.WriteCloser
|
||||||
var reader io.ReadCloser
|
var reader io.ReadCloser
|
||||||
|
|
|
@ -28,7 +28,7 @@ type httpdFile struct {
|
||||||
isFinished bool
|
isFinished bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func newHTTPDFile(baseTransfer *common.BaseTransfer, pipeWriter vfs.PipeWriter, pipeReader *vfs.PipeReader) *httpdFile {
|
func newHTTPDFile(baseTransfer *common.BaseTransfer, pipeWriter vfs.PipeWriter, pipeReader vfs.PipeReader) *httpdFile {
|
||||||
var writer io.WriteCloser
|
var writer io.WriteCloser
|
||||||
var reader io.ReadCloser
|
var reader io.ReadCloser
|
||||||
if baseTransfer.File != nil {
|
if baseTransfer.File != nil {
|
||||||
|
|
|
@ -8939,8 +8939,8 @@ func TestStatVFSCloudBackend(t *testing.T) {
|
||||||
u := getTestUser(usePubKey)
|
u := getTestUser(usePubKey)
|
||||||
u.FsConfig.Provider = sdk.AzureBlobFilesystemProvider
|
u.FsConfig.Provider = sdk.AzureBlobFilesystemProvider
|
||||||
u.FsConfig.AzBlobConfig.SASURL = kms.NewPlainSecret("https://myaccount.blob.core.windows.net/sasurl")
|
u.FsConfig.AzBlobConfig.SASURL = kms.NewPlainSecret("https://myaccount.blob.core.windows.net/sasurl")
|
||||||
user, _, err := httpdtest.AddUser(u, http.StatusCreated)
|
user, resp, err := httpdtest.AddUser(u, http.StatusCreated)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err, string(resp))
|
||||||
conn, client, err := getSftpClient(user, usePubKey)
|
conn, client, err := getSftpClient(user, usePubKey)
|
||||||
if assert.NoError(t, err) {
|
if assert.NoError(t, err) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
|
|
|
@ -58,7 +58,7 @@ type transfer struct {
|
||||||
isFinished bool
|
isFinished bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTransfer(baseTransfer *common.BaseTransfer, pipeWriter vfs.PipeWriter, pipeReader *vfs.PipeReader,
|
func newTransfer(baseTransfer *common.BaseTransfer, pipeWriter vfs.PipeWriter, pipeReader vfs.PipeReader,
|
||||||
errForRead error) *transfer {
|
errForRead error) *transfer {
|
||||||
var writer writerAtCloser
|
var writer writerAtCloser
|
||||||
var reader readerAtCloser
|
var reader readerAtCloser
|
||||||
|
|
|
@ -202,7 +202,7 @@ func (fs *AzureBlobFs) Lstat(name string) (os.FileInfo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens the named file for reading
|
// Open opens the named file for reading
|
||||||
func (fs *AzureBlobFs) Open(name string, offset int64) (File, *PipeReader, func(), error) {
|
func (fs *AzureBlobFs) Open(name string, offset int64) (File, PipeReader, func(), error) {
|
||||||
r, w, err := pipeat.PipeInDir(fs.localTempDir)
|
r, w, err := pipeat.PipeInDir(fs.localTempDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
|
@ -991,7 +991,7 @@ func (fs *AzureBlobFs) downloadPart(ctx context.Context, blockBlob *blockblob.Cl
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fs *AzureBlobFs) handleMultipartDownload(ctx context.Context, blockBlob *blockblob.Client,
|
func (fs *AzureBlobFs) handleMultipartDownload(ctx context.Context, blockBlob *blockblob.Client,
|
||||||
offset int64, writer io.WriterAt, pipeReader *PipeReader,
|
offset int64, writer io.WriterAt, pipeReader PipeReader,
|
||||||
) error {
|
) error {
|
||||||
props, err := blockBlob.GetProperties(ctx, &blob.GetPropertiesOptions{})
|
props, err := blockBlob.GetProperties(ctx, &blob.GetPropertiesOptions{})
|
||||||
metric.AZHeadObjectCompleted(err)
|
metric.AZHeadObjectCompleted(err)
|
||||||
|
|
|
@ -79,7 +79,7 @@ func (fs *CryptFs) Name() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens the named file for reading
|
// Open opens the named file for reading
|
||||||
func (fs *CryptFs) Open(name string, offset int64) (File, *PipeReader, func(), error) {
|
func (fs *CryptFs) Open(name string, offset int64) (File, PipeReader, func(), error) {
|
||||||
f, key, err := fs.getFileAndEncryptionKey(name)
|
f, key, err := fs.getFileAndEncryptionKey(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
|
|
|
@ -126,7 +126,7 @@ func (fs *GCSFs) Lstat(name string) (os.FileInfo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens the named file for reading
|
// Open opens the named file for reading
|
||||||
func (fs *GCSFs) Open(name string, offset int64) (File, *PipeReader, func(), error) {
|
func (fs *GCSFs) Open(name string, offset int64) (File, PipeReader, func(), error) {
|
||||||
r, w, err := pipeat.PipeInDir(fs.localTempDir)
|
r, w, err := pipeat.PipeInDir(fs.localTempDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
|
|
|
@ -316,7 +316,7 @@ func (fs *HTTPFs) Lstat(name string) (os.FileInfo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens the named file for reading
|
// Open opens the named file for reading
|
||||||
func (fs *HTTPFs) Open(name string, offset int64) (File, *PipeReader, func(), error) {
|
func (fs *HTTPFs) Open(name string, offset int64) (File, PipeReader, func(), error) {
|
||||||
r, w, err := pipeat.PipeInDir(fs.localTempDir)
|
r, w, err := pipeat.PipeInDir(fs.localTempDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
|
|
|
@ -101,7 +101,7 @@ func (fs *OsFs) Lstat(name string) (os.FileInfo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens the named file for reading
|
// Open opens the named file for reading
|
||||||
func (fs *OsFs) Open(name string, offset int64) (File, *PipeReader, func(), error) {
|
func (fs *OsFs) Open(name string, offset int64) (File, PipeReader, func(), error) {
|
||||||
f, err := os.Open(name)
|
f, err := os.Open(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
|
|
|
@ -196,7 +196,7 @@ func (fs *S3Fs) Lstat(name string) (os.FileInfo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens the named file for reading
|
// Open opens the named file for reading
|
||||||
func (fs *S3Fs) Open(name string, offset int64) (File, *PipeReader, func(), error) {
|
func (fs *S3Fs) Open(name string, offset int64) (File, PipeReader, func(), error) {
|
||||||
r, w, err := pipeat.PipeInDir(fs.localTempDir)
|
r, w, err := pipeat.PipeInDir(fs.localTempDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
|
|
|
@ -346,7 +346,7 @@ func (fs *SFTPFs) Lstat(name string) (os.FileInfo, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens the named file for reading
|
// Open opens the named file for reading
|
||||||
func (fs *SFTPFs) Open(name string, offset int64) (File, *PipeReader, func(), error) {
|
func (fs *SFTPFs) Open(name string, offset int64) (File, PipeReader, func(), error) {
|
||||||
client, err := fs.conn.getClient()
|
client, err := fs.conn.getClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
|
|
|
@ -115,7 +115,7 @@ type Fs interface {
|
||||||
ConnectionID() string
|
ConnectionID() string
|
||||||
Stat(name string) (os.FileInfo, error)
|
Stat(name string) (os.FileInfo, error)
|
||||||
Lstat(name string) (os.FileInfo, error)
|
Lstat(name string) (os.FileInfo, error)
|
||||||
Open(name string, offset int64) (File, *PipeReader, func(), error)
|
Open(name string, offset int64) (File, PipeReader, func(), error)
|
||||||
Create(name string, flag, checks int) (File, PipeWriter, func(), error)
|
Create(name string, flag, checks int) (File, PipeWriter, func(), error)
|
||||||
Rename(source, target string) (int, int64, error)
|
Rename(source, target string) (int, int64, error)
|
||||||
Remove(name string, isDir bool) error
|
Remove(name string, isDir bool) error
|
||||||
|
@ -189,6 +189,16 @@ type PipeWriter interface {
|
||||||
GetWrittenBytes() int64
|
GetWrittenBytes() int64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PipeReader defines an interface representing a SFTPGo pipe writer
|
||||||
|
type PipeReader interface {
|
||||||
|
io.Reader
|
||||||
|
io.ReaderAt
|
||||||
|
io.Closer
|
||||||
|
setMetadata(value map[string]string)
|
||||||
|
setMetadataFromPointerVal(value map[string]*string)
|
||||||
|
Metadata() map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
// Metadater defines an interface to implement to return metadata for a file
|
// Metadater defines an interface to implement to return metadata for a file
|
||||||
type Metadater interface {
|
type Metadater interface {
|
||||||
Metadata() map[string]string
|
Metadata() map[string]string
|
||||||
|
@ -628,7 +638,10 @@ func (c *AzBlobFsConfig) ValidateAndEncryptCredentials(additionalData string) er
|
||||||
func (c *AzBlobFsConfig) checkCredentials() error {
|
func (c *AzBlobFsConfig) checkCredentials() error {
|
||||||
if c.SASURL.IsPlain() {
|
if c.SASURL.IsPlain() {
|
||||||
_, err := url.Parse(c.SASURL.GetPayload())
|
_, err := url.Parse(c.SASURL.GetPayload())
|
||||||
return util.NewI18nError(err, util.I18nErrorSASURLInvalid)
|
if err != nil {
|
||||||
|
return util.NewI18nError(err, util.I18nErrorSASURLInvalid)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
if c.SASURL.IsEncrypted() && !c.SASURL.IsValid() {
|
if c.SASURL.IsEncrypted() && !c.SASURL.IsValid() {
|
||||||
return errors.New("invalid encrypted sas_url")
|
return errors.New("invalid encrypted sas_url")
|
||||||
|
@ -851,27 +864,27 @@ func (p *pipeWriterAtOffset) Write(buf []byte) (int, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewPipeReader initializes a new PipeReader
|
// NewPipeReader initializes a new PipeReader
|
||||||
func NewPipeReader(r *pipeat.PipeReaderAt) *PipeReader {
|
func NewPipeReader(r *pipeat.PipeReaderAt) PipeReader {
|
||||||
return &PipeReader{
|
return &pipeReader{
|
||||||
PipeReaderAt: r,
|
PipeReaderAt: r,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PipeReader defines a wrapper for pipeat.PipeReaderAt.
|
// pipeReader defines a wrapper for pipeat.PipeReaderAt.
|
||||||
type PipeReader struct {
|
type pipeReader struct {
|
||||||
*pipeat.PipeReaderAt
|
*pipeat.PipeReaderAt
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
metadata map[string]string
|
metadata map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PipeReader) setMetadata(value map[string]string) {
|
func (p *pipeReader) setMetadata(value map[string]string) {
|
||||||
p.mu.Lock()
|
p.mu.Lock()
|
||||||
defer p.mu.Unlock()
|
defer p.mu.Unlock()
|
||||||
|
|
||||||
p.metadata = value
|
p.metadata = value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PipeReader) setMetadataFromPointerVal(value map[string]*string) {
|
func (p *pipeReader) setMetadataFromPointerVal(value map[string]*string) {
|
||||||
p.mu.Lock()
|
p.mu.Lock()
|
||||||
defer p.mu.Unlock()
|
defer p.mu.Unlock()
|
||||||
|
|
||||||
|
@ -890,7 +903,7 @@ func (p *PipeReader) setMetadataFromPointerVal(value map[string]*string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Metadata implements the Metadater interface
|
// Metadata implements the Metadater interface
|
||||||
func (p *PipeReader) Metadata() map[string]string {
|
func (p *pipeReader) Metadata() map[string]string {
|
||||||
p.mu.RLock()
|
p.mu.RLock()
|
||||||
defer p.mu.RUnlock()
|
defer p.mu.RUnlock()
|
||||||
|
|
||||||
|
|
|
@ -286,7 +286,7 @@ func (fs *MockOsFs) Name() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open returns nil
|
// Open returns nil
|
||||||
func (fs *MockOsFs) Open(name string, offset int64) (vfs.File, *vfs.PipeReader, func(), error) {
|
func (fs *MockOsFs) Open(name string, offset int64) (vfs.File, vfs.PipeReader, func(), error) {
|
||||||
if fs.reader != nil {
|
if fs.reader != nil {
|
||||||
return nil, vfs.NewPipeReader(fs.reader), nil, nil
|
return nil, vfs.NewPipeReader(fs.reader), nil, nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue