public void ListBlobsScenarioTest(string containerName, BlobListingContext listingContext, HttpStatusCode? expectedError, params string[] expectedBlobs) { HttpWebRequest request = BlobTests.ListBlobsRequest(BlobContext, containerName, listingContext); Assert.IsTrue(request != null, "Failed to create HttpWebRequest"); if (BlobContext.Credentials != null) { BlobTests.SignRequest(request, BlobContext); } HttpWebResponse response = BlobTestUtils.GetResponse(request, BlobContext); try { BlobTests.ListBlobsResponse(response, BlobContext, expectedError); ListBlobsResponse listBlobsResponse = new ListBlobsResponse(response.GetResponseStream()); int i = 0; foreach (IListBlobEntry item in listBlobsResponse.Blobs) { ListBlobEntry blob = item as ListBlobEntry; if (expectedBlobs == null) { Assert.Fail("Should not have blobs."); } Assert.IsTrue(i < expectedBlobs.Length, "Unexpected blob: " + blob.Name); Assert.AreEqual<string>(expectedBlobs[i++], blob.Name, "Incorrect blob."); } if (expectedBlobs != null && i < expectedBlobs.Length) { Assert.Fail("Missing blob: " + expectedBlobs[i] + "(and " + (expectedBlobs.Length - i - 1) + " more)."); } } finally { response.Close(); } }
/// <summary> /// Core implementation of the ListBlobs method. /// </summary> /// <param name="prefix">The blob prefix.</param> /// <param name="maxResults">A non-negative integer value that indicates the maximum number of results to be returned at a time, up to the /// per-operation limit of 5000. If this value is <c>null</c>, the maximum possible number of results will be returned, up to 5000.</param> /// <param name="useFlatBlobListing">Whether to list blobs in a flat listing, or whether to list blobs hierarchically, by virtual directory.</param> /// <param name="blobListingDetails">A <see cref="BlobListingDetails"/> enumeration describing which items to include in the listing.</param> /// <param name="options">A <see cref="BlobRequestOptions"/> object that specifies additional options for the request.</param> /// <param name="currentToken">The continuation token.</param> /// <returns>A <see cref="RESTCommand"/> that lists the blobs.</returns> private RESTCommand<ResultSegment<IListBlobItem>> ListBlobsImpl(string prefix, int? maxResults, bool useFlatBlobListing, BlobListingDetails blobListingDetails, BlobRequestOptions options, BlobContinuationToken currentToken) { if (!useFlatBlobListing && (blobListingDetails & BlobListingDetails.Snapshots) == BlobListingDetails.Snapshots) { throw new ArgumentException(SR.ListSnapshotsWithDelimiterError, "blobListingDetails"); } string delimiter = useFlatBlobListing ? null : this.ServiceClient.DefaultDelimiter; BlobListingContext listingContext = new BlobListingContext(prefix, maxResults, delimiter, blobListingDetails) { Marker = currentToken != null ? currentToken.NextMarker : null }; RESTCommand<ResultSegment<IListBlobItem>> getCmd = new RESTCommand<ResultSegment<IListBlobItem>>(this.ServiceClient.Credentials, this.StorageUri); options.ApplyToStorageCommand(getCmd); getCmd.CommandLocationMode = CommonUtility.GetListingLocationMode(currentToken); getCmd.RetrieveResponseStream = true; getCmd.Handler = this.ServiceClient.AuthenticationHandler; getCmd.BuildClient = HttpClientFactory.BuildHttpClient; getCmd.BuildRequest = (cmd, uri, builder, cnt, serverTimeout, ctx) => ContainerHttpRequestMessageFactory.ListBlobs(uri, serverTimeout, listingContext, cnt, ctx); getCmd.PreProcessResponse = (cmd, resp, ex, ctx) => HttpResponseParsers.ProcessExpectedStatusCodeNoException(HttpStatusCode.OK, resp, null /* retVal */, cmd, ex); getCmd.PostProcessResponse = (cmd, resp, ctx) => { return Task.Factory.StartNew(() => { ListBlobsResponse listBlobsResponse = new ListBlobsResponse(cmd.ResponseStream); List<IListBlobItem> blobList = listBlobsResponse.Blobs.Select(item => this.SelectListBlobItem(item)).ToList(); BlobContinuationToken continuationToken = null; if (listBlobsResponse.NextMarker != null) { continuationToken = new BlobContinuationToken() { NextMarker = listBlobsResponse.NextMarker, TargetLocation = cmd.CurrentResult.TargetLocation, }; } return new ResultSegment<IListBlobItem>(blobList) { ContinuationToken = continuationToken, }; }); }; return getCmd; }
/// <summary> /// Core implementation of the ListBlobs method. /// </summary> /// <param name="prefix">The blob prefix.</param> /// <param name="maxResults">A non-negative integer value that indicates the maximum number of results to be returned at a time, up to the /// per-operation limit of 5000. If this value is <c>null</c>, the maximum possible number of results will be returned, up to 5000.</param> /// <param name="useFlatBlobListing">Specifies whether to list blobs in a flat listing, or whether to list blobs hierarchically, by virtual directory.</param> /// <param name="blobListingDetails">A <see cref="BlobListingDetails"/> enumeration describing which items to include in the listing.</param> /// <param name="options">A <see cref="BlobRequestOptions"/> object that specifies additional options for the request.</param> /// <param name="currentToken">A continuation token returned by a previous listing operation.</param> /// <returns>A <see cref="RESTCommand{T}"/> that lists the blobs.</returns> private RESTCommand<ResultSegment<IListBlobItem>> ListBlobsImpl(string prefix, int? maxResults, bool useFlatBlobListing, BlobListingDetails blobListingDetails, BlobRequestOptions options, BlobContinuationToken currentToken) { if (!useFlatBlobListing && (blobListingDetails & BlobListingDetails.Snapshots) == BlobListingDetails.Snapshots) { throw new ArgumentException(SR.ListSnapshotsWithDelimiterError, "blobListingDetails"); } string delimiter = useFlatBlobListing ? null : this.ServiceClient.DefaultDelimiter; BlobListingContext listingContext = new BlobListingContext(prefix, maxResults, delimiter, blobListingDetails) { Marker = currentToken != null ? currentToken.NextMarker : null }; RESTCommand<ResultSegment<IListBlobItem>> getCmd = new RESTCommand<ResultSegment<IListBlobItem>>(this.ServiceClient.Credentials, this.Uri); getCmd.ApplyRequestOptions(options); getCmd.RetrieveResponseStream = true; getCmd.BuildRequestDelegate = (uri, builder, serverTimeout, ctx) => ContainerHttpWebRequestFactory.ListBlobs(uri, serverTimeout, listingContext, ctx); getCmd.SignRequest = this.ServiceClient.AuthenticationHandler.SignRequest; getCmd.PreProcessResponse = (cmd, resp, ex, ctx) => HttpResponseParsers.ProcessExpectedStatusCodeNoException(HttpStatusCode.OK, resp, null /* retVal */, cmd, ex); getCmd.PostProcessResponse = (cmd, resp, ctx) => { ListBlobsResponse listBlobsResponse = new ListBlobsResponse(cmd.ResponseStream); List<IListBlobItem> blobList = new List<IListBlobItem>( listBlobsResponse.Blobs.Select(item => this.SelectListBlobItem(item))); BlobContinuationToken continuationToken = null; if (listBlobsResponse.NextMarker != null) { continuationToken = new BlobContinuationToken() { NextMarker = listBlobsResponse.NextMarker, }; } return new ResultSegment<IListBlobItem>(blobList) { ContinuationToken = continuationToken, }; }; return getCmd; }