diff --git a/Duplicati/Library/Backend/GoogleServices/GoogleDrive.cs b/Duplicati/Library/Backend/GoogleServices/GoogleDrive.cs index 2d5ce3274..c36ed71c6 100644 --- a/Duplicati/Library/Backend/GoogleServices/GoogleDrive.cs +++ b/Duplicati/Library/Backend/GoogleServices/GoogleDrive.cs @@ -157,14 +157,8 @@ namespace Duplicati.Library.Backend.GoogleDrive } var isUpdate = !string.IsNullOrWhiteSpace(fileId); - - var values = new NameValueCollection { - { WebApi.Google.QueryParam.UploadType, - WebApi.GoogleDrive.QueryValue.Resumable } }; - var url = isUpdate ? - WebApi.GoogleDrive.FileUploadUrl(Library.Utility.Uri.UrlPathEncode(fileId), values) : - WebApi.GoogleDrive.FileUploadUrl(values); + var url = WebApi.GoogleDrive.PutUrl(fileId); var item = new GoogleDriveFolderItem { @@ -276,7 +270,7 @@ namespace Duplicati.Library.Backend.GoogleDrive { foreach (var fileid in from n in GetFileEntries(remotename) select n.id) { - var url = WebApi.GoogleDrive.FileQueryUrl(Library.Utility.Uri.UrlPathEncode(fileid), SupportsTeamDriveParam()); + var url = WebApi.GoogleDrive.DeleteUrl(Library.Utility.Uri.UrlPathEncode(fileid), m_useTeamDrive); m_oauth.GetJSONData(url, x => { x.Method = "DELETE"; @@ -360,7 +354,7 @@ namespace Duplicati.Library.Backend.GoogleDrive public string[] DNSName { - get { return new string[] { new System.Uri(WebApi.GoogleDrive.Url.DRIVE).Host, new System.Uri(WebApi.GoogleDrive.Url.UPLOAD).Host }; } + get { return WebApi.GoogleDrive.Hosts(); } } #endregion @@ -412,21 +406,6 @@ namespace Duplicati.Library.Backend.GoogleDrive } #endregion - - private NameValueCollection SupportsTeamDriveParam() - { - return m_useTeamDrive ? new NameValueCollection { - { WebApi.GoogleDrive.QueryParam.SupportsTeamDrive, - WebApi.GoogleDrive.QueryValue.True } - } : null; - } - - private NameValueCollection IncludeTeamDriveParam() - { - return m_useTeamDrive ? new NameValueCollection { - { WebApi.GoogleDrive.QueryParam.IncludeTeamDrive, - WebApi.GoogleDrive.QueryValue.True } } : null; - } private class GoogleDriveParentReference { @@ -503,17 +482,11 @@ namespace Duplicati.Library.Backend.GoogleDrive string.Format("'{0}' in parents", EscapeTitleEntries(parentfolder)) }; - var queryParams = new NameValueCollection - { - {WebApi.Google.QueryParam.File, - Library.Utility.Uri.UrlEncode(string.Join(" and ", fileQuery.Where(x => x != null)))}, - }; - queryParams.Add(SupportsTeamDriveParam()); - queryParams.Add(IncludeTeamDriveParam()); + var encodedFileQuery = Library.Utility.Uri.UrlEncode(string.Join(" and ", fileQuery.Where(x => x != null))); + var url = WebApi.GoogleDrive.ListUrl(encodedFileQuery, m_useTeamDrive); while (true) { - var url = WebApi.GoogleDrive.FileQueryUrl(queryParams); var res = m_oauth.GetJSONData(url); foreach (var n in res.items) yield return n; @@ -521,8 +494,8 @@ namespace Duplicati.Library.Backend.GoogleDrive var token = res.nextPageToken; if (string.IsNullOrWhiteSpace(token)) break; - - queryParams.Set(WebApi.Google.QueryParam.PageToken, token); + + url = WebApi.GoogleDrive.ListUrl(encodedFileQuery, m_useTeamDrive, token); } } diff --git a/Duplicati/Library/Backend/GoogleServices/WebApi.cs b/Duplicati/Library/Backend/GoogleServices/WebApi.cs index ebbd6a602..479a0ade4 100644 --- a/Duplicati/Library/Backend/GoogleServices/WebApi.cs +++ b/Duplicati/Library/Backend/GoogleServices/WebApi.cs @@ -86,7 +86,7 @@ namespace Duplicati.Library.Backend.WebApi public static string[] Hosts() { - return new string[] { new System.Uri(Url.UPLOAD).Host, + return new [] { new System.Uri(Url.UPLOAD).Host, new System.Uri(Url.API).Host }; } @@ -164,46 +164,67 @@ namespace Duplicati.Library.Backend.WebApi public class GoogleDrive : Google { - public static class Url + private static class Url { public const string DRIVE = "https://www.googleapis.com/drive/v2"; public const string UPLOAD = "https://www.googleapis.com/upload/drive/v2"; } - public static class Path + private class Path { public const string File = "files"; public const string About = "about"; } - public new class QueryParam : Google.QueryParam + private new class QueryParam : Google.QueryParam { public const string SupportsTeamDrive = "supportsTeamDrives"; public const string IncludeTeamDrive = "includeTeamDriveItems"; } - public static string FileQueryUrl(NameValueCollection values) + private static string FileQueryUrl(NameValueCollection values) { return Uri.UriBuilder(Url.DRIVE, Path.File, values); } - public static string FileQueryUrl(string fileId, NameValueCollection values = null) + private static string FileQueryUrl(string fileId, NameValueCollection values = null) { return Uri.UriBuilder(Url.DRIVE, UrlPath.Create(Path.File).Append(fileId).ToString(), values); } - public static string FileUploadUrl(string fileId, NameValueCollection values) + private static string FileUploadUrl(string fileId, NameValueCollection values) { return Uri.UriBuilder(Url.UPLOAD, UrlPath.Create(Path.File).Append(fileId).ToString(), values); } - public static string FileUploadUrl(NameValueCollection values) + private static string FileUploadUrl(NameValueCollection values) { return Uri.UriBuilder(Url.UPLOAD, Path.File, values); } + private static NameValueCollection SupportsTeamDriveParam(bool useTeamDrive) + { + return useTeamDrive ? new NameValueCollection { + { WebApi.GoogleDrive.QueryParam.SupportsTeamDrive, + WebApi.GoogleDrive.QueryValue.True } + } : null; + } + + private static NameValueCollection IncludeTeamDriveParam(bool useTeamDrive) + { + return useTeamDrive ? new NameValueCollection { + { QueryParam.IncludeTeamDrive, + QueryValue.True } } : null; + } + + public static string[] Hosts() + { + return new [] { new System.Uri(Url.DRIVE).Host, new System.Uri(Url.UPLOAD).Host }; + + } + public static string GetUrl(string fileId) { return FileQueryUrl(fileId, new NameValueCollection{ @@ -213,7 +234,43 @@ namespace Duplicati.Library.Backend.WebApi public static string RenameUrl(string fileId) { - return FileQueryUrl(Uri.UrlPathEncode(fileId); + return FileQueryUrl(Uri.UrlPathEncode(fileId)); + } + + public static string DeleteUrl(string fileId, bool useTeamDrive) + { + return FileQueryUrl(Uri.UrlPathEncode(fileId), SupportsTeamDriveParam(useTeamDrive)); + } + + public static string PutUrl(string fileId) + { + var queryParams = new NameValueCollection { + { Google.QueryParam.UploadType, + QueryValue.Resumable } }; + + return !string.IsNullOrWhiteSpace(fileId) ? + FileUploadUrl(Uri.UrlPathEncode(fileId), queryParams) : + FileUploadUrl(queryParams); + } + + public static string ListUrl(string fileQuery, bool useTeamDrive, string token=null) + { + var queryParams = new NameValueCollection + { + { Google.QueryParam.File, + fileQuery}, + }; + + queryParams.Add(SupportsTeamDriveParam(useTeamDrive)); + queryParams.Add(IncludeTeamDriveParam(useTeamDrive)); + + if (token != null) + { + queryParams.Set(Google.QueryParam.PageToken, token); + } + + return FileQueryUrl(queryParams); + } } } \ No newline at end of file