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"]);
        }
示例#3
0
        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));
        }
示例#4
0
        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"]);
        }
示例#7
0
        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);
        }
示例#10
0
 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));
        }
示例#12
0
        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);
            }));
        }
示例#13
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));
        }