Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/duplicati/duplicati.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Duplicati/Library/Backend/AmazonCloudDrive/AmzCD.cs')
-rw-r--r--Duplicati/Library/Backend/AmazonCloudDrive/AmzCD.cs65
1 files changed, 53 insertions, 12 deletions
diff --git a/Duplicati/Library/Backend/AmazonCloudDrive/AmzCD.cs b/Duplicati/Library/Backend/AmazonCloudDrive/AmzCD.cs
index 116ed5ca4..b68319333 100644
--- a/Duplicati/Library/Backend/AmazonCloudDrive/AmzCD.cs
+++ b/Duplicati/Library/Backend/AmazonCloudDrive/AmzCD.cs
@@ -54,6 +54,18 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
private DateTime m_waitUntil;
private TimeSpan m_delayTimeSpan;
+ private enum RemoteOperation
+ {
+ First,
+ List,
+ Get,
+ Put,
+ Delete,
+ Rename
+ }
+
+ private RemoteOperation m_lastOperation = RemoteOperation.First;
+
public AmzCD()
{
}
@@ -85,11 +97,27 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
m_delayTimeSpan = new TimeSpan(0);
else
m_delayTimeSpan = Library.Utility.Timeparser.ParseTimeSpan(delay);
+ m_waitUntil = DateTime.Now + m_delayTimeSpan;
m_oauth = new OAuthHelper(authid, this.ProtocolKey) { AutoAuthHeader = true };
m_userid = authid.Split(new string[] {":"}, StringSplitOptions.RemoveEmptyEntries).First();
}
-
+
+ private void EnforceConsistencyDelay(RemoteOperation lastop)
+ {
+ if (m_lastOperation == RemoteOperation.First)
+ m_lastOperation = lastop;
+
+ if (lastop == m_lastOperation)
+ return;
+
+ m_lastOperation = lastop;
+
+ var wait = m_waitUntil - DateTime.Now;
+ if (wait.Ticks > 0)
+ System.Threading.Thread.Sleep(wait);
+ }
+
private string CacheFilePath { get { return Path.Combine(Utility.TempFolder.SystemTempPath, string.Format(CACHE_FILE_NAME_TEMPLATE, m_userid)); } }
private void RefreshMetadataAndContentUrl()
@@ -193,9 +221,10 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
rs.Write(data, 0, data.Length);
}
);
+ m_waitUntil = DateTime.Now + m_delayTimeSpan;
}
else if (self != null && self.Count > 1)
- throw new Exception(Strings.AmzCD.MultipleEntries(p, "/" + string.Join("/", curpath)));
+ throw new UserInformationException(Strings.AmzCD.MultipleEntries(p, "/" + string.Join("/", curpath)));
else
parent = self.Data.First();
}
@@ -248,7 +277,7 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
#region IStreamingBackend implementation
public void Put(string remotename, System.IO.Stream stream)
{
- m_waitUntil = DateTime.Now + m_delayTimeSpan;
+ EnforceConsistencyDelay(RemoteOperation.Put);
var overwrite = FileCache.ContainsKey(remotename);
var fileid = overwrite ? m_filecache[remotename] : null;
@@ -291,9 +320,15 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
m_filecache = null;
throw;
}
+ finally
+ {
+ m_waitUntil = DateTime.Now + m_delayTimeSpan;
+ }
}
public void Get(string remotename, System.IO.Stream stream)
{
+ EnforceConsistencyDelay(RemoteOperation.Get);
+
using (var resp = m_oauth.GetResponse(string.Format("{0}/nodes/{1}/content", ContentUrl, GetFileID(remotename))))
using(var rs = Library.Utility.AsyncHttpRequest.TrySetTimeout(resp.GetResponseStream()))
Utility.Utility.CopyStream(rs, stream);
@@ -301,11 +336,9 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
#endregion
#region IBackend implementation
- public List<IFileEntry> List()
+ public IEnumerable<IFileEntry> List()
{
- var wait = m_waitUntil - DateTime.Now;
- if (wait.Ticks > 0)
- System.Threading.Thread.Sleep(wait);
+ EnforceConsistencyDelay(RemoteOperation.List);
var query = string.Format("{0}/nodes?filters=parents:{1}&limit={2}", MetadataUrl, Utility.Uri.UrlEncode(CurrentDirectory.ID), PAGE_SIZE);
var res = new List<IFileEntry>();
@@ -321,9 +354,9 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
foreach(var n in lst.Data)
{
- if (string.Equals(CONTENT_KIND_FOLDER, n.Kind, StringComparison.InvariantCultureIgnoreCase))
+ if (string.Equals(CONTENT_KIND_FOLDER, n.Kind, StringComparison.OrdinalIgnoreCase))
res.Add(new FileEntry(n.Name) { IsFolder = true });
- else if (string.Equals(CONTENT_KIND_FILE, n.Kind, StringComparison.InvariantCultureIgnoreCase))
+ else if (string.Equals(CONTENT_KIND_FILE, n.Kind, StringComparison.OrdinalIgnoreCase))
{
cache[n.Name] = n.ID;
@@ -365,10 +398,10 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
}
public void Delete(string remotename)
{
+ EnforceConsistencyDelay(RemoteOperation.Delete);
+
try
{
- m_waitUntil = DateTime.Now + m_delayTimeSpan;
-
using(m_oauth.GetResponse(string.Format("{0}/trash/{1}", MetadataUrl, GetFileID(remotename)), null, "PUT"))
{
}
@@ -379,13 +412,15 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
{
m_filecache = null;
}
+ m_waitUntil = DateTime.Now + m_delayTimeSpan;
}
public void Test()
{
- List();
+ this.TestList();
}
public void CreateFolder()
{
+ EnforceConsistencyDelay(RemoteOperation.List);
GetCurrentDirectory(true);
}
public string DisplayName
@@ -432,6 +467,8 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
#region IRenameEnabledBackend
public void Rename(string oldname, string newname)
{
+ EnforceConsistencyDelay(RemoteOperation.Rename);
+
var id = GetFileID(oldname);
var data = System.Text.Encoding.UTF8.GetBytes(
@@ -464,6 +501,10 @@ namespace Duplicati.Library.Backend.AmazonCloudDrive
m_filecache = null;
throw;
}
+ finally
+ {
+ m_waitUntil = DateTime.Now + m_delayTimeSpan;
+ }
}
#endregion