/// <summary> /// Creates an <see cref="ODataBatchOperationRequestMessage"/> for writing an operation of a batch request /// - implementation of the actual functionality. /// </summary> /// <param name="method">The Http method to be used for this request operation.</param> /// <param name="uri">The Uri to be used for this request operation.</param> /// <param name="contentId">The Content-ID value to write in ChangeSet head.</param> /// <param name="payloadUriOption"> /// The format of operation Request-URI, which could be AbsoluteUri, AbsoluteResourcePathAndHost, or RelativeResourcePath.</param> /// <param name="dependsOnIds">The prerequisite request ids of this request. By default its value should be null for Multipart/Mixed /// format and the dependsOnIds implicitly derived per the protocol will be used; Otherwise, non-null will be used as override after /// validation.</param> /// <returns>The message that can be used to write the request operation.</returns> protected override ODataBatchOperationRequestMessage CreateOperationRequestMessageImplementation( string method, Uri uri, string contentId, BatchPayloadUriOption payloadUriOption, IEnumerable <string> dependsOnIds) { // write pending message data (headers, response line) for a previously unclosed message/request this.WritePendingMessageData(true); // create the new request operation // For Multipart batch format, validate dependsOnIds if it is user explicit input, otherwise skip validation // when it is implicitly derived per protocol. ODataBatchOperationRequestMessage operationRequestMessage = BuildOperationRequestMessage( this.RawOutputContext.OutputStream, method, uri, contentId, ODataMultipartMixedBatchWriterUtils.GetChangeSetIdFromBoundary(this.changeSetBoundary), dependsOnIds); this.SetState(BatchWriterState.OperationCreated); // write the operation's start boundary string this.WriteStartBoundaryForOperation(); if (contentId != null) { this.dependsOnIdsTracker.AddDependsOnId(contentId); } // write the headers and request line ODataMultipartMixedBatchWriterUtils.WriteRequestPreamble(this.RawOutputContext.TextWriter, method, uri, this.RawOutputContext.MessageWriterSettings.BaseUri, changeSetBoundary != null, contentId, payloadUriOption); return(operationRequestMessage); }
/// <summary> /// Returns the cached <see cref="ODataBatchOperationRequestMessage"/> for reading the content of an operation /// in a batch request. /// </summary> /// <returns>The message that can be used to read the content of the batch request operation from.</returns> protected override ODataBatchOperationRequestMessage CreateOperationRequestMessageImplementation() { string requestLine = this.batchStream.ReadFirstNonEmptyLine(); string httpMethod; Uri requestUri; this.ParseRequestLine(requestLine, out httpMethod, out requestUri); // Read all headers and create the request message ODataBatchOperationHeaders headers = this.batchStream.ReadHeaders(); if (this.batchStream.ChangeSetBoundary != null) { if (this.currentContentId == null) { headers.TryGetValue(ODataConstants.ContentIdHeader, out this.currentContentId); if (this.currentContentId == null) { throw new ODataException(Strings.ODataBatchOperationHeaderDictionary_KeyNotFound(ODataConstants.ContentIdHeader)); } } } ODataBatchOperationRequestMessage requestMessage = BuildOperationRequestMessage( () => ODataBatchUtils.CreateBatchOperationReadStream(this.batchStream, headers, this), httpMethod, requestUri, headers, this.currentContentId, ODataMultipartMixedBatchWriterUtils.GetChangeSetIdFromBoundary(this.batchStream.ChangeSetBoundary), this.dependsOnIdsTracker.GetDependsOnIds(), /*dependsOnIdsValidationRequired*/ false); if (this.currentContentId != null) { this.dependsOnIdsTracker.AddDependsOnId(this.currentContentId); } this.currentContentId = null; return(requestMessage); }
/// <summary> /// Creates an <see cref="ODataBatchOperationResponseMessage"/> for writing an operation of a batch response - implementation of the actual functionality. /// </summary> /// <param name="contentId">The Content-ID value to write in ChangeSet head.</param> /// <returns>The message that can be used to write the response operation.</returns> protected override ODataBatchOperationResponseMessage CreateOperationResponseMessageImplementation(string contentId) { this.WritePendingMessageData(true); // In responses we don't need to use our batch URL resolver, since there are no cross referencing URLs // so use the URL resolver from the batch message instead. this.CurrentOperationResponseMessage = BuildOperationResponseMessage( this.RawOutputContext.OutputStream, contentId, ODataMultipartMixedBatchWriterUtils.GetChangeSetIdFromBoundary(this.changeSetBoundary)); this.SetState(BatchWriterState.OperationCreated); // write the operation's start boundary string this.WriteStartBoundaryForOperation(); // write the headers and request separator line ODataMultipartMixedBatchWriterUtils.WriteResponsePreamble(this.RawOutputContext.TextWriter, changeSetBoundary != null, contentId); return(this.CurrentOperationResponseMessage); }