internal bool TryCalculateODataUriProcessingError(ODataRequest request, DataServiceProtocolVersion maxDataServiceVersion, DataServiceProtocolVersion maxProtocolVersion, string acceptType, out ExpectedErrorMessage expectedErrorMessage)
        {
            expectedErrorMessage = null;

            if (request.Uri.IsEntity() || request.Uri.IsEntitySet() || request.Uri.IsServiceOperation())
            {
                bool isEntityFromNonOperationQuery = request.GetEffectiveVerb() == HttpVerb.Get && !request.Uri.IsServiceOperation();
                bool isEntityFromOperation         = request.Uri.IsServiceOperation() && (request.Uri.IsEntity() || request.Uri.IsEntitySet());

                // Do an EPM on all returning sets for the response
                if (isEntityFromNonOperationQuery || isEntityFromOperation)
                {
                    EntitySet startingEntitySet = null;
                    if (request.Uri.TryGetExpectedEntitySet(out startingEntitySet))
                    {
                        DataServiceProtocolVersion minVersion = startingEntitySet.CalculateEntitySetProtocolVersion(acceptType, VersionCalculationType.Response, maxProtocolVersion, maxDataServiceVersion);

                        // Check Epm First
                        if (maxDataServiceVersion != DataServiceProtocolVersion.Unspecified && minVersion > maxDataServiceVersion)
                        {
                            expectedErrorMessage = new ExpectedErrorMessage(MaxDataServiceVersionTooLow, maxDataServiceVersion.ConvertToHeaderFormat(), minVersion.ConvertToIntegerFormat(), "0");
                            return(true);
                        }
                    }

                    // we need to check the root Entity Set first, then any/all, and later the Expand
                    foreach (EntitySet entitySet in request.Uri.GetIncludingExpandsSets())
                    {
                        DataServiceProtocolVersion minVersion = entitySet.CalculateEntitySetProtocolVersion(acceptType, VersionCalculationType.Response, maxProtocolVersion, maxDataServiceVersion);

                        // Check Epm First
                        if (maxDataServiceVersion != DataServiceProtocolVersion.Unspecified && minVersion > maxDataServiceVersion)
                        {
                            expectedErrorMessage = new ExpectedErrorMessage(MaxDataServiceVersionTooLow, maxDataServiceVersion.ConvertToHeaderFormat(), minVersion.ConvertToIntegerFormat(), "0");
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
        private bool TryCalculateODataResponseError(ODataRequest request, DataServiceProtocolVersion dataServiceVersion, DataServiceProtocolVersion maxDataServiceVersion, DataServiceProtocolVersion maxProtocolVersion, out ExpectedErrorMessage expectedErrorMessage)
        {
            expectedErrorMessage = null;

            string preferHeader = request.GetHeaderValueIfExists(HttpHeaders.Prefer);

            if (preferHeader != null &&
                maxProtocolVersion > DataServiceProtocolVersion.V4 &&
                dataServiceVersion > DataServiceProtocolVersion.V4 &&
                maxDataServiceVersion != DataServiceProtocolVersion.Unspecified &&
                maxDataServiceVersion < DataServiceProtocolVersion.V4 &&
                request.Verb != HttpVerb.Delete)
            {
                expectedErrorMessage = new ExpectedErrorMessage(MaxDataServiceVersionTooLow, maxDataServiceVersion.ConvertToHeaderFormat(), DataServiceProtocolVersion.V4.ConvertToIntegerFormat(), "0");
                return(true);
            }

            // Now do payload processing
            DataServiceProtocolVersion expectedResponseVersion = this.MinimumVersionRequiredCalculator.CalculateMinResponseVersion(request, maxProtocolVersion);

            // Now ensure its not greater than than MDSV
            if (maxDataServiceVersion != DataServiceProtocolVersion.Unspecified && expectedResponseVersion > maxDataServiceVersion)
            {
                expectedErrorMessage = new ExpectedErrorMessage(MaxDataServiceVersionTooLow, maxDataServiceVersion.ConvertToHeaderFormat(), expectedResponseVersion.ConvertToIntegerFormat(), "0");
                return(true);
            }

            return(false);
        }
        internal static bool TryCalculateVersionError(DataServiceProtocolVersion calculatedUriSegmentVersion, DataServiceProtocolVersion dataServiceVersion, DataServiceProtocolVersion maxProtocolVersion, out ExpectedErrorMessage expectedErrorMessage)
        {
            expectedErrorMessage = null;

            // First ensure that the version is greater than mpv
            if (calculatedUriSegmentVersion > maxProtocolVersion)
            {
                expectedErrorMessage = new ExpectedErrorMessage(DataServiceRequestVersionMustBeLessThanMPV, calculatedUriSegmentVersion.ConvertToHeaderFormat(), maxProtocolVersion.ConvertToHeaderFormat());
                return(true);
            }

            // Now ensure its not greater than than DSV
            if (calculatedUriSegmentVersion > dataServiceVersion)
            {
                expectedErrorMessage = new ExpectedErrorMessage(DataServiceVersionTooLow, dataServiceVersion.ConvertToHeaderFormat(), calculatedUriSegmentVersion.ConvertToIntegerFormat(), "0");
                return(true);
            }

            return(false);
        }