in sdk/storage/Azure.Storage.Blobs/src/PageBlobClient.cs [3722:4162]
public virtual Response<PageInfo> UploadPagesFromUri(
Uri sourceUri,
HttpRange sourceRange,
HttpRange range,
PageBlobUploadPagesFromUriOptions options = default,
CancellationToken cancellationToken = default) =>
UploadPagesFromUriInternal(
sourceUri,
sourceRange,
range,
options?.SourceContentHash,
options?.DestinationConditions,
options?.SourceConditions,
options?.SourceAuthentication,
options?.SourceShareTokenIntent,
async: false,
cancellationToken)
.EnsureCompleted();
/// <summary>
/// The <see cref="UploadPagesFromUriAsync(Uri, HttpRange, HttpRange, PageBlobUploadPagesFromUriOptions, CancellationToken)"/>
/// operation writes a range of pages to a page blob where the contents are read from
/// sourceUri.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/en-us/rest/api/storageservices/put-page-from-url">
/// Put Page From URL</see>.
/// </summary>
/// <param name="sourceUri">
/// Specifies the <see cref="Uri"/> of the source blob. The value may
/// be a <see cref="Uri" /> of up to 2 KB in length that specifies a
/// blob. The source blob must either be public or must be
/// authenticated via a shared access signature. If the source blob
/// is public, no authentication is required to perform the operation.
/// </param>
/// <param name="sourceRange">
/// Optionally only upload the bytes of the blob in the
/// sourceUri in the specified range.
/// </param>
/// <param name="range">
/// Specifies the range to be written as a page. Both the start and
/// end of the range must be specified and can be up to 4MB in size.
/// Given that pages must be aligned with 512-byte boundaries, the
/// start of the range must be a modulus of 512 and the end of the
/// range must be a modulus of 512 – 1. Examples of valid byte ranges
/// are 0-511, 512-1023, etc.
/// </param>
/// <param name="options">
/// Optional parameters. <see cref="PageBlobUploadPagesFromUriOptions"/>.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response{PageInfo}"/> describing the
/// state of the updated pages.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
public virtual async Task<Response<PageInfo>> UploadPagesFromUriAsync(
Uri sourceUri,
HttpRange sourceRange,
HttpRange range,
PageBlobUploadPagesFromUriOptions options = default,
CancellationToken cancellationToken = default) =>
await UploadPagesFromUriInternal(
sourceUri,
sourceRange,
range,
options?.SourceContentHash,
options?.DestinationConditions,
options?.SourceConditions,
options?.SourceAuthentication,
options?.SourceShareTokenIntent,
async: true,
cancellationToken)
.ConfigureAwait(false);
/// <summary>
/// The <see cref="UploadPagesFromUri(Uri, HttpRange, HttpRange, byte[], PageBlobRequestConditions, PageBlobRequestConditions, CancellationToken)"/>
/// operation writes a range of pages to a page blob where the contents are read from
/// sourceUri.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/en-us/rest/api/storageservices/put-page-from-url">
/// Put Page From URL</see>.
/// </summary>
/// <param name="sourceUri">
/// Specifies the <see cref="Uri"/> of the source blob. The value may
/// be a <see cref="Uri" /> of up to 2 KB in length that specifies a
/// blob. The source blob must either be public or must be
/// authenticated via a shared access signature. If the source blob
/// is public, no authentication is required to perform the operation.
/// </param>
/// <param name="sourceRange">
/// Optionally only upload the bytes of the blob in the
/// sourceUri in the specified range.
/// </param>
/// <param name="range">
/// Specifies the range to be written as a page. Both the start and
/// end of the range must be specified and can be up to 4MB in size.
/// Given that pages must be aligned with 512-byte boundaries, the
/// start of the range must be a modulus of 512 and the end of the
/// range must be a modulus of 512 – 1. Examples of valid byte ranges
/// are 0-511, 512-1023, etc.
/// </param>
/// <param name="sourceContentHash">
/// Optional MD5 hash of the page block content from the
/// sourceUri. This hash is used to verify the
/// integrity of the block during transport of the data from the Uri.
/// When this hash is specified, the storage service compares the hash
/// of the content that has arrived from the sourceUri
/// with this value. Note that this md5 hash is not stored with the
/// blob. If the two hashes do not match, the operation will fail
/// with a <see cref="RequestFailedException"/>.
/// </param>
/// <param name="conditions">
/// Optional <see cref="PageBlobRequestConditions"/> to add
/// conditions on the copying of data to this page blob.
/// </param>
/// <param name="sourceConditions">
/// Optional <see cref="PageBlobRequestConditions"/> to add
/// conditions on the copying of data from this source blob.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response{PageInfo}"/> describing the
/// state of the updated pages.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
[EditorBrowsable(EditorBrowsableState.Never)]
#pragma warning disable AZC0002 // DO ensure all service methods, both asynchronous and synchronous, take an optional CancellationToken parameter called cancellationToken.
public virtual Response<PageInfo> UploadPagesFromUri(
#pragma warning restore AZC0002 // DO ensure all service methods, both asynchronous and synchronous, take an optional CancellationToken parameter called cancellationToken.
Uri sourceUri,
HttpRange sourceRange,
HttpRange range,
byte[] sourceContentHash,
PageBlobRequestConditions conditions,
PageBlobRequestConditions sourceConditions,
CancellationToken cancellationToken) =>
UploadPagesFromUriInternal(
sourceUri,
sourceRange,
range,
sourceContentHash,
conditions,
sourceConditions,
sourceAuthentication: default,
sourceTokenIntent: default,
async: false,
cancellationToken)
.EnsureCompleted();
/// <summary>
/// The <see cref="UploadPagesFromUriAsync(Uri, HttpRange, HttpRange, byte[], PageBlobRequestConditions, PageBlobRequestConditions, CancellationToken)"/>
/// operation writes a range of pages to a page blob where the contents are read from
/// sourceUri.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/en-us/rest/api/storageservices/put-page-from-url">
/// Put Page From URL</see>.
/// </summary>
/// <param name="sourceUri">
/// Specifies the <see cref="Uri"/> of the source blob. The value may
/// be a <see cref="Uri" /> of up to 2 KB in length that specifies a
/// blob. The source blob must either be public or must be
/// authenticated via a shared access signature. If the source blob
/// is public, no authentication is required to perform the operation.
/// </param>
/// <param name="sourceRange">
/// Optionally only upload the bytes of the blob in the
/// sourceUri in the specified range.
/// </param>
/// <param name="range">
/// Specifies the range to be written as a page. Both the start and
/// end of the range must be specified and can be up to 4MB in size.
/// Given that pages must be aligned with 512-byte boundaries, the
/// start of the range must be a modulus of 512 and the end of the
/// range must be a modulus of 512 – 1. Examples of valid byte ranges
/// are 0-511, 512-1023, etc.
/// </param>
/// <param name="sourceContentHash">
/// Optional MD5 hash of the page block content from the
/// sourceUri. This hash is used to verify the
/// integrity of the block during transport of the data from the Uri.
/// When this hash is specified, the storage service compares the hash
/// of the content that has arrived from the sourceUri
/// with this value. Note that this md5 hash is not stored with the
/// blob. If the two hashes do not match, the operation will fail
/// with a <see cref="RequestFailedException"/>.
/// </param>
/// <param name="conditions">
/// Optional <see cref="PageBlobRequestConditions"/> to add
/// conditions on the copying of data to this page blob.
/// </param>
/// <param name="sourceConditions">
/// Optional <see cref="PageBlobRequestConditions"/> to add
/// conditions on the copying of data from this source blob.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response{PageInfo}"/> describing the
/// state of the updated pages.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
[EditorBrowsable(EditorBrowsableState.Never)]
#pragma warning disable AZC0002 // DO ensure all service methods, both asynchronous and synchronous, take an optional CancellationToken parameter called cancellationToken.
public virtual async Task<Response<PageInfo>> UploadPagesFromUriAsync(
#pragma warning restore AZC0002 // DO ensure all service methods, both asynchronous and synchronous, take an optional CancellationToken parameter called cancellationToken.
Uri sourceUri,
HttpRange sourceRange,
HttpRange range,
byte[] sourceContentHash,
PageBlobRequestConditions conditions,
PageBlobRequestConditions sourceConditions,
CancellationToken cancellationToken) =>
await UploadPagesFromUriInternal(
sourceUri,
sourceRange,
range,
sourceContentHash,
conditions,
sourceConditions,
sourceAuthentication: default,
sourceTokenIntent: default,
async: true,
cancellationToken)
.ConfigureAwait(false);
/// <summary>
/// The <see cref="UploadPagesFromUriInternal"/> operation writes a
/// range of pages to a page blob where the contents are read from
/// sourceUri.
///
/// For more information, see
/// <see href="https://docs.microsoft.com/en-us/rest/api/storageservices/put-page-from-url">
/// Put Page From URL</see>.
/// </summary>
/// <param name="sourceUri">
/// Specifies the <see cref="Uri"/> of the source blob. The value may
/// be a <see cref="Uri" /> of up to 2 KB in length that specifies a
/// blob. The source blob must either be public or must be
/// authenticated via a shared access signature. If the source blob
/// is public, no authentication is required to perform the operation.
/// </param>
/// <param name="sourceRange">
/// Optionally only upload the bytes of the blob in the
/// sourceUri in the specified range.
/// </param>
/// <param name="range">
/// Specifies the range to be written as a page. Both the start and
/// end of the range must be specified and can be up to 4MB in size.
/// Given that pages must be aligned with 512-byte boundaries, the
/// start of the range must be a modulus of 512 and the end of the
/// range must be a modulus of 512 – 1. Examples of valid byte ranges
/// are 0-511, 512-1023, etc.
/// </param>
/// <param name="sourceContentHash">
/// Optional MD5 hash of the page block content from the
/// sourceUri. This hash is used to verify the
/// integrity of the block during transport of the data from the Uri.
/// When this hash is specified, the storage service compares the hash
/// of the content that has arrived from the sourceUri
/// with this value. Note that this md5 hash is not stored with the
/// blob. If the two hashes do not match, the operation will fail
/// with a <see cref="RequestFailedException"/>.
/// </param>
/// <param name="conditions">
/// Optional <see cref="PageBlobRequestConditions"/> to add
/// conditions on the copying of data to this page blob.
/// </param>
/// <param name="sourceConditions">
/// Optional <see cref="PageBlobRequestConditions"/> to add
/// conditions on the copying of data from this source blob.
/// </param>
/// <param name="sourceAuthentication">
/// Optional. Source authentication used to access the source blob.
/// </param>
/// <param name="sourceTokenIntent">
/// Optional, only applicable (but required) when the source is Azure Storage Files and using token authentication.
/// Used to indicate the intent of the request.
/// </param>
/// <param name="async">
/// Whether to invoke the operation asynchronously.
/// </param>
/// <param name="cancellationToken">
/// Optional <see cref="CancellationToken"/> to propagate
/// notifications that the operation should be cancelled.
/// </param>
/// <returns>
/// A <see cref="Response{PageInfo}"/> describing the
/// state of the updated pages.
/// </returns>
/// <remarks>
/// A <see cref="RequestFailedException"/> will be thrown if
/// a failure occurs.
/// If multiple failures occur, an <see cref="AggregateException"/> will be thrown,
/// containing each failure instance.
/// </remarks>
private async Task<Response<PageInfo>> UploadPagesFromUriInternal(
Uri sourceUri,
HttpRange sourceRange,
HttpRange range,
byte[] sourceContentHash,
PageBlobRequestConditions conditions,
PageBlobRequestConditions sourceConditions,
HttpAuthorization sourceAuthentication,
FileShareTokenIntent? sourceTokenIntent,
bool async,
CancellationToken cancellationToken)
{
using (ClientConfiguration.Pipeline.BeginLoggingScope(nameof(PageBlobClient)))
{
ClientConfiguration.Pipeline.LogMethodEnter(
nameof(PageBlobClient),
message:
$"{nameof(Uri)}: {Uri}\n" +
$"{nameof(sourceUri)}: {sourceUri}");
DiagnosticScope scope = ClientConfiguration.ClientDiagnostics.CreateScope($"{nameof(PageBlobClient)}.{nameof(UploadPagesFromUri)}");
// All destination PageBlobRequestConditions are valid.
conditions.ValidateConditionsNotPresent(
invalidConditions: BlobRequestConditionProperty.None,
operationName: nameof(PageBlobClient.UploadPagesFromUri),
parameterName: nameof(conditions));
sourceConditions.ValidateConditionsNotPresent(
invalidConditions:
BlobRequestConditionProperty.LeaseId
| BlobRequestConditionProperty.IfSequenceNumberLessThanOrEqual
| BlobRequestConditionProperty.IfSequenceNumberLessThan
| BlobRequestConditionProperty.IfSequenceNumberEqual
| BlobRequestConditionProperty.TagConditions,
operationName: nameof(PageBlobClient.UploadPagesFromUri),
parameterName: nameof(sourceConditions));
try
{
scope.Start();
ResponseWithHeaders<PageBlobUploadPagesFromURLHeaders> response;
if (async)
{
response = await PageBlobRestClient.UploadPagesFromURLAsync(
sourceUrl: sourceUri.AbsoluteUri,
sourceRange: sourceRange.ToString(),
contentLength: 0,
range: range.ToString(),
sourceContentMD5: sourceContentHash,
encryptionKey: ClientConfiguration.CustomerProvidedKey?.EncryptionKey,
encryptionKeySha256: ClientConfiguration.CustomerProvidedKey?.EncryptionKeyHash,
encryptionAlgorithm: ClientConfiguration.CustomerProvidedKey?.EncryptionAlgorithm == null ? null : EncryptionAlgorithmTypeInternal.AES256,
encryptionScope: ClientConfiguration.EncryptionScope,
leaseId: conditions?.LeaseId,
ifSequenceNumberLessThanOrEqualTo: conditions?.IfSequenceNumberLessThanOrEqual,
ifSequenceNumberLessThan: conditions?.IfSequenceNumberLessThan,
ifSequenceNumberEqualTo: conditions?.IfSequenceNumberEqual,
ifModifiedSince: conditions?.IfModifiedSince,
ifUnmodifiedSince: conditions?.IfUnmodifiedSince,
ifMatch: conditions?.IfMatch?.ToString(),
ifNoneMatch: conditions?.IfNoneMatch?.ToString(),
ifTags: conditions?.TagConditions,
sourceIfModifiedSince: sourceConditions?.IfModifiedSince,
sourceIfUnmodifiedSince: sourceConditions?.IfUnmodifiedSince,
sourceIfMatch: sourceConditions?.IfMatch?.ToString(),
sourceIfNoneMatch: sourceConditions?.IfNoneMatch?.ToString(),
copySourceAuthorization: sourceAuthentication?.ToString(),
fileRequestIntent: sourceTokenIntent,
cancellationToken: cancellationToken)
.ConfigureAwait(false);
}
else
{
response = PageBlobRestClient.UploadPagesFromURL(
sourceUrl: sourceUri.AbsoluteUri,
sourceRange: sourceRange.ToString(),
contentLength: 0,
range: range.ToString(),
sourceContentMD5: sourceContentHash,
encryptionKey: ClientConfiguration.CustomerProvidedKey?.EncryptionKey,
encryptionKeySha256: ClientConfiguration.CustomerProvidedKey?.EncryptionKeyHash,
encryptionAlgorithm: ClientConfiguration.CustomerProvidedKey?.EncryptionAlgorithm == null ? null : EncryptionAlgorithmTypeInternal.AES256,
encryptionScope: ClientConfiguration.EncryptionScope,
leaseId: conditions?.LeaseId,
ifSequenceNumberLessThanOrEqualTo: conditions?.IfSequenceNumberLessThanOrEqual,
ifSequenceNumberLessThan: conditions?.IfSequenceNumberLessThan,
ifSequenceNumberEqualTo: conditions?.IfSequenceNumberEqual,
ifModifiedSince: conditions?.IfModifiedSince,
ifUnmodifiedSince: conditions?.IfUnmodifiedSince,
ifMatch: conditions?.IfMatch?.ToString(),
ifNoneMatch: conditions?.IfNoneMatch?.ToString(),
ifTags: conditions?.TagConditions,
sourceIfModifiedSince: sourceConditions?.IfModifiedSince,
sourceIfUnmodifiedSince: sourceConditions?.IfUnmodifiedSince,
sourceIfMatch: sourceConditions?.IfMatch?.ToString(),
sourceIfNoneMatch: sourceConditions?.IfNoneMatch?.ToString(),
copySourceAuthorization: sourceAuthentication?.ToString(),
fileRequestIntent: sourceTokenIntent,
cancellationToken: cancellationToken);
}
return Response.FromValue(
response.ToPageInfo(),
response.GetRawResponse());
}
catch (Exception ex)
{
ClientConfiguration.Pipeline.LogException(ex);
scope.Failed(ex);
throw;
}
finally
{
ClientConfiguration.Pipeline.LogMethodExit(nameof(PageBlobClient));
scope.Dispose();
}
}
}