public Task <IPutBlobStrategy> CreatePutBlobStrategyAsync(PutBlobRequest putBlobRequest) { putBlobRequest.ValidateArgument(nameof(putBlobRequest)); var contentType = (putBlobRequest.ContentType ?? defaultContentType); var expirationTimeUtc = DateTime.UtcNow.Add(urlDuration); var putBlobUrl = urlSigner.Sign( putBlobRequest.ContainerName, putBlobRequest.BlobName, expirationTimeUtc, HttpMethod.Put, contentHeaders: new Dictionary <string, IEnumerable <string> > { ["Content-Type"] = new[] { contentType } }); var strategyConfiguration = new HttpPutBlobConfiguration { Url = putBlobUrl, UrlExpirationUtc = expirationTimeUtc, ContentType = contentType }; return(Task.FromResult(new HttpPutBlobStrategy(strategyConfiguration) as IPutBlobStrategy)); }
public void Execute_PageBlobWithAllHeaders_AllHeadersSetProperly() { var expectedContainer = "test-container"; var expectedBlob = "test-blob"; var expectedUri = String.Format("{0}/{1}/{2}", _settings.BlobEndpoint, expectedContainer, expectedBlob); var expectedRawRequest = new TestableWebRequest(new Uri(expectedUri)) .EnqueueResponse(new HttpResponseSettings((HttpStatusCode)201, "Created", "", false, new Dictionary<string, string>(){ {"ETag", "\"123\""}, {"Date", DateTime.UtcNow.ToString() }, {"Last-Modified", DateTime.UtcNow.ToString() }, {"Content-MD5", "123-MD5" } })); TestableWebRequestCreateFactory.GetFactory().AddRequest(expectedRawRequest); var request = new PutBlobRequest(_settings, expectedContainer, expectedBlob, 12345, "content/type", "content/encoding", "content/language", "content/md5", "cache/control", null, 321); var response = request.Execute(); Assert.AreEqual(0, expectedRawRequest.ContentLength); Assert.AreEqual("12345", expectedRawRequest.Headers["x-ms-blob-content-length"]); Assert.AreEqual("content/type", expectedRawRequest.ContentType); Assert.AreEqual("content/encoding", expectedRawRequest.Headers["Content-Encoding"]); Assert.AreEqual("content/language", expectedRawRequest.Headers["Content-Language"]); Assert.AreEqual("content/md5", expectedRawRequest.Headers["Content-MD5"]); Assert.AreEqual("cache/control", expectedRawRequest.Headers["Cache-Control"]); Assert.AreEqual("321", expectedRawRequest.Headers["x-ms-blob-sequence-number"]); }
public Task <IPutBlobStrategy> CreatePutBlobStrategyAsync(PutBlobRequest putBlobRequest) { putBlobRequest.ValidateArgument(nameof(putBlobRequest)); var contentType = (putBlobRequest.ContentType ?? defaultContentType); var urlExpirationTime = DateTime.UtcNow.Add(urlDuration); var urlRequest = new GetPreSignedUrlRequest { BucketName = putBlobRequest.ContainerName, ContentType = contentType, Expires = urlExpirationTime, Key = putBlobRequest.BlobName, Protocol = Protocol.HTTPS, Verb = HttpVerb.PUT }; var strategyConfiguration = new HttpPutBlobConfiguration { Url = s3Client.GetPreSignedURL(urlRequest), UrlExpirationUtc = urlExpirationTime, ContentType = contentType }; return(Task.FromResult(new HttpPutBlobStrategy(strategyConfiguration) as IPutBlobStrategy)); }
public Task <IPutBlobStrategy> CreatePutBlobStrategyAsync(PutBlobRequest putBlobRequest) { putBlobRequest.ValidateArgument(nameof(putBlobRequest)); var container = cloudBlobClient.GetContainerReference(putBlobRequest.ContainerName.ToLower()); var blob = container.GetBlockBlobReference(putBlobRequest.BlobName); var sasStartTime = DateTime.UtcNow.Add(urlStartOffset); var sasExpirationTime = DateTime.UtcNow.Add(urlDuration); var sasBlobPolicy = new SharedAccessBlobPolicy { SharedAccessStartTime = sasStartTime, SharedAccessExpiryTime = sasExpirationTime, Permissions = SharedAccessBlobPermissions.Write }; var strategyConfiguration = new HttpPutBlobConfiguration { Url = (blob.Uri + blob.GetSharedAccessSignature(sasBlobPolicy)), UrlExpirationUtc = sasExpirationTime, ContentType = (putBlobRequest.ContentType ?? defaultContentType), RequestHeaders = new Dictionary <string, string> { ["x-ms-blob-type"] = xMsBlockBlobType } }; return(Task.FromResult(new HttpPutBlobStrategy(strategyConfiguration) as IPutBlobStrategy)); }
public void Execute_BlockBlob_ResponseParsesHeadersCorrectly() { var expectedContainer = "test-container"; var expectedBlob = "test-blob"; var expectedUri = String.Format("{0}/{1}/{2}", _settings.BlobEndpoint, expectedContainer, expectedBlob); var expectedDate = DateTime.UtcNow.AddDays(-2345); var expectedRawRequest = new TestableWebRequest(new Uri(expectedUri)) .EnqueueResponse(new HttpResponseSettings((HttpStatusCode)201, "Success", "", false, new Dictionary <string, string>() { { "ETag", "\"123\"" }, { "Date", expectedDate.ToString() }, { "Last-Modified", expectedDate.ToString() }, { "Content-MD5", "123-MD5" } })); TestableWebRequestCreateFactory.GetFactory().AddRequest(expectedRawRequest); var expectedData = UTF8Encoding.UTF8.GetBytes("test-data"); var request = new PutBlobRequest(_settings, expectedContainer, expectedBlob, expectedData); var response = request.Execute(); Assert.AreEqual("123", response.Payload.ETag); Assert.IsTrue(Math.Abs(expectedDate.Subtract(response.Payload.Date).TotalMinutes) < 1); Assert.IsTrue(Math.Abs(expectedDate.Subtract(response.Payload.LastModified).TotalMinutes) < 1); Assert.AreEqual("123-MD5", response.Payload.ContentMD5); }
public void Execute_PageBlobWithAllHeaders_AllHeadersSetProperly() { var expectedContainer = "test-container"; var expectedBlob = "test-blob"; var expectedUri = String.Format("{0}/{1}/{2}", _settings.BlobEndpoint, expectedContainer, expectedBlob); var expectedRawRequest = new TestableWebRequest(new Uri(expectedUri)) .EnqueueResponse(new HttpResponseSettings((HttpStatusCode)201, "Created", "", false, new Dictionary <string, string>() { { "ETag", "\"123\"" }, { "Date", DateTime.UtcNow.ToString() }, { "Last-Modified", DateTime.UtcNow.ToString() }, { "Content-MD5", "123-MD5" } })); TestableWebRequestCreateFactory.GetFactory().AddRequest(expectedRawRequest); var request = new PutBlobRequest(_settings, expectedContainer, expectedBlob, 12345, "content/type", "content/encoding", "content/language", "content/md5", "cache/control", null, 321); var response = request.Execute(); Assert.AreEqual(0, expectedRawRequest.ContentLength); Assert.AreEqual("12345", expectedRawRequest.Headers["x-ms-blob-content-length"]); Assert.AreEqual("content/type", expectedRawRequest.ContentType); Assert.AreEqual("content/encoding", expectedRawRequest.Headers["Content-Encoding"]); Assert.AreEqual("content/language", expectedRawRequest.Headers["Content-Language"]); Assert.AreEqual("content/md5", expectedRawRequest.Headers["Content-MD5"]); Assert.AreEqual("cache/control", expectedRawRequest.Headers["Cache-Control"]); Assert.AreEqual("321", expectedRawRequest.Headers["x-ms-blob-sequence-number"]); }
public void PutBlobRoundtrip() { var model = MetadataServiceSerializer.TypeModel; var obj = new PutBlobRequest(); CheckSerializationRoundtrip(model, obj); }
public async Task <PutBlobResponse> PutPageBlobAsync(string containerName, string blobName, int contentLength, string contentType = null, string contentEncoding = null, string contentLanguage = null, string contentMD5 = null, string cacheControl = null, Dictionary <string, string> metadata = null, long sequenceNumber = 0, string leaseId = null) { var request = new PutBlobRequest(_account, containerName, blobName, contentLength, contentType, contentEncoding, contentLanguage, contentMD5, cacheControl, metadata, sequenceNumber, leaseId); var response = await request.ExecuteAsync(); return(response.Payload); }
/// <summary> /// Creates a new BlockBlob (Alias for the PutBlob call with a Blob Type of BlockBlob) /// </summary> public PutBlobResponse PutBlockBlob(string containerName, string blobName, byte[] data, string contentType = null, string contentEncoding = null, string contentLanguage = null, string contentMD5 = null, string cacheControl = null, Dictionary <string, string> metadata = null, string leaseId = null) { var request = new PutBlobRequest(_account, containerName, blobName, data, contentType, contentEncoding, contentLanguage, contentMD5, cacheControl, metadata, leaseId); var response = request.Execute(); return(response.Payload); }
public Task <PutBlobResponse> PutBlobAsync(PutBlobRequest request, CallContext callContext = default) { return(ExecuteAsync(request, callContext, context => { // NOTE: We don't persist put blob requests currently because they are not critical. // This can be enabled by setting PersistRequest=true return _store.PutBlobAsync(context, request.ContentHash, request.Blob) .SelectAsync(_ => new PutBlobResponse()); }, extraEndMessage: _ => $"Hash=[{request.ContentHash}] Size=[{request.Blob.Length}]")); }
public async Task <IActionResult> PutBlob(string containerName, string blobName, string contentType) { if (string.IsNullOrEmpty(blobName)) { return(BadRequest($"Blob name is required (e.g., 'http://.../put-blob/{containerName}/[blobName]').")); } var putBlobRequest = new PutBlobRequest(containerName, blobName, contentType); var putBlobStrategy = await storageStrategyProvider.CreatePutBlobStrategyAsync(putBlobRequest); return(new ObjectResult(putBlobStrategy)); }
public Task GarbageCollectSingleEvent() { return(RunTest(async(context, stream, _, _) => { var ev1 = new PutBlobRequest(); await stream.WriteEventAsync(context, ev1).SelectResult(r => r.Should().BeTrue()); var cursor = await stream.BeforeCheckpointAsync(context).ThrowIfFailureAsync(); await stream.AfterCheckpointAsync(context, cursor).ShouldBeSuccess(); var requests = await CollectStream(context, stream, cursor).ThrowIfFailureAsync(); requests.Count.Should().Be(0); })); }
public Task WriteSingleEvent() { return(RunTest(async(context, stream, _, _) => { var ev1 = new PutBlobRequest(); await stream.WriteEventAsync(context, ev1).SelectResult(r => r.Should().BeTrue()); var cursor = await stream.BeforeCheckpointAsync(context).ThrowIfFailureAsync(); var events = await CollectStream(context, stream, cursor).ThrowIfFailureAsync(); events.Count.Should().Be(1); events[0].MethodId.Should().Be(ev1.MethodId); })); }
public async Task PutBlobAsync(PutBlobRequest putBlobRequest, Stream blobStream) { putBlobRequest.ValidateArgument(nameof(putBlobRequest)); if (blobStream == null) { throw new ArgumentNullException(nameof(blobStream)); } if (blobStream.Length == 0) { throw new ArgumentException($"[{nameof(blobStream)}] can not be empty.", nameof(blobStream)); } var strategyDefinition = await storageServiceProxy.GetPutBlobStrategyDefinitionAsync(putBlobRequest); var putBlobStrategy = await putBlobStrategyFactory.CreateStrategyAsync(strategyDefinition); await putBlobStrategy.PutBlobAsync(blobStream); }
public void Execute_BlockBlob_ResponseParsesHeadersCorrectly() { var expectedContainer = "test-container"; var expectedBlob = "test-blob"; var expectedUri = String.Format("{0}/{1}/{2}", _settings.BlobEndpoint, expectedContainer, expectedBlob); var expectedDate = DateTime.UtcNow.AddDays(-2345); var expectedRawRequest = new TestableWebRequest(new Uri(expectedUri)) .EnqueueResponse(new HttpResponseSettings((HttpStatusCode)201, "Success", "", false, new Dictionary<string, string>(){ {"ETag", "\"123\""}, {"Date", expectedDate.ToString() }, {"Last-Modified", expectedDate.ToString() }, {"Content-MD5", "123-MD5" } })); TestableWebRequestCreateFactory.GetFactory().AddRequest(expectedRawRequest); var expectedData = UTF8Encoding.UTF8.GetBytes("test-data"); var request = new PutBlobRequest(_settings, expectedContainer, expectedBlob, expectedData); var response = request.Execute(); Assert.AreEqual("123", response.Payload.ETag); Assert.IsTrue(Math.Abs(expectedDate.Subtract(response.Payload.Date).TotalMinutes) < 1); Assert.IsTrue(Math.Abs(expectedDate.Subtract(response.Payload.LastModified).TotalMinutes) < 1); Assert.AreEqual("123-MD5", response.Payload.ContentMD5); }
public async Task <StorageStrategyDefinition> GetPutBlobStrategyDefinitionAsync(PutBlobRequest putBlobRequest) { putBlobRequest.ValidateArgument(nameof(putBlobRequest)); var relativeUrlBuilder = new StringBuilder($"/put-blob/{putBlobRequest.ContainerName}/{putBlobRequest.BlobName}"); if (string.IsNullOrEmpty(putBlobRequest.ContentType) == false) { relativeUrlBuilder.Append($"?contentType={putBlobRequest.ContentType}"); } var relativeUrl = new Uri(relativeUrlBuilder.ToString(), UriKind.Relative); var response = await httpClient.GetStringAsync(new Uri(baseUrl, relativeUrl)).ConfigureAwait(false); return(JsonConvert.DeserializeObject <StorageStrategyDefinition>(response)); }