Exemplo n.º 1
0
        /// <summary>
        /// Store a file at a path.
        /// </summary>
        /// <param name="path">Storage path.</param>
        /// <param name="fileHandle">File to store.</param>
        public void PutFile(string path, AwsS3FileHandle fileHandle)
        {
            if (IsDirectoryPath(path))
            {
                throw new InvalidOperationException(string.Format("cannot put a file at a path with a trailing {0}", _config.Delimiter));
            }
            var p = _rootPlug.AtPath(path);

            if (fileHandle.TimeToLive.HasValue)
            {
                var expiration = fileHandle.Expiration ?? DateTime.UtcNow.Add(fileHandle.TimeToLive.Value);
                p = p.WithHeader(EXPIRE, expiration.ToEpoch().ToString())
                    .WithHeader(TTL, fileHandle.TimeToLive.Value.TotalSeconds.ToString());
                _expirationEntries.SetOrUpdate(path, expiration, fileHandle.TimeToLive.Value);
            }
            if (!string.IsNullOrEmpty(fileHandle.CacheControl))
            {
                p = p.WithHeader(CACHE_CONTROL, fileHandle.CacheControl);
            }
            var request  = DreamMessage.Ok(fileHandle.MimeType, fileHandle.Size, fileHandle.Stream);
            var response = p.Put(request, new Result <DreamMessage>()).Wait();

            if (response.IsSuccessful)
            {
                return;
            }
            throw new DreamResponseException(response);
        }
Exemplo n.º 2
0
            public Yield TestCreateRetrieveDelete(DreamContext context, DreamMessage request, Result <DreamMessage> response)
            {
                string filename = Path.GetTempFileName();

                using (Stream s = File.OpenWrite(filename)) {
                    byte[] data = Encoding.UTF8.GetBytes(TEST_CONTENTS);
                    s.Write(data, 0, data.Length);
                }
                _log.Debug("created file");

                // add a file
                Plug cross = Plug.New(_crossServiceUri);

                _log.DebugFormat("cross service path storage path: {0}", cross.Uri);
                cross.AtPath(TEST_FILE_URI).Put(DreamMessage.FromFile(filename, false));
                File.Delete(filename);
                _log.Debug("put file");

                // get file and compare contents
                string contents = cross.AtPath(TEST_FILE_URI).Get().ToText();

                Assert.AreEqual(TEST_CONTENTS, contents);
                _log.Debug("got file");

                // delete file
                cross.AtPath(TEST_FILE_URI).Delete();
                _log.Debug("deleted file");
                response.Return(DreamMessage.Ok());
                yield break;
            }
Exemplo n.º 3
0
            public Yield TestSharedRetrieveDelete(DreamContext context, DreamMessage request, Result <DreamMessage> response)
            {
                string filename = Path.GetTempFileName();

                using (Stream s = File.OpenWrite(filename)) {
                    byte[] data = Encoding.UTF8.GetBytes(TEST_CONTENTS);
                    s.Write(data, 0, data.Length);
                }
                _log.Debug("created file");

                // derive shared storage path
                Plug sharedStorage = Plug.New(Storage.Uri.WithoutLastSegment().At(TEST_SHARED_PATH));

                _log.DebugFormat("shared storage: {0}", sharedStorage.Uri);

                // get file and compare contents
                string contents = sharedStorage.AtPath(TEST_FILE_URI).Get().ToText();

                Assert.AreEqual(TEST_CONTENTS, contents);
                _log.Debug("got file");

                // delete file
                sharedStorage.AtPath(TEST_FILE_URI).Delete();
                _log.Debug("deleted file");
                response.Return(DreamMessage.Ok());
                yield break;
            }
Exemplo n.º 4
0
        private void DeleteDirectory(string path)
        {
            string marker = null;

            while (true)
            {
                var p = _bucketPlug.With("prefix", GetRootedPath(path));
                if (!string.IsNullOrEmpty(marker))
                {
                    p = p.With("marker", marker);
                }
                var response = p.Get(new Result <DreamMessage>()).Wait();
                var dirDoc   = response.ToDocument().UsePrefix("aws", "http://s3.amazonaws.com/doc/2006-03-01/");
                if (!response.IsSuccessful)
                {
                    throw new Exception(string.Format("{0}: {1}", dirDoc["Code"].AsText, dirDoc["Message"].AsText));
                }
                foreach (var keyDoc in dirDoc["aws:Contents/aws:Key"])
                {
                    var key = keyDoc.AsText;
                    response = _bucketPlug.AtPath(key).Delete(new Result <DreamMessage>()).Wait();
                    if (!response.IsSuccessful && response.Status != DreamStatus.NoContent)
                    {
                        throw new DreamResponseException(response);
                    }
                    _expirationEntries.Delete(key);
                }
                marker = dirDoc["aws:NextMarker"].AsText;
                if (string.IsNullOrEmpty(marker))
                {
                    // there are no more items
                    return;
                }
            }
        }
Exemplo n.º 5
0
        private StreamInfo GetFileInternal(string filename, MimeType type, bool allowFileLink)
        {
            if (allowFileLink && _allowRedirects)
            {
                return(new StreamInfo(BuildS3Uri(Verb.GET, _s3.AtPath(filename), _redirectTimeout)));
            }

            // check if file is cached
            var entry = GetCachedEntry(filename);

            if (entry != null)
            {
                Stream filestream = File.Open(entry.Item1, FileMode.Open, FileAccess.Read, FileShare.Read);
                return(new StreamInfo(filestream, filestream.Length, type, entry.Item3));
            }

            // get file from S3
            var result = new Result <DreamMessage>();

            _s3.AtPath(filename).InvokeEx(Verb.GET, DreamMessage.Ok(), result);
            var response = result.Wait();

            try {
                if (response.IsSuccessful)
                {
                    return(new StreamInfo(response.AsStream(), response.ContentLength, response.ContentType, GetLastModifiedTimestampFromResponse(response)));
                }
                if (response.Status == DreamStatus.NotFound)
                {
                    response.Close();
                    return(null);
                }
                throw new DreamInternalErrorException(string.Format("S3 unable to fetch file (status {0}, message {1})", response.Status, response.AsText()));
            } catch {
                if (response != null)
                {
                    response.Close();
                }
                throw;
            }
        }
Exemplo n.º 6
0
        public void Service_can_store_and_retrieve_file()
        {
            DreamMessage response = testService.AtPath("create-retrieve-delete").PostAsync().Wait();

            Assert.IsTrue(response.IsSuccessful, response.ToText());
        }