/// <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); }
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; }
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; }
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; } } }
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; } }
public void Service_can_store_and_retrieve_file() { DreamMessage response = testService.AtPath("create-retrieve-delete").PostAsync().Wait(); Assert.IsTrue(response.IsSuccessful, response.ToText()); }