/// <summary> /// Implementation method for the WriteRange methods. /// </summary> /// <param name="rangeData">The data.</param> /// <param name="startOffset">The start offset.</param> /// <param name="contentMD5">The content MD5.</param> /// <param name="accessCondition">An <see cref="AccessCondition"/> object that represents the access conditions for the file. If <c>null</c>, no condition is used.</param> /// <param name="options">A <see cref="FileRequestOptions"/> object that specifies additional options for the request.</param> /// <returns>A <see cref="RESTCommand{T}"/> that writes the range.</returns> private RESTCommand<NullType> PutRangeImpl(Stream rangeData, long startOffset, string contentMD5, AccessCondition accessCondition, FileRequestOptions options) { long offset = rangeData.Position; long length = rangeData.Length - offset; FileRange fileRange = new FileRange(startOffset, startOffset + length - 1); FileRangeWrite fileRangeWrite = FileRangeWrite.Update; if ((1 + fileRange.EndOffset - fileRange.StartOffset) == 0) { CommonUtility.ArgumentOutOfRange("rangeData", rangeData); } RESTCommand<NullType> putCmd = new RESTCommand<NullType>(this.ServiceClient.Credentials, this.StorageUri); options.ApplyToStorageCommand(putCmd); putCmd.SendStream = rangeData; putCmd.RecoveryAction = (cmd, ex, ctx) => RecoveryActions.SeekStream(cmd, offset); putCmd.BuildRequestDelegate = (uri, builder, serverTimeout, useVersionHeader, ctx) => FileHttpWebRequestFactory.PutRange(uri, serverTimeout, fileRange, fileRangeWrite, accessCondition, useVersionHeader, ctx); putCmd.SetHeaders = (r, ctx) => { if (!string.IsNullOrEmpty(contentMD5)) { r.Headers[HttpRequestHeader.ContentMd5] = contentMD5; } }; putCmd.SignRequest = this.ServiceClient.AuthenticationHandler.SignRequest; putCmd.PreProcessResponse = (cmd, resp, ex, ctx) => { HttpResponseParsers.ProcessExpectedStatusCodeNoException(HttpStatusCode.Created, resp, NullType.Value, cmd, ex); this.UpdateETagLMTAndLength(resp, false); return NullType.Value; }; return putCmd; }
/// <summary> /// Implementation method for the ClearRange methods. /// </summary> /// <param name="startOffset">The start offset.</param> /// <param name="length">Length of the data range to be cleared.</param> /// <param name="accessCondition">An <see cref="AccessCondition"/> object that represents the access conditions for the file. If <c>null</c>, no condition is used.</param> /// <param name="options">A <see cref="FileRequestOptions"/> object that specifies additional options for the request.</param> /// <returns>A <see cref="RESTCommand{T}"/> that clears the range.</returns> private RESTCommand<NullType> ClearRangeImpl(long startOffset, long length, AccessCondition accessCondition, FileRequestOptions options) { CommonUtility.AssertNotNull("options", options); if (startOffset < 0) { CommonUtility.ArgumentOutOfRange("startOffset", startOffset); } if (length <= 0) { CommonUtility.ArgumentOutOfRange("length", length); } FileRange fileRange = new FileRange(startOffset, startOffset + length - 1); FileRangeWrite fileWrite = FileRangeWrite.Clear; RESTCommand<NullType> putCmd = new RESTCommand<NullType>(this.ServiceClient.Credentials, this.StorageUri); options.ApplyToStorageCommand(putCmd); putCmd.BuildRequestDelegate = (uri, builder, serverTimeout, useVersionHeader, ctx) => FileHttpWebRequestFactory.PutRange(uri, serverTimeout, fileRange, fileWrite, accessCondition, useVersionHeader, ctx); putCmd.SignRequest = this.ServiceClient.AuthenticationHandler.SignRequest; putCmd.PreProcessResponse = (cmd, resp, ex, ctx) => { HttpResponseParsers.ProcessExpectedStatusCodeNoException(HttpStatusCode.Created, resp, NullType.Value, cmd, ex); this.UpdateETagLMTAndLength(resp, false); return NullType.Value; }; return putCmd; }
/// <summary> /// Implementation method for the WriteRange methods. /// </summary> /// <param name="rangeData">The range data.</param> /// <param name="startOffset">The start offset.</param> /// <param name="contentMD5">An optional hash value that will be used to set the <see cref="FileProperties.ContentMD5"/> property /// on the file. May be <code>null</code> or an empty string.</param> /// <param name="accessCondition">An <see cref="AccessCondition"/> object that represents the access conditions for the file. If <code>null</code>, no condition is used.</param> /// <param name="options">A <see cref="FileRequestOptions"/> object that specifies additional options for the request.</param> /// <returns>A <see cref="RESTCommand"/> that writes the range.</returns> private RESTCommand<NullType> PutRangeImpl(Stream rangeData, long startOffset, string contentMD5, AccessCondition accessCondition, FileRequestOptions options) { long offset = rangeData.Position; long length = rangeData.Length - offset; FileRange fileRange = new FileRange(startOffset, startOffset + length - 1); FileRangeWrite fileRangeWrite = FileRangeWrite.Update; if ((1 + fileRange.EndOffset - fileRange.StartOffset) == 0) { CommonUtility.ArgumentOutOfRange("rangeData", rangeData); } RESTCommand<NullType> putCmd = new RESTCommand<NullType>(this.ServiceClient.Credentials, this.StorageUri); options.ApplyToStorageCommand(putCmd); putCmd.Handler = this.ServiceClient.AuthenticationHandler; putCmd.BuildClient = HttpClientFactory.BuildHttpClient; putCmd.BuildContent = (cmd, ctx) => HttpContentFactory.BuildContentFromStream(rangeData, offset, length, contentMD5, cmd, ctx); putCmd.BuildRequest = (cmd, uri, builder, cnt, serverTimeout, ctx) => FileHttpRequestMessageFactory.PutRange(uri, serverTimeout, fileRange, fileRangeWrite, accessCondition, cnt, ctx); putCmd.PreProcessResponse = (cmd, resp, ex, ctx) => { HttpResponseParsers.ProcessExpectedStatusCodeNoException(HttpStatusCode.Created, resp, NullType.Value, cmd, ex); this.UpdateETagLMTAndLength(resp, false); return NullType.Value; }; return putCmd; }