Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
a8e418c
generate base files based on swagger docs
browndav-msft Mar 30, 2026
92ea65a
create live tests for createSession
browndav-msft Apr 1, 2026
d90ea8e
add recordings
browndav-msft Apr 1, 2026
5c81715
create new files based on swagger update
browndav-msft Apr 2, 2026
dab6ac3
add two params to BlobContainerClient#createSessionWithResponse
browndav-msft Apr 2, 2026
06bbceb
add sanitizers for SessionToken and SessionKey to BlobTestBase
browndav-msft Apr 3, 2026
dd12bfd
add recording for createSessionReturnsTokenAndKey
browndav-msft Apr 3, 2026
a201609
create StorageSessionCredential with isExpired
browndav-msft Apr 3, 2026
ed36a92
create BlobSessionClient so that BlobSessionProvider takes it as a de…
browndav-msft Apr 4, 2026
183216a
create BlobSEssionClient with tests
browndav-msft Apr 6, 2026
14d51e5
add recorings for BlobSessionClient
browndav-msft Apr 6, 2026
cee223e
fix BlobContainerAsyncClient to match new swagger, add new recording
browndav-msft Apr 6, 2026
53edfce
add SessionProvider and SessionProviderTest
browndav-msft Apr 6, 2026
ba27517
add accountName to BlobSessionClient
browndav-msft Apr 6, 2026
7b1e62f
add accountName to StorageSessionCredential and SesionTestHelper
browndav-msft Apr 6, 2026
a5033bd
wip
browndav-msft Apr 7, 2026
651fc0f
change sessionprovider to SEssionTokenCredentialPolicy
browndav-msft Apr 9, 2026
5173527
wip
browndav-msft Apr 14, 2026
2ae4c4d
move session tests from containerapi to blobsessionclienttests
browndav-msft Apr 14, 2026
dc0609e
fix blobsessiontests and add place holder for end-to-end tests in con…
browndav-msft Apr 14, 2026
d2f1e0d
add recordings for blobsessionclient
browndav-msft Apr 15, 2026
70b0552
linting
browndav-msft Apr 15, 2026
cf7f3d3
refactor cache into separate class so it follows BearerTokenAuthentic…
browndav-msft Apr 15, 2026
7954161
add 503 fallback
browndav-msft Apr 15, 2026
5427d79
add tests for udsas, but disabled for now
browndav-msft Apr 15, 2026
cce1e4e
refactor createContext to use hardcoded endpoint
browndav-msft Apr 16, 2026
ce166ec
add SessionMode and tests for SessionMode
browndav-msft Apr 16, 2026
7a5ee36
add sessionOptions to buildPipeline, add null to builders not using s…
browndav-msft Apr 17, 2026
a4c9e43
move SessionTokenCredentialPolicy ahead of StorageBearerTokenChalleng…
browndav-msft Apr 18, 2026
96e2dd7
fix linting issues
browndav-msft Apr 18, 2026
1179b0d
add session to BlobServiceClients and BlobServiceClientBuildeer
browndav-msft Apr 20, 2026
e10c762
change expiration so that it defaults to 5 minutes, if there is no ex…
browndav-msft Apr 20, 2026
f1257f4
move SessionOptions so that it is public
browndav-msft Apr 20, 2026
54e05a1
remove old SessionOptions
browndav-msft Apr 20, 2026
4d81146
remove unnecessary references to containerName and serviceVersion
browndav-msft Apr 20, 2026
7e8eb55
add BlobContainerSessionInfo, add other Copilot recommendations
browndav-msft Apr 20, 2026
ae10983
delete BlobContainerSessionInfo, restore return CreateSessionResponse
browndav-msft Apr 20, 2026
384909d
create createSession end-to-end test with recordings
browndav-msft Apr 20, 2026
7f6247a
only allow get requests for getblob
browndav-msft Apr 20, 2026
1a9a611
wrap tests in try-with-resources
browndav-msft Apr 20, 2026
7436cf1
make createSession package private
browndav-msft Apr 20, 2026
7d347c9
fixes based on copilot suggestions
browndav-msft Apr 20, 2026
d7aef3c
Update sdk/storage/azure-storage-blob/src/main/java/com/azure/storage…
browndav-msft Apr 20, 2026
e9b5228
add containerName to SessionOptions
browndav-msft Apr 21, 2026
2f11835
move accountName to SessionOptions
browndav-msft Apr 21, 2026
92691d1
refactor: SessionTokenCredentialPolicy accepts bearer policy as const…
browndav-msft Apr 21, 2026
825159d
refactor: introduce AuthStrategy enum and consolidate analyzeRequest
browndav-msft Apr 22, 2026
ede26db
refactor: remove redundant restype check from analyzeRequest
browndav-msft Apr 22, 2026
8ee7327
change sessionmode from always to singlespecifciedcontainer, add reso…
browndav-msft Apr 22, 2026
887992b
wrap bearer token in sessioncredentialpolicy
browndav-msft Apr 22, 2026
1f62d31
fix NPE for SessionOptions, sessionoptions always non null
browndav-msft Apr 22, 2026
0a93c24
add tests for sessiontokencredpolicy and storagesessioncred
browndav-msft Apr 22, 2026
c741397
add logic to avoid wrapping Bearertoken, if session is not needed
browndav-msft Apr 22, 2026
0ef51e6
add overloaded oauth in blobtestbase to be able to add sessionoptions
browndav-msft Apr 22, 2026
b7e8243
add overloaded getOAuthServiceAsyncClient to be able to pass session …
browndav-msft Apr 22, 2026
e54db67
add custom buildStringToSign to remove `0` from get requests
browndav-msft Apr 22, 2026
e7b935c
readd versions
browndav-msft Apr 23, 2026
9d599d7
readd ci.system.properties
browndav-msft Apr 23, 2026
2cd768c
change session options check for null in BuilderHelper which affected…
browndav-msft Apr 23, 2026
7754d50
add recordings for create sessions, change time to testResource time
browndav-msft Apr 23, 2026
d01f8f0
add requestInspectionPolicy and overloaded getoauth client in base test
browndav-msft Apr 23, 2026
26965a5
fix null sessionsoptions issue
browndav-msft Apr 23, 2026
9c5018f
add fix in storagesessioncredntial for query params
browndav-msft Apr 23, 2026
4e90c72
add SessionTokenCredPolicy to checks for anonymousAccess
browndav-msft Apr 23, 2026
c819991
remove constructor for BlobSessionClients that uses parse url
browndav-msft Apr 24, 2026
a988e5b
linting issues, remove SessionOptions from service methods
browndav-msft Apr 24, 2026
84061e8
add comments to policyrefreshNearExpiry test
browndav-msft Apr 24, 2026
edc4ebe
fix linting issues
browndav-msft Apr 24, 2026
a66b67f
add check for container name
browndav-msft Apr 24, 2026
4335955
fix return javadoc for SessionMode
browndav-msft Apr 26, 2026
72a8bb8
add LOGGER and appropriate error throwing in BlobSessionClient
browndav-msft Apr 26, 2026
b3a8a16
changes based on feedback from isabelle
browndav-msft Apr 26, 2026
c96f460
add single retry for all 401 errors
browndav-msft Apr 26, 2026
ca7eedb
remove unused imports
browndav-msft Apr 26, 2026
019787a
add suppression for SessionTokenPolicy for linting
browndav-msft Apr 26, 2026
08a8d39
fix ubuntu tests hanging by removing local dns bypass
browndav-msft Apr 27, 2026
342eb15
add session for blob client with tests
browndav-msft Apr 28, 2026
8429d1a
create unified http transport between data requests and session reque…
browndav-msft Apr 28, 2026
4e75168
test multiple concurrency
browndav-msft Apr 28, 2026
920d589
add branching if for bearer policy
browndav-msft Apr 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions eng/common/pipelines/templates/steps/verify-agent-os.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,3 @@ steps:
filePath: ${{ parameters.ScriptDirectory }}/Verify-AgentOS.ps1
arguments: >
-AgentImage "${{ parameters.AgentImage }}"
- template: /eng/common/pipelines/templates/steps/bypass-local-dns.yml
2 changes: 1 addition & 1 deletion sdk/storage/azure-storage-blob/assets.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"AssetsRepo": "Azure/azure-sdk-assets",
"AssetsRepoPrefixPath": "java",
"TagPrefix": "java/storage/azure-storage-blob",
"Tag": "java/storage/azure-storage-blob_47f4243e59"
"Tag": "java/storage/azure-storage-blob_dbe8c45320"
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<suppress files="com.azure.storage.blob.implementation.util.BlobSasImplUtil.java" checks="io.clientcore.linting.extensions.checkstyle.checks.EnforceFinalFieldsCheck" />
<suppress files="com.azure.storage.blob.specialized.BlobOutputStream.java" checks="io.clientcore.linting.extensions.checkstyle.checks.EnforceFinalFieldsCheck" />
<suppress files="com.azure.storage.blob.implementation.util.BlobUserAgentModificationPolicy.java" checks="io.clientcore.linting.extensions.checkstyle.checks.HttpPipelinePolicyCheck" />
<suppress files="com.azure.storage.blob.implementation.util.SessionTokenCredentialPolicy.java" checks="io.clientcore.linting.extensions.checkstyle.checks.HttpPipelinePolicyCheck" />
<suppress files="com.azure.storage.blob.implementation.AzureBlobStorageImplBuilder.java" checks="io.clientcore.linting.extensions.checkstyle.checks.ServiceClientBuilderCheck" />
<suppress files="com.azure.storage.blob.BlobClient.java" checks="io.clientcore.linting.extensions.checkstyle.checks.ServiceClientCheck" />
<suppress files="com.azure.storage.blob.specialized.BlobLeaseAsyncClient.java" checks="io.clientcore.linting.extensions.checkstyle.checks.ServiceClientCheck" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
import com.azure.storage.blob.models.BlobAudience;
import com.azure.storage.blob.models.CpkInfo;
import com.azure.storage.blob.models.CustomerProvidedKey;
import com.azure.storage.blob.models.SessionMode;
import com.azure.storage.blob.models.SessionOptions;
import com.azure.storage.common.StorageSharedKeyCredential;
import com.azure.storage.common.implementation.connectionstring.StorageAuthenticationSettings;
import com.azure.storage.common.implementation.connectionstring.StorageConnectionString;
Expand Down Expand Up @@ -92,6 +94,7 @@ public final class BlobClientBuilder
private Configuration configuration;
private BlobServiceVersion version;
private BlobAudience audience;
private SessionOptions sessionOptions = new SessionOptions();

/**
* Creates a builder instance that is able to configure and construct {@link BlobClient BlobClients} and {@link
Expand Down Expand Up @@ -133,6 +136,8 @@ public BlobClient buildClient() {
new IllegalArgumentException("Customer provided key and encryption " + "scope cannot both be set"));
}

validateSessionMode();

/*
Implicit and explicit root container access are functionally equivalent, but explicit references are easier
to read and debug.
Expand Down Expand Up @@ -189,18 +194,34 @@ public BlobAsyncClient buildAsyncClient() {

BlobServiceVersion serviceVersion = version != null ? version : BlobServiceVersion.getLatest();

HttpPipeline pipeline = constructPipeline();
HttpPipeline pipeline = constructPipeline(blobContainerName, serviceVersion);

return new BlobAsyncClient(pipeline, endpoint, serviceVersion, accountName, blobContainerName, blobName,
snapshot, customerProvidedKey, encryptionScope, versionId);
}

private HttpPipeline constructPipeline() {
return (httpPipeline != null)
? httpPipeline
: BuilderHelper.buildPipeline(storageSharedKeyCredential, tokenCredential, azureSasCredential, sasToken,
endpoint, retryOptions, coreRetryOptions, logOptions, clientOptions, httpClient, perCallPolicies,
perRetryPolicies, configuration, audience, LOGGER);
private HttpPipeline constructPipeline(String containerName, BlobServiceVersion serviceVersion) {
if (httpPipeline != null) {
return httpPipeline;
}

if (containerName != null) {
sessionOptions.setContainerName(containerName);
}
if (sessionOptions.getAccountName() == null) {
sessionOptions.setAccountName(accountName);
}

return BuilderHelper.buildPipeline(storageSharedKeyCredential, tokenCredential, azureSasCredential, sasToken,
endpoint, retryOptions, coreRetryOptions, logOptions, clientOptions, httpClient, perCallPolicies,
perRetryPolicies, configuration, audience, LOGGER, sessionOptions, serviceVersion);
}

private void validateSessionMode() {
if (sessionOptions.getSessionMode().resolve() != SessionMode.NONE && CoreUtils.isNullOrEmpty(containerName)) {
throw LOGGER.logExceptionAsError(new IllegalArgumentException(
"containerName must be set when using SessionMode." + sessionOptions.getSessionMode()));
}
}

/**
Expand Down Expand Up @@ -650,4 +671,20 @@ public BlobClientBuilder audience(BlobAudience audience) {
this.audience = audience;
return this;
}

/**
* Sets the {@link SessionOptions} that controls how the SDK manages session-based authentication for this blob.
* <p>
* Sessions amortize authentication and authorization cost across many requests by signing them with a lightweight
* HMAC key instead of a full bearer token. When the session mode within the options is set to a value other than
* {@link SessionMode#NONE}, this builder's configured container name is used when the options don't specify one.
*
* @param sessionOptions The session options to use. If {@code null}, defaults to {@link SessionMode#AUTO}
* when identity-based authentication (bearer token) is configured.
* @return the updated BlobClientBuilder object.
*/
public BlobClientBuilder sessionOptions(SessionOptions sessionOptions) {
this.sessionOptions = SessionOptions.orDefault(sessionOptions);
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@
import com.azure.storage.blob.implementation.models.EncryptionScope;
import com.azure.storage.blob.implementation.models.ListBlobsFlatSegmentResponse;
import com.azure.storage.blob.implementation.models.ListBlobsHierarchySegmentResponse;
import com.azure.storage.blob.implementation.models.AuthenticationType;
import com.azure.storage.blob.implementation.models.CreateSessionConfiguration;
import com.azure.storage.blob.implementation.models.CreateSessionResponse;
import com.azure.storage.blob.implementation.util.BlobConstants;
import com.azure.storage.blob.implementation.util.BlobSasImplUtil;
import com.azure.storage.blob.implementation.util.ModelHelper;
Expand Down Expand Up @@ -1691,11 +1694,39 @@ public String generateSas(BlobServiceSasSignatureValues blobServiceSasSignatureV
.generateSas(SasImplUtils.extractSharedKeyCredential(getHttpPipeline()), stringToSignHandler, context);
}

// private boolean validateNoTime(BlobRequestConditions modifiedRequestConditions) {
// if (modifiedRequestConditions == null) {
// return true;
// }
// return modifiedRequestConditions.getIfModifiedSince() == null
// && modifiedRequestConditions.getIfUnmodifiedSince() == null;
// }
/**
* Creates a session scoped to this container. The session provides temporary credentials (a session token and
* session key) that can be used to sign subsequent requests using the Shared Key protocol.
*
* @return A {@link Mono} containing the {@link CreateSessionResponse} with session credentials.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
Mono<CreateSessionResponse> createSession() {
return createSessionWithResponse().flatMap(FluxUtil::toMono);
}

/**
* Creates a session scoped to this container. The session provides temporary credentials (a session token and
* session key) that can be used to sign subsequent requests using the Shared Key protocol.
*
* @return A {@link Mono} containing a {@link Response} with the {@link CreateSessionResponse}.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
Mono<Response<CreateSessionResponse>> createSessionWithResponse() {
try {
return withContext(this::createSessionWithResponse);
} catch (RuntimeException ex) {
return monoError(LOGGER, ex);
}
}

Mono<Response<CreateSessionResponse>> createSessionWithResponse(Context context) {
context = context == null ? Context.NONE : context;
CreateSessionConfiguration config
= new CreateSessionConfiguration().setAuthenticationType(AuthenticationType.HMAC);
return this.azureBlobStorage.getContainers()
.createSessionWithResponseAsync(containerName, config, null, null, context)
.map(response -> new SimpleResponse<>(response, response.getValue()));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@
import com.azure.storage.blob.implementation.models.FilterBlobSegment;
import com.azure.storage.blob.implementation.models.ListBlobsFlatSegmentResponse;
import com.azure.storage.blob.implementation.models.ListBlobsHierarchySegmentResponse;
import com.azure.storage.blob.implementation.models.AuthenticationType;
import com.azure.storage.blob.implementation.models.CreateSessionConfiguration;
import com.azure.storage.blob.implementation.models.CreateSessionResponse;
import com.azure.storage.blob.implementation.util.BlobConstants;
import com.azure.storage.blob.implementation.util.BlobSasImplUtil;
import com.azure.storage.blob.implementation.util.ModelHelper;
Expand Down Expand Up @@ -1509,4 +1512,37 @@ public String generateSas(BlobServiceSasSignatureValues blobServiceSasSignatureV
.generateSas(SasImplUtils.extractSharedKeyCredential(getHttpPipeline()), stringToSignHandler, context);
}

/**
* Creates a session scoped to this container. The session provides temporary credentials (a session token and
* session key) that can be used to sign subsequent requests using the Shared Key protocol.
*
* @return The {@link CreateSessionResponse} with session credentials.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
CreateSessionResponse createSession() {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this supposed to be package private? same question for createSessionWithResponse and async counterparts.

return createSessionWithResponse(null, Context.NONE).getValue();
}

/**
* Creates a session scoped to this container. The session provides temporary credentials (a session token and
* session key) that can be used to sign subsequent requests using the Shared Key protocol.
*
* @param timeout An optional timeout value beyond which a {@link RuntimeException} will be raised.
* @param context Additional context that is passed through the Http pipeline during the service call.
* @return A {@link Response} containing the {@link CreateSessionResponse}.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
Response<CreateSessionResponse> createSessionWithResponse(Duration timeout, Context context) {
Comment thread
browndav-msft marked this conversation as resolved.
Context finalContext = context == null ? Context.NONE : context;
CreateSessionConfiguration config
= new CreateSessionConfiguration().setAuthenticationType(AuthenticationType.HMAC);

Callable<Response<CreateSessionResponse>> operation = () -> {
Response<CreateSessionResponse> response = this.azureBlobStorage.getContainers()
.createSessionWithResponse(containerName, config, null, null, finalContext);
return new SimpleResponse<>(response, response.getValue());
};

return sendRequest(operation, timeout, BlobStorageException.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
import com.azure.storage.blob.models.BlobContainerEncryptionScope;
import com.azure.storage.blob.models.CpkInfo;
import com.azure.storage.blob.models.CustomerProvidedKey;
import com.azure.storage.blob.models.SessionOptions;
import com.azure.storage.blob.models.SessionMode;
import com.azure.storage.common.StorageSharedKeyCredential;
import com.azure.storage.common.implementation.connectionstring.StorageAuthenticationSettings;
import com.azure.storage.common.implementation.connectionstring.StorageConnectionString;
Expand Down Expand Up @@ -91,6 +93,7 @@ public final class BlobContainerClientBuilder implements TokenCredentialTrait<Bl
private Configuration configuration;
private BlobServiceVersion version;
private BlobAudience audience;
private SessionOptions sessionOptions = new SessionOptions();

/**
* Creates a builder instance that is able to configure and construct {@link BlobContainerClient ContainerClients}
Expand Down Expand Up @@ -124,6 +127,8 @@ public BlobContainerClient buildClient() {
new IllegalArgumentException("Customer provided key and encryption " + "scope cannot both be set"));
}

validateSessionMode();

/*
Implicit and explicit root container access are functionally equivalent, but explicit references are easier
to read and debug.
Expand All @@ -133,7 +138,7 @@ public BlobContainerClient buildClient() {

BlobServiceVersion serviceVersion = version != null ? version : BlobServiceVersion.getLatest();

HttpPipeline pipeline = constructPipeline();
HttpPipeline pipeline = constructPipeline(blobContainerName, serviceVersion);

return new BlobContainerClient(pipeline, endpoint, serviceVersion, accountName, blobContainerName,
customerProvidedKey, encryptionScope, blobContainerEncryptionScope);
Expand Down Expand Up @@ -165,6 +170,8 @@ public BlobContainerAsyncClient buildAsyncClient() {
new IllegalArgumentException("Customer provided key and encryption " + "scope cannot both be set"));
}

validateSessionMode();

/*
Implicit and explicit root container access are functionally equivalent, but explicit references are easier
to read and debug.
Expand All @@ -174,18 +181,32 @@ public BlobContainerAsyncClient buildAsyncClient() {

BlobServiceVersion serviceVersion = version != null ? version : BlobServiceVersion.getLatest();

HttpPipeline pipeline = constructPipeline();
HttpPipeline pipeline = constructPipeline(blobContainerName, serviceVersion);

return new BlobContainerAsyncClient(pipeline, endpoint, serviceVersion, accountName, blobContainerName,
customerProvidedKey, encryptionScope, blobContainerEncryptionScope);
}

private HttpPipeline constructPipeline() {
return (httpPipeline != null)
? httpPipeline
: BuilderHelper.buildPipeline(storageSharedKeyCredential, tokenCredential, azureSasCredential, sasToken,
endpoint, retryOptions, coreRetryOptions, logOptions, clientOptions, httpClient, perCallPolicies,
perRetryPolicies, configuration, audience, LOGGER);
private HttpPipeline constructPipeline(String containerName, BlobServiceVersion serviceVersion) {
if (httpPipeline != null) {
return httpPipeline;
}
if (containerName != null) {
sessionOptions.setContainerName(containerName);
}
if (sessionOptions.getAccountName() == null) {
sessionOptions.setAccountName(accountName);
}
return BuilderHelper.buildPipeline(storageSharedKeyCredential, tokenCredential, azureSasCredential, sasToken,
endpoint, retryOptions, coreRetryOptions, logOptions, clientOptions, httpClient, perCallPolicies,
perRetryPolicies, configuration, audience, LOGGER, sessionOptions, serviceVersion);
}

private void validateSessionMode() {
if (sessionOptions.getSessionMode().resolve() != SessionMode.NONE && CoreUtils.isNullOrEmpty(containerName)) {
throw LOGGER.logExceptionAsError(new IllegalArgumentException(
"containerName must be set when using SessionMode." + sessionOptions.getSessionMode()));
}
}

/**
Expand Down Expand Up @@ -606,4 +627,22 @@ public BlobContainerClientBuilder audience(BlobAudience audience) {
this.audience = audience;
return this;
}

/**
* Sets the {@link SessionOptions} that controls how the SDK manages session-based authentication
* for this container.
* <p>
* Sessions amortize authentication and authorization cost across many requests by signing them
* with a lightweight HMAC key instead of a full bearer token. When the session mode within the options
* is set to a value other than {@link SessionMode#NONE},
* {@link #containerName(String) containerName} must also be set.
*
* @param sessionOptions The session options to use. If {@code null}, defaults to {@link SessionMode#AUTO}
* when identity-based authentication (bearer token) is configured.
* @return the updated BlobContainerClientBuilder object.
*/
public BlobContainerClientBuilder sessionOptions(SessionOptions sessionOptions) {
this.sessionOptions = SessionOptions.orDefault(sessionOptions);
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ public BlobContainerClient getBlobContainerClient(String containerName) {
if (CoreUtils.isNullOrEmpty(containerName)) {
containerName = BlobContainerClient.ROOT_CONTAINER_NAME;
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: remove this

return new BlobContainerClient(getHttpPipeline(), getAccountUrl(), getServiceVersion(), getAccountName(),
containerName, customerProvidedKey, encryptionScope, blobContainerEncryptionScope);
}
Expand Down
Loading
Loading