Exemple #1
0
        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));
        }
Exemple #2
0
        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));
 }