aboutsummaryrefslogtreecommitdiffstats
path: root/drive/upload.go
diff options
context:
space:
mode:
Diffstat (limited to 'drive/upload.go')
-rw-r--r--drive/upload.go16
1 files changed, 13 insertions, 3 deletions
diff --git a/drive/upload.go b/drive/upload.go
index c42bebd..dbf068c 100644
--- a/drive/upload.go
+++ b/drive/upload.go
@@ -22,6 +22,7 @@ type UploadArgs struct {
Share bool
Delete bool
ChunkSize int64
+ Timeout time.Duration
}
func (self *Drive) Upload(args UploadArgs) error {
@@ -89,10 +90,12 @@ func (self *Drive) uploadRecursive(args UploadArgs) error {
if info.IsDir() {
args.Name = ""
return self.uploadDirectory(args)
- } else {
+ } else if info.Mode().IsRegular() {
_, _, err := self.uploadFile(args)
return err
}
+
+ return nil
}
func (self *Drive) uploadDirectory(args UploadArgs) error {
@@ -173,13 +176,16 @@ func (self *Drive) uploadFile(args UploadArgs) (*drive.File, int64, error) {
progressReader := getProgressReader(srcFile, args.Progress, srcFileInfo.Size())
// Wrap reader in timeout reader
- reader, ctx := getTimeoutReaderContext(progressReader)
+ reader, ctx := getTimeoutReaderContext(progressReader, args.Timeout)
fmt.Fprintf(args.Out, "Uploading %s\n", args.Path)
started := time.Now()
f, err := self.service.Files.Create(dstFile).Fields("id", "name", "size", "md5Checksum", "webContentLink").Context(ctx).Media(reader, chunkSize).Do()
if err != nil {
+ if isTimeoutError(err) {
+ return nil, 0, fmt.Errorf("Failed to upload file: timeout, no data was transferred for %v", args.Timeout)
+ }
return nil, 0, fmt.Errorf("Failed to upload file: %s", err)
}
@@ -198,6 +204,7 @@ type UploadStreamArgs struct {
Share bool
ChunkSize int64
Progress io.Writer
+ Timeout time.Duration
}
func (self *Drive) UploadStream(args UploadStreamArgs) error {
@@ -223,13 +230,16 @@ func (self *Drive) UploadStream(args UploadStreamArgs) error {
progressReader := getProgressReader(args.In, args.Progress, 0)
// Wrap reader in timeout reader
- reader, ctx := getTimeoutReaderContext(progressReader)
+ reader, ctx := getTimeoutReaderContext(progressReader, args.Timeout)
fmt.Fprintf(args.Out, "Uploading %s\n", dstFile.Name)
started := time.Now()
f, err := self.service.Files.Create(dstFile).Fields("id", "name", "size", "webContentLink").Context(ctx).Media(reader, chunkSize).Do()
if err != nil {
+ if isTimeoutError(err) {
+ return fmt.Errorf("Failed to upload file: timeout, no data was transferred for %v", args.Timeout)
+ }
return fmt.Errorf("Failed to upload file: %s", err)
}