internal static string DetermineAcceptType(ODataUri uri, string defaultAcceptType) { if (uri.IsNamedStream() || uri.IsMediaResource()) { return(MimeTypes.Any); } if (uri.IsCount()) { return(MimeTypes.TextPlain); } if (uri.IsPropertyValue()) { string propertyAcceptType = MimeTypes.Any; var propertySegment = uri.Segments[uri.Segments.Count - 2] as PropertySegment; ExceptionUtilities.CheckObjectNotNull(propertySegment, "Cannot get Property segment from uri"); var mimeTypeAnnotation = propertySegment.Property.Annotations.OfType <MimeTypeAnnotation>().SingleOrDefault(); if (mimeTypeAnnotation != null) { propertyAcceptType = mimeTypeAnnotation.MimeTypeValue; } return(propertyAcceptType); } return(defaultAcceptType); }
private static bool HasETagOnRetrieve(ODataUri uri) { if (uri.ExpandSegments.Any()) { return(false); } if (uri.IsEntity()) { return(true); } if (uri.IsProperty()) { return(true); } if (uri.IsPropertyValue() || uri.IsMediaResource()) { // this covers media-resources as well return(true); } if (uri.IsNamedStream()) { return(true); } return(false); }
internal static HttpStatusCode GetExpectedStatusCode(ODataUri uri, IODataUriEvaluator evaluator) { bool specialStatusCodeIfNull = false; specialStatusCodeIfNull |= uri.IsNamedStream(); specialStatusCodeIfNull |= uri.IsMediaResource(); specialStatusCodeIfNull |= uri.IsEntity(); specialStatusCodeIfNull |= uri.IsEntityReferenceLink(); specialStatusCodeIfNull |= uri.IsPropertyValue(); bool uriIsValue = uri.IsNamedStream() || uri.IsMediaResource(); // For an action it is evaluated specially via the actionresponse verifier, skip eval here if (!uri.IsAction() && specialStatusCodeIfNull && evaluator.Evaluate(uri).IsNull) { if (uriIsValue) { return(HttpStatusCode.NoContent); } else { return(HttpStatusCode.NotFound); } } return(HttpStatusCode.OK); }
internal static DataServiceProtocolVersion CalculateUriResponseMinProtocolVersion(ODataUri requestUri, string contentType, DataServiceProtocolVersion maxProtocolVersion, DataServiceProtocolVersion maxDataServiceVersion) { DataServiceProtocolVersion expectedVersion = DataServiceProtocolVersion.V4; if (requestUri.IncludesInlineCountAllPages()) { expectedVersion = expectedVersion.IncreaseVersionIfRequired(DataServiceProtocolVersion.V4); } if (requestUri.IsCount()) { expectedVersion = expectedVersion.IncreaseVersionIfRequired(DataServiceProtocolVersion.V4); } else if (requestUri.IsProperty()) { var propertySegment = requestUri.LastSegment as PropertySegment; expectedVersion = expectedVersion.IncreaseVersionIfRequired(propertySegment.Property.CalculateProtocolVersion()); } else if (!requestUri.IsNamedStream()) { // Check service operations returning non-entity types if (requestUri.IsServiceOperation()) { var serviceOpSegment = requestUri.Segments.OfType <FunctionSegment>().Single(); DataType returnType = serviceOpSegment.Function.ReturnType; // Service ops returning complex values or bags of complex values, where the complex type has bag properties, are v3 var collectionType = returnType as CollectionDataType; if (collectionType != null) { // for service operations, the fact that a collection is returned does not mean it is a multivalue // so we unwrap the element type before calculating the version returnType = collectionType.ElementDataType; } expectedVersion = expectedVersion.IncreaseVersionIfRequired(returnType.CalculateDataTypeVersion()); } // Check entity types List <DataServiceProtocolVersion> dataServiceProtocolVersions = new List <DataServiceProtocolVersion>(); dataServiceProtocolVersions.Add(expectedVersion); if (!(requestUri.IsEntityReferenceLink() || requestUri.IsPropertyValue())) { foreach (EntitySet entitySet in requestUri.GetAllEntitySetsIncludingExpands()) { DataServiceProtocolVersion entitySetVersion = entitySet.CalculateEntitySetProtocolVersion(contentType, VersionCalculationType.Response, maxProtocolVersion, maxDataServiceVersion); dataServiceProtocolVersions.Add(entitySetVersion); if (entitySetVersion > maxDataServiceVersion) { return(VersionHelper.GetMaximumVersion(dataServiceProtocolVersions.ToArray())); } } } } return(expectedVersion); }
/// <summary> /// Calculates the protocol version based on the ODataUri provided /// </summary> /// <param name="uri">OData Uri to analyze</param> /// <param name="contentType">Content Type</param> /// <param name="maxProtocolVersion">The max protocol version</param> /// <param name="dataServiceVersion">The data service version of the request</param> /// <param name="maxDataServiceVersion">The max data service version of the request</param> /// <returns>Data Service Protocol Version</returns> public DataServiceProtocolVersion CalculateProtocolVersion(ODataUri uri, string contentType, DataServiceProtocolVersion maxProtocolVersion, DataServiceProtocolVersion dataServiceVersion, DataServiceProtocolVersion maxDataServiceVersion) { ExceptionUtilities.CheckArgumentNotNull(uri, "uri"); ExceptionUtilities.Assert(maxProtocolVersion != DataServiceProtocolVersion.Unspecified, "Max protocol version cannot be unspecified"); if (uri.IsMetadata()) { throw new TaupoNotSupportedException("Context uri should be processed by Entity Model Version Calculator instead"); } DataServiceProtocolVersion expectedVersion = DataServiceProtocolVersion.V4; if (uri.IncludesInlineCountAllPages()) { expectedVersion = VersionHelper.IncreaseVersionIfRequired(expectedVersion, DataServiceProtocolVersion.V4); } if (uri.IsCount()) { expectedVersion = VersionHelper.IncreaseVersionIfRequired(expectedVersion, DataServiceProtocolVersion.V4); } else if (uri.IsEntityReferenceLink() || uri.IsNamedStream() || uri.IsPropertyValue()) { // If the uri points to a Link, $value or a named stream their response DSV's are V1 because their payloads are understood by V1 expectedVersion = VersionHelper.IncreaseVersionIfRequired(expectedVersion, DataServiceProtocolVersion.V4); } else if (uri.HasOpenProperties()) { expectedVersion = VersionHelper.IncreaseVersionIfRequired(expectedVersion, VersionHelper.GetMinimumVersion(maxProtocolVersion, maxDataServiceVersion)); } else if (uri.IsProperty()) { var propertySegment = (PropertySegment)uri.LastSegment; expectedVersion = VersionHelper.IncreaseVersionIfRequired(expectedVersion, VersionHelper.CalculateProtocolVersion(propertySegment.Property)); } else if (uri.IsAction()) { var action = (FunctionSegment)uri.LastSegment; if (action.Function.ReturnType != null) { var collectionReturnType = action.Function.ReturnType as CollectionDataType; // If its a collection this doesn't bump things to V3 as this is normal behavior from ServiceOperations V1, so only determining version based on non data type DataType versionType = action.Function.ReturnType; var entityVersionType = action.Function.ReturnType as EntityDataType; if (collectionReturnType != null) { entityVersionType = collectionReturnType.ElementDataType as EntityDataType; if (entityVersionType != null) { versionType = entityVersionType; } } // Bump if its an open type if (entityVersionType != null && entityVersionType.Definition.IsOpen) { expectedVersion = VersionHelper.IncreaseVersionIfRequired(expectedVersion, VersionHelper.GetMinimumVersion(maxProtocolVersion, maxDataServiceVersion)); } expectedVersion = VersionHelper.IncreaseVersionIfRequired(expectedVersion, VersionHelper.CalculateDataTypeVersion(versionType)); } } else { ExceptionUtilities.CheckArgumentNotNull(contentType, "contentType"); List <DataServiceProtocolVersion> dataServiceProtocolVersions = uri.GetAllEntitySetsIncludingExpands().Select(es => es.CalculateEntitySetProtocolVersion(contentType, VersionCalculationType.Response, maxProtocolVersion, maxDataServiceVersion)).ToList(); dataServiceProtocolVersions.Add(expectedVersion); expectedVersion = VersionHelper.GetMaximumVersion(dataServiceProtocolVersions.ToArray()); } // determine if the uri MIGHT result in there being a next link, and increase version if so expectedVersion = VersionHelper.IncreaseVersionIfTrue(ResponseMightIncludeNextLink(uri), expectedVersion, DataServiceProtocolVersion.V4); return(expectedVersion); }