/// <summary> /// Interprets the client preference for having a response body. /// </summary> /// <param name="requestDescription">The request description.</param> /// <param name="verb">The request verb.</param> /// <param name="requestMessage">The request message.</param> /// <returns>An enum representation of the client's preference.</returns> private static ResponseBodyPreference InterpretClientPreference(RequestDescription requestDescription, HttpVerbs verb, IODataRequestMessage requestMessage) { Debug.Assert(requestDescription != null, "requestDescription != null"); // If no responseBodyPreference given, we have default behavior of producing content for POST and not producing it for PUT/PATCH. // If responseBodyPreference is given we honor the responseBodyPreference only if the request was for an entity and following conditions are true: // This is not a service operation invoke // DSV was set to 3.0 and above // Server is configured to be >= 3.0 if (requestDescription.LinkUri || requestDescription.SegmentInfos[0].TargetSource == RequestTargetSource.ServiceOperation || requestDescription.RequestVersion < VersionUtil.Version4Dot0) { return(ResponseBodyPreference.None); } if ((verb.IsInsert()) || ((verb.IsUpdate()) && (requestDescription.TargetKind == RequestTargetKind.Resource || requestDescription.IsRequestForNonEntityProperty))) { if (requestMessage.PreferHeader().ReturnContent.HasValue) { return(requestMessage.PreferHeader().ReturnContent.Value ? ResponseBodyPreference.Content : ResponseBodyPreference.NoContent); } } // TODO: move logic for when/when-not-to write a response body here and remove all checks for 'none' elsewhere return(ResponseBodyPreference.None); }
/// <summary> /// Determines the whether response body should be written based on the request verb, the uri, and the client's preference. /// </summary> /// <param name="requestVerb">The request verb.</param> internal void DetermineWhetherResponseBodyShouldBeWritten(HttpVerbs requestVerb) { if (this.responseBodyShouldBeWritten.HasValue) { return; } if (this.Preference.ShouldIncludeResponseBody) { this.responseBodyShouldBeWritten = true; } else if (this.Preference.ShouldNotIncludeResponseBody || !this.ShouldWriteResponseBodyOrETag) { this.responseBodyShouldBeWritten = false; } else { Debug.Assert(!this.Preference.HasResponseBodyPreference, "Should only reach here if no preference was specified."); Debug.Assert(this.ShouldWriteResponseBodyOrETag, "Should only reach here if response body or ETag *might* be written."); this.responseBodyShouldBeWritten = true; if (this.TargetSource != RequestTargetSource.ServiceOperation) { if (requestVerb.IsInsert()) { this.responseBodyShouldBeWritten = !this.LinkUri; } else if (requestVerb.IsChange()) { this.responseBodyShouldBeWritten = false; } } } }
/// <summary> /// Determines the whether response body should be written based on the request verb and the uri. /// NOTE: Does not consider the client's preference when determining this. /// </summary> /// <param name="requestVerb">The request verb.</param> internal void DetermineWhetherResponseBodyOrETagShouldBeWritten(HttpVerbs requestVerb) { if (this.responseBodyOrETagShouldBeWritten.HasValue) { return; } this.responseBodyOrETagShouldBeWritten = true; if (this.TargetSource != RequestTargetSource.ServiceOperation) { if (requestVerb.IsInsert() || requestVerb.IsUpdate()) { this.responseBodyOrETagShouldBeWritten = !this.LinkUri; } else if (requestVerb.IsDelete()) { this.responseBodyOrETagShouldBeWritten = false; } } else if (this.TargetKind == RequestTargetKind.VoidOperation) { this.responseBodyOrETagShouldBeWritten = false; } }
/// <summary> /// Interprets the client preference for having a response body. /// </summary> /// <param name="requestDescription">The request description.</param> /// <param name="verb">The request verb.</param> /// <param name="requestMessage">The request message.</param> /// <returns>An enum representation of the client's preference.</returns> private static ResponseBodyPreference InterpretClientPreference(RequestDescription requestDescription, HttpVerbs verb, IODataRequestMessage requestMessage) { Debug.Assert(requestDescription != null, "requestDescription != null"); // If no responseBodyPreference given, we have default behavior of producing content for POST and not producing it for PUT/PATCH. // If responseBodyPreference is given we honor the responseBodyPreference only if the request was for an entity and following conditions are true: // This is not a service operation invoke // DSV was set to 3.0 and above // Server is configured to be >= 3.0 if (requestDescription.LinkUri || requestDescription.SegmentInfos[0].TargetSource == RequestTargetSource.ServiceOperation || requestDescription.RequestVersion < VersionUtil.Version4Dot0) { return ResponseBodyPreference.None; } if ((verb.IsInsert()) || ((verb.IsUpdate()) && (requestDescription.TargetKind == RequestTargetKind.Resource || requestDescription.IsRequestForNonEntityProperty))) { if (requestMessage.PreferHeader().ReturnContent.HasValue) { return requestMessage.PreferHeader().ReturnContent.Value ? ResponseBodyPreference.Content : ResponseBodyPreference.NoContent; } } // TODO: move logic for when/when-not-to write a response body here and remove all checks for 'none' elsewhere return ResponseBodyPreference.None; }