@@ -27,6 +27,14 @@ type GoogleDriveFileSysClient struct {
2727 fileID string // Optional: Direct file ID for single file access
2828}
2929
30+ // googleDriveTimeout is the default timeout for Google Drive API requests
31+ const googleDriveTimeout = 90 * time .Second
32+
33+ // apiCtx returns a context with timeout for Google Drive API calls
34+ func (fs * GoogleDriveFileSysClient ) apiCtx () (context.Context , context.CancelFunc ) {
35+ return context .WithTimeout (fs .Context ().Ctx , googleDriveTimeout )
36+ }
37+
3038// Init initializes the fs client
3139func (fs * GoogleDriveFileSysClient ) Init (ctx context.Context ) (err error ) {
3240 var instance FileSysClient
@@ -159,7 +167,9 @@ func (fs *GoogleDriveFileSysClient) Connect() (err error) {
159167 // Validate rootFolderID if provided
160168 if fs .rootFolderID != "" {
161169 // Get detailed folder information
162- folderInfo , err := fs .client .Files .Get (fs .rootFolderID ).SupportsAllDrives (true ).Fields ("id,name,mimeType,parents,capabilities,driveId,owners,permissions" ).Do ()
170+ ctx , cancel := fs .apiCtx ()
171+ defer cancel ()
172+ folderInfo , err := fs .client .Files .Get (fs .rootFolderID ).Context (ctx ).SupportsAllDrives (true ).Fields ("id,name,mimeType,parents,capabilities,driveId,owners,permissions" ).Do ()
163173 if err != nil {
164174 if gerr , ok := err .(* googleapi.Error ); ok && gerr .Code == 404 {
165175 return g .Error ("Root folder ID '%s' does not exist or is not accessible" , fs .rootFolderID )
@@ -171,7 +181,9 @@ func (fs *GoogleDriveFileSysClient) Connect() (err error) {
171181
172182 // Validate fileID if provided
173183 if fs .fileID != "" {
174- _ , err = fs .client .Files .Get (fs .fileID ).Fields ("id" ).SupportsAllDrives (true ).Do ()
184+ ctx , cancel := fs .apiCtx ()
185+ defer cancel ()
186+ _ , err = fs .client .Files .Get (fs .fileID ).Context (ctx ).Fields ("id" ).SupportsAllDrives (true ).Do ()
175187 if err != nil {
176188 if gerr , ok := err .(* googleapi.Error ); ok && gerr .Code == 404 {
177189 return g .Error ("File ID '%s' does not exist or is not accessible" , fs .fileID )
@@ -199,7 +211,9 @@ func (fs *GoogleDriveFileSysClient) queryList(query string, fields googleapi.Fie
199211retry:
200212 attempt ++
201213
202- result , err = fs .client .Files .List ().Q (query ).Fields (fields ).IncludeItemsFromAllDrives (true ).SupportsAllDrives (true ).Do ()
214+ ctx , cancel := fs .apiCtx ()
215+ result , err = fs .client .Files .List ().Context (ctx ).Q (query ).Fields (fields ).IncludeItemsFromAllDrives (true ).SupportsAllDrives (true ).Do ()
216+ cancel ()
203217 if err != nil {
204218 if strings .Contains (err .Error (), "Error 500" ) && attempt < 5 {
205219 time .Sleep (2 * time .Second )
@@ -405,7 +419,9 @@ func (fs *GoogleDriveFileSysClient) List(uri string) (nodes FileNodes, err error
405419
406420 // Get file info to check if it's a file or folder
407421 var file * drive.File
408- file , err = fs .client .Files .Get (fileID ).Fields ("id, name, size, createdTime, modifiedTime, mimeType, owners" ).SupportsAllDrives (true ).Do ()
422+ getCtx , getCancel := fs .apiCtx ()
423+ defer getCancel ()
424+ file , err = fs .client .Files .Get (fileID ).Context (getCtx ).Fields ("id, name, size, createdTime, modifiedTime, mimeType, owners" ).SupportsAllDrives (true ).Do ()
409425 if err != nil {
410426 // If file doesn't exist (404), return empty list
411427 if gerr , ok := err .(* googleapi.Error ); ok && gerr .Code == 404 {
@@ -479,12 +495,14 @@ func (fs *GoogleDriveFileSysClient) List(uri string) (nodes FileNodes, err error
479495
480496 pageToken := ""
481497 for {
482- call := fs .client .Files .List ().Q (query ).Fields (fields ).PageSize (1000 ).IncludeItemsFromAllDrives (true ).SupportsAllDrives (true )
498+ listCtx , listCancel := fs .apiCtx ()
499+ call := fs .client .Files .List ().Context (listCtx ).Q (query ).Fields (fields ).PageSize (1000 ).IncludeItemsFromAllDrives (true ).SupportsAllDrives (true )
483500 if pageToken != "" {
484501 call = call .PageToken (pageToken )
485502 }
486503
487504 result , err := call .Do ()
505+ listCancel ()
488506 if err != nil {
489507 return nodes , g .Error (err , "Could not list files" )
490508 }
@@ -577,7 +595,9 @@ func (fs *GoogleDriveFileSysClient) ListRecursive(uri string) (nodes FileNodes,
577595
578596 // Get file info to check if it's a file or folder
579597 var file * drive.File
580- file , err = fs .client .Files .Get (fileID ).Fields ("id, name, size, createdTime, modifiedTime, mimeType, owners" ).SupportsAllDrives (true ).Do ()
598+ getCtx2 , getCancel2 := fs .apiCtx ()
599+ defer getCancel2 ()
600+ file , err = fs .client .Files .Get (fileID ).Context (getCtx2 ).Fields ("id, name, size, createdTime, modifiedTime, mimeType, owners" ).SupportsAllDrives (true ).Do ()
581601 if err != nil {
582602 // If file doesn't exist (404), return empty list
583603 if gerr , ok := err .(* googleapi.Error ); ok && gerr .Code == 404 {
@@ -648,12 +668,14 @@ func (fs *GoogleDriveFileSysClient) ListRecursive(uri string) (nodes FileNodes,
648668
649669 pageToken := ""
650670 for processedCount < maxItems {
651- call := fs .client .Files .List ().Q (query ).Fields (fields ).PageSize (100 ).IncludeItemsFromAllDrives (true ).SupportsAllDrives (true )
671+ listCtx , listCancel := fs .apiCtx ()
672+ call := fs .client .Files .List ().Context (listCtx ).Q (query ).Fields (fields ).PageSize (100 ).IncludeItemsFromAllDrives (true ).SupportsAllDrives (true )
652673 if pageToken != "" {
653674 call = call .PageToken (pageToken )
654675 }
655676
656677 result , err := call .Do ()
678+ listCancel ()
657679 if err != nil {
658680 return nodes , g .Error (err , "Could not list files" )
659681 }
@@ -731,7 +753,9 @@ func (fs *GoogleDriveFileSysClient) delete(uri string) (err error) {
731753 return g .Error (err , "Could not get file ID for deletion" )
732754 }
733755
734- err = fs .client .Files .Delete (fileID ).SupportsAllDrives (true ).Do ()
756+ delCtx , delCancel := fs .apiCtx ()
757+ defer delCancel ()
758+ err = fs .client .Files .Delete (fileID ).Context (delCtx ).SupportsAllDrives (true ).Do ()
735759 if err != nil {
736760 return g .Error (err , "Could not delete file: " + path )
737761 }
@@ -790,7 +814,9 @@ func (fs *GoogleDriveFileSysClient) getOrCreateFolder(path string) (folderID str
790814 Parents : []string {parentID },
791815 }
792816
793- created , err := fs .client .Files .Create (folder ).Fields ("id" ).SupportsAllDrives (true ).Do ()
817+ createCtx , createCancel := fs .apiCtx ()
818+ created , err := fs .client .Files .Create (folder ).Context (createCtx ).Fields ("id" ).SupportsAllDrives (true ).Do ()
819+ createCancel ()
794820 if err != nil {
795821 return "" , g .Error (err , "Could not create folder: " + part )
796822 }
0 commit comments