private static ODataMediaTypeFormatter CreateFormatterWithoutMediaTypes(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider, params ODataPayloadKind[] payloadKinds) { ODataMediaTypeFormatter formatter = new ODataMediaTypeFormatter(deserializerProvider, serializerProvider, payloadKinds); AddSupportedEncodings(formatter); return(formatter); }
/// <summary> /// Initializes a new instance of the <see cref="ODataMediaTypeFormatter"/> class. /// </summary> /// <param name="formatter">The <see cref="ODataMediaTypeFormatter"/> to copy settings from.</param> /// <param name="version">The OData version that this formatter supports.</param> /// <param name="request">The <see cref="HttpRequestMessage"/> for the per-request formatter instance.</param> /// <remarks>This is a copy constructor to be used in <see cref="GetPerRequestFormatterInstance"/>.</remarks> internal ODataMediaTypeFormatter(ODataMediaTypeFormatter formatter, ODataVersion version, HttpRequestMessage request) : base(formatter) { if (request == null) { throw Error.ArgumentNull("request"); } Contract.Assert(formatter._serializerProvider != null); Contract.Assert(formatter._deserializerProvider != null); Contract.Assert(formatter._payloadKinds != null); // Parameter 1: formatter // Execept for the other two parameters, this constructor is a copy constructor, and we need to copy // everything on the other instance. // Copy this class's private fields and internal properties. _serializerProvider = formatter._serializerProvider; _deserializerProvider = formatter._deserializerProvider; _payloadKinds = formatter._payloadKinds; MessageWriterSettings = formatter.MessageWriterSettings; MessageReaderSettings = formatter.MessageReaderSettings; // Parameter 2: version _version = version; // Parameter 3: request Request = request; }
public void NullPrimitiveValueSerializeAsODataThrows(Type valueType, object value, MediaTypeHeaderValue mediaType, string notUsed) { ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet <WorkItem>("WorkItems"); IEdmModel model = modelBuilder.GetEdmModel(); using (HttpConfiguration configuration = CreateConfiguration()) using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/WorkItems(10)/ID")) { request.SetConfiguration(configuration); IEdmProperty property = model.EntityContainer.EntitySets().Single().EntityType().Properties().First(); request.ODataProperties().Path = new ODataPath(new PropertySegment(property as IEdmStructuralProperty)); request.EnableODataDependencyInjectionSupport(); ODataMediaTypeFormatter formatter = CreateFormatter(request); formatter.SupportedMediaTypes.Add(mediaType); Type type = (value != null) ? value.GetType() : typeof(Nullable <int>); using (ObjectContent content = new ObjectContent(type, value, formatter)) { Assert.Throws <ODataException>(() => content.ReadAsStringAsync().Result, "Cannot write the value 'null' in top level property; return 204 instead."); } } }
private static ODataMediaTypeFormatter CreateApplicationJson(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( serializerProvider, deserializerProvider, ODataPayloadKind.Feed, ODataPayloadKind.Entry, ODataPayloadKind.Property, ODataPayloadKind.EntityReferenceLink, ODataPayloadKind.EntityReferenceLinks, ODataPayloadKind.Collection, ODataPayloadKind.ServiceDocument, ODataPayloadKind.Error, ODataPayloadKind.Parameter); // Add minimal metadata as the first media type so it gets used when the request doesn't // ask for a specific content type formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataMinimalMetadataStreamingTrue); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataMinimalMetadataStreamingFalse); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataMinimalMetadata); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataFullMetadataStreamingTrue); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataFullMetadataStreamingFalse); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataFullMetadata); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataNoMetadataStreamingTrue); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataNoMetadataStreamingFalse); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataNoMetadata); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonStreamingTrue); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonStreamingFalse); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJson); formatter.AddDollarFormatQueryStringMappings(); formatter.AddQueryStringMapping(DollarFormat, JsonFormat, ODataMediaTypes.ApplicationJson); return(formatter); }
private static ODataMediaTypeFormatter CreateRawValue(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes(serializerProvider, deserializerProvider, ODataPayloadKind.Value); formatter.MediaTypeMappings.Add(new ODataPrimitiveValueMediaTypeMapping()); formatter.MediaTypeMappings.Add(new ODataEnumValueMediaTypeMapping()); formatter.MediaTypeMappings.Add(new ODataBinaryValueMediaTypeMapping()); return(formatter); }
private static ODataMediaTypeFormatter CreateApplicationAtomSvcXml(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes(serializerProvider, deserializerProvider, ODataPayloadKind.ServiceDocument); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationAtomSvcXml); formatter.AddDollarFormatQueryStringMappings(); return(formatter); }
private static void AddDollarFormatQueryStringMappings(this ODataMediaTypeFormatter formatter) { ICollection <MediaTypeHeaderValue> supportedMediaTypes = formatter.SupportedMediaTypes; foreach (MediaTypeHeaderValue supportedMediaType in supportedMediaTypes) { QueryStringMediaTypeMapping mapping = new QueryStringMediaTypeMapping(DollarFormat, supportedMediaType); formatter.MediaTypeMappings.Add(mapping); } }
/// <summary> /// Internal method used for selecting the base address to be used with OData uris. /// If the consumer has provided a delegate for overriding our default implementation, /// we call that, otherwise we default to existing behavior below. /// </summary> /// <param name="request">The HttpRequestMessage object for the given request.</param> /// <returns>The base address to be used as part of the service root; must terminate with a trailing '/'.</returns> private Uri GetBaseAddressInternal(HttpRequestMessage request) { if (BaseAddressFactory != null) { return(BaseAddressFactory(request)); } else { return(ODataMediaTypeFormatter.GetDefaultBaseAddress(request)); } }
private static ODataMediaTypeFormatter CreateApplicationAtomXmlTypeEntry(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes(serializerProvider, deserializerProvider, ODataPayloadKind.Entry); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationAtomXmlTypeEntry); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationAtomXml); formatter.AddDollarFormatQueryStringMappings(); formatter.AddQueryStringMapping(DollarFormat, AtomFormat, ODataMediaTypes.ApplicationAtomXml); return(formatter); }
public void Initialize_DoesNotChangeFormatters_IfODataFormatterAlreadyRegistered() { var config = new HttpConfiguration(); var odataFormatter = new ODataMediaTypeFormatter(Enumerable.Empty<ODataPayloadKind>()); config.Formatters.Add(odataFormatter); int formatterCount = config.Formatters.Count; var controllerSettings = new HttpControllerSettings(config); var controllerDescriptor = new HttpControllerDescriptor(); controllerDescriptor.Configuration = config; new ODataFormattingAttribute().Initialize(controllerSettings, controllerDescriptor); Assert.Same(odataFormatter, controllerSettings.Formatters.OfType<ODataMediaTypeFormatter>().First()); Assert.Equal(formatterCount, controllerSettings.Formatters.Count); }
private static ODataMediaTypeFormatter CreateTextXml(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( serializerProvider, deserializerProvider, ODataPayloadKind.Property, ODataPayloadKind.EntityReferenceLink, ODataPayloadKind.EntityReferenceLinks, ODataPayloadKind.Collection); formatter.SupportedMediaTypes.Add(ODataMediaTypes.TextXml); formatter.AddDollarFormatQueryStringMappings(); return(formatter); }
public void PrimitiveTypesSerializeAsOData(Type valueType, object value, MediaTypeHeaderValue mediaType, string resourceName) { string expectedEntity = Resources.GetString(resourceName); Assert.NotNull(expectedEntity); ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet <WorkItem>("WorkItems"); IEdmModel model = modelBuilder.GetEdmModel(); string actualEntity; using (HttpConfiguration configuration = CreateConfiguration()) using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/WorkItems(10)/ID")) { request.SetConfiguration(configuration); IEdmProperty property = model.EntityContainer.EntitySets().Single().EntityType().Properties().First(); request.ODataProperties().Model = model; request.ODataProperties().Path = new ODataPath(new PropertyAccessPathSegment(property)); request.SetFakeODataRouteName(); ODataMediaTypeFormatter formatter = CreateFormatter(request); formatter.SupportedMediaTypes.Add(mediaType); Type type = (value != null) ? value.GetType() : typeof(Nullable <int>); using (ObjectContent content = new ObjectContent(type, value, formatter)) { actualEntity = content.ReadAsStringAsync().Result; } } bool isJson = resourceName.EndsWith(".json"); if (isJson) { JsonAssert.Equal(expectedEntity, actualEntity); } else { Assert.Xml.Equal(expectedEntity, actualEntity); } }
/// <summary> /// Initializes a new instance of the <see cref="ODataMediaTypeFormatter"/> class. /// </summary> /// <param name="formatter">The <see cref="ODataMediaTypeFormatter"/> to copy settings from.</param> /// <param name="version">The OData version that this formatter supports.</param> /// <param name="request">The <see cref="HttpRequestMessage"/> for the per-request formatter instance.</param> /// <remarks>This is a copy constructor to be used in <see cref="GetPerRequestFormatterInstance"/>.</remarks> internal ODataMediaTypeFormatter(ODataMediaTypeFormatter formatter, ODataVersion version, HttpRequestMessage request) : base(formatter) { if (request == null) { throw Error.ArgumentNull("request"); } Contract.Assert(formatter._serializerProvider != null); Contract.Assert(formatter._deserializerProvider != null); Contract.Assert(formatter._payloadKinds != null); // Parameter 1: formatter // Execept for the other two parameters, this constructor is a copy constructor, and we need to copy // everything on the other instance. // Copy this class's private fields and internal properties. _serializerProvider = formatter._serializerProvider; _deserializerProvider = formatter._deserializerProvider; _payloadKinds = formatter._payloadKinds; // Parameter 2: version _version = version; // Parameter 3: request Request = request; if (_serializerProvider.GetType() == typeof(ODataSerializerProviderProxy)) { _serializerProvider = new ODataSerializerProviderProxy { RequestContainer = request.GetRequestContainer() }; } if (_deserializerProvider.GetType() == typeof(ODataDeserializerProviderProxy)) { _deserializerProvider = new ODataDeserializerProviderProxy { RequestContainer = request.GetRequestContainer() }; } BaseAddressFactory = formatter.BaseAddressFactory; }
public void Negotiate_CallGetPerRequestFormatterInstanceFirst() { HttpRequestMessage request = new HttpRequestMessage(); MediaTypeFormatter perRequestFormatter = new ODataMediaTypeFormatter(Enumerable.Empty<ODataPayloadKind>()) { Request = request }; Mock<MediaTypeFormatter> formatter = new Mock<MediaTypeFormatter>(); formatter .Setup(f => f.GetPerRequestFormatterInstance(typeof(void), request, It.IsAny<MediaTypeHeaderValue>())) .Returns(perRequestFormatter); Mock<IContentNegotiator> innerContentNegotiator = new Mock<IContentNegotiator>(); innerContentNegotiator .Setup(n => n.Negotiate(typeof(void), request, It.Is<IEnumerable<MediaTypeFormatter>>(f => f.First() == perRequestFormatter))) .Returns(new ContentNegotiationResult(perRequestFormatter, MediaTypeHeaderValue.Parse("application/json"))); IContentNegotiator contentNegotiator = new PerRequestContentNegotiator(innerContentNegotiator.Object); var negotiationResult = contentNegotiator.Negotiate(typeof(void), request, new MediaTypeFormatter[] { formatter.Object }); Assert.Same(perRequestFormatter, negotiationResult.Formatter); }
private static ODataMediaTypeFormatter CreateApplicationXml(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( serializerProvider, deserializerProvider, ODataPayloadKind.Property, ODataPayloadKind.EntityReferenceLink, ODataPayloadKind.EntityReferenceLinks, ODataPayloadKind.Collection, ODataPayloadKind.ServiceDocument, ODataPayloadKind.MetadataDocument, ODataPayloadKind.Error); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationXml); formatter.AddDollarFormatQueryStringMappings(); formatter.AddQueryStringMapping(DollarFormat, XmlFormat, ODataMediaTypes.ApplicationXml); return(formatter); }
public void PrimitiveTypesDeserializeAsOData(Type valueType, object value, MediaTypeHeaderValue mediaType, string resourceName) { string entity = Resources.GetString(resourceName); Assert.NotNull(entity); object expectedValue = value; ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet <WorkItem>("WorkItems"); IEdmModel model = modelBuilder.GetEdmModel(); object actualValue; using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/WorkItems(10)/ID")) { HttpConfiguration config = new HttpConfiguration(); config.MapODataServiceRoute("default", "", model); request.SetConfiguration(config); request.ODataProperties().RouteName = "default"; request.ODataProperties().Model = model; ODataMediaTypeFormatter formatter = CreateFormatter(request); formatter.SupportedMediaTypes.Add(mediaType); using (StringContent content = new StringContent(entity)) { content.Headers.ContentType = mediaType; using (Stream stream = content.ReadAsStreamAsync().Result) { actualValue = formatter.ReadFromStreamAsync(valueType, stream, content, new Mock <IFormatterLogger>().Object).Result; } } } Assert.Equal(expectedValue, actualValue); }
/// <summary> /// Initializes a new instance of the <see cref="ODataMediaTypeFormatter"/> class. /// </summary> /// <param name="formatter">The <see cref="ODataMediaTypeFormatter"/> to copy settings from.</param> /// <param name="version">The OData version that this formatter supports.</param> /// <param name="request">The <see cref="HttpRequestMessage"/> for the per-request formatter instance.</param> /// <remarks>This is a copy constructor to be used in <see cref="GetPerRequestFormatterInstance"/>.</remarks> internal ODataMediaTypeFormatter(ODataMediaTypeFormatter formatter, ODataVersion version, HttpRequestMessage request) : base(formatter) { if (request == null) { throw Error.ArgumentNull("request"); } Contract.Assert(formatter._serializerProvider != null); Contract.Assert(formatter._deserializerProvider != null); Contract.Assert(formatter._payloadKinds != null); // Parameter 1: formatter // Execept for the other two parameters, this constructor is a copy constructor, and we need to copy // everything on the other instance. // Copy this class's private fields and internal properties. _serializerProvider = formatter._serializerProvider; _deserializerProvider = formatter._deserializerProvider; _payloadKinds = formatter._payloadKinds; MessageWriterSettings = formatter.MessageWriterSettings; MessageReaderSettings = formatter.MessageReaderSettings; // Parameter 2: version _version = version; // Parameter 3: request Request = request; }
private static ODataMediaTypeFormatter GetFormatter() { var formatter = new ODataMediaTypeFormatter(new ODataPayloadKind[] { ODataPayloadKind.Property }) { Request = GetSampleRequest() }; formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataMinimalMetadata); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationXml); return formatter; }
private static ODataMediaTypeFormatter CreateFormatterWithoutMediaTypes(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider, params ODataPayloadKind[] payloadKinds) { ODataMediaTypeFormatter formatter = new ODataMediaTypeFormatter(deserializerProvider, serializerProvider, payloadKinds); AddSupportedEncodings(formatter); return formatter; }