/// <summary> /// Implementation of the StartCopyFromBlob method. Result is a BlobAttributes object derived from the response headers. /// </summary> /// <param name="blob">The blob.</param> /// <param name="attributes">The attributes.</param> /// <param name="source">The URI of the source blob.</param> /// <param name="sourceAccessCondition">An object that represents the access conditions for the source blob. If null, no condition is used.</param> /// <param name="destAccessCondition">An object that represents the access conditions for the destination blob. If null, no condition is used.</param> /// <param name="options">An object that specifies any additional options for the request.</param> /// <returns> /// A <see cref="RESTCommand{T}" /> that starts to copy the blob. /// </returns> /// <exception cref="System.ArgumentException">sourceAccessCondition</exception> internal static RESTCommand <string> StartCopyFromBlobImpl(ICloudBlob blob, BlobAttributes attributes, Uri source, AccessCondition sourceAccessCondition, AccessCondition destAccessCondition, BlobRequestOptions options) { if (sourceAccessCondition != null && !string.IsNullOrEmpty(sourceAccessCondition.LeaseId)) { throw new ArgumentException(SR.LeaseConditionOnSource, "sourceAccessCondition"); } RESTCommand <string> putCmd = new RESTCommand <string>(blob.ServiceClient.Credentials, attributes.Uri); putCmd.ApplyRequestOptions(options); putCmd.BuildRequestDelegate = (uri, builder, serverTimeout, ctx) => BlobHttpWebRequestFactory.CopyFrom(uri, serverTimeout, source, sourceAccessCondition, destAccessCondition, ctx); putCmd.SetHeaders = (r, ctx) => BlobHttpWebRequestFactory.AddMetadata(r, attributes.Metadata); putCmd.SignRequest = blob.ServiceClient.AuthenticationHandler.SignRequest; putCmd.PreProcessResponse = (cmd, resp, ex, ctx) => { HttpResponseParsers.ProcessExpectedStatusCodeNoException(HttpStatusCode.Accepted, resp, null /* retVal */, cmd, ex, ctx); CopyState state = BlobHttpResponseParsers.GetCopyAttributes(resp); attributes.Properties = BlobHttpResponseParsers.GetProperties(resp); attributes.Metadata = BlobHttpResponseParsers.GetMetadata(resp); attributes.CopyState = state; return(state.CopyId); }; return(putCmd); }
/// <summary> /// Updates this blob with the given attributes a the end of a fetch attributes operation. /// </summary> /// <param name="attributes">The new attributes.</param> /// <param name="response">The response.</param> /// <param name="ignoreMD5">if set to <c>true</c>, blob's MD5 will not be updated.</param> /// <exception cref="System.InvalidOperationException"></exception> internal static void UpdateAfterFetchAttributes(BlobAttributes attributes, HttpWebResponse response, bool ignoreMD5) { BlobProperties properties = BlobHttpResponseParsers.GetProperties(response); // If BlobType is specified and the value returned from cloud is different, // then it's a client error and we need to throw. if (attributes.Properties.BlobType != BlobType.Unspecified && attributes.Properties.BlobType != properties.BlobType) { throw new InvalidOperationException(SR.BlobTypeMismatchExceptionMessage); } if (ignoreMD5) { properties.ContentMD5 = attributes.Properties.ContentMD5; } attributes.Properties = properties; attributes.Metadata = BlobHttpResponseParsers.GetMetadata(response); attributes.CopyState = BlobHttpResponseParsers.GetCopyAttributes(response); }