private AmazonS3DataInfo GetFile(string path, bool head) { var response = _rootPlug.AtPath(path).InvokeEx(head ? "HEAD" : "GET", DreamMessage.Ok(), new Result <DreamMessage>()).Wait(); if (response.Status == DreamStatus.NotFound) { response.Close(); return(null); } if (!response.IsSuccessful) { response.Memorize(new Result()).Wait(); throw new DreamResponseException(response); } // got a file var expireEpoch = response.Headers[EXPIRE]; var expiration = string.IsNullOrEmpty(expireEpoch) ? (DateTime?)null : DateTimeUtil.FromEpoch(SysUtil.ChangeType <uint>(expireEpoch)); var ttlString = response.Headers[TTL]; var ttl = string.IsNullOrEmpty(ttlString) ? (TimeSpan?)null : TimeSpan.FromSeconds(SysUtil.ChangeType <double>(ttlString)); if (expiration.HasValue && ttl.HasValue) { if (DateTime.UtcNow > expiration) { // lazy expiration _log.DebugFormat("lazy expiration of {0}", path); _expirationEntries.Delete(path); response.Close(); return(null); } _expirationEntries.SetOrUpdate(path, expiration.Value, ttl.Value); } var filehandle = new AmazonS3FileHandle { Expiration = expiration, TimeToLive = ttl, Size = response.ContentLength, MimeType = response.ContentType, Modified = response.Headers.LastModified ?? DateTime.UtcNow, Stream = head ? null : response.ToStream(), }; if (head) { response.Close(); } return(new AmazonS3DataInfo(filehandle)); }
public Yield DeleteFile(DreamContext context, DreamMessage request, Result <DreamMessage> response) { var path = GetPath(context); var result = DreamMessage.Ok(); if (Directory.Exists(path)) { // folder delete try { Directory.Delete(path, true); } catch { } } else if (File.Exists(path)) { // delete target file try { _expirationEntries.Delete(path); try { File.Delete(path); } catch { } WriteMeta(path, null, null); } catch (FileNotFoundException) { } catch (DirectoryNotFoundException) { } catch (PathTooLongException) { result = DreamMessage.BadRequest("path too long"); } catch (NotSupportedException) { result = DreamMessage.BadRequest("not supported"); } // try to clean up empty directory string folderpath = Path.GetDirectoryName(path); if (Directory.Exists(folderpath) && (Directory.GetFileSystemEntries(folderpath).Length == 0)) { try { Directory.Delete(folderpath); } catch { } } } response.Return(result); yield break; }
public void Can_remove_expiration() { var expired = new ManualResetEvent(false); var changed = new ManualResetEvent(false); var i = 42; var ttl = TimeSpan.FromSeconds(1); ExpiringHashSet <int> .Entry entry = null; var set = new ExpiringHashSet <int>(TaskTimerFactory.Current); set.EntryExpired += (s, e) => { entry = e.Entry; expired.Set(); }; set.CollectionChanged += (s, e) => changed.Set(); set.SetOrUpdate(i, ttl); Assert.IsTrue(changed.WaitOne(2000)); changed.Set(); set.Delete(i); Assert.IsTrue(changed.WaitOne(2000)); Assert.IsFalse(expired.WaitOne(2000)); }
public void Can_access_hashset_during_expiration_event() { var expired = new ManualResetEvent(false); var changed = new ManualResetEvent(false); var i = 42; var ttl = TimeSpan.FromSeconds(1); ExpiringHashSet <int> .Entry entry = null; var set = new ExpiringHashSet <int>(TaskTimerFactory.Current); set.EntryExpired += (s, e) => { entry = e.Entry; set.Delete(e.Entry.Value); expired.Set(); }; set.CollectionChanged += (s, e) => changed.Set(); set.SetOrUpdate(i, ttl); Assert.IsTrue(changed.WaitOne(5000)); Assert.IsTrue(expired.WaitOne(5000)); Assert.AreEqual(i, entry.Value); Assert.AreEqual(ttl, entry.TTL); Assert.IsNull(set[i]); }
public void Can_access_hashset_during_expiration_event() { var expired = new ManualResetEvent(false); var changed = new ManualResetEvent(false); var i = 42; var ttl = TimeSpan.FromSeconds(1); ExpiringHashSet<int>.Entry entry = null; var set = new ExpiringHashSet<int>(TaskTimerFactory.Current); set.EntryExpired += (s, e) => { entry = e.Entry; set.Delete(e.Entry.Value); expired.Set(); }; set.CollectionChanged += (s, e) => changed.Set(); set.SetOrUpdate(i, ttl); Assert.IsTrue(changed.WaitOne(5000)); Assert.IsTrue(expired.WaitOne(5000)); Assert.AreEqual(i, entry.Value); Assert.AreEqual(ttl, entry.TTL); Assert.IsNull(set[i]); }
public void Can_remove_expiration() { var expired = new ManualResetEvent(false); var changed = new ManualResetEvent(false); var i = 42; var ttl = TimeSpan.FromSeconds(1); ExpiringHashSet<int>.Entry entry = null; var set = new ExpiringHashSet<int>(TaskTimerFactory.Current); set.EntryExpired += (s, e) => { entry = e.Entry; expired.Set(); }; set.CollectionChanged += (s, e) => changed.Set(); set.SetOrUpdate(i, ttl); Assert.IsTrue(changed.WaitOne(2000)); changed.Set(); set.Delete(i); Assert.IsTrue(changed.WaitOne(2000)); Assert.IsFalse(expired.WaitOne(2000)); }