Example #1
0
        /// <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);
        }
Example #2
0
        /// <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;
                    }
                }
            }
        }
Example #3
0
        /// <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;
            }
        }
Example #4
0
        /// <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;
        }