public void GetPerRequestFormatterInstance_RequiredMemberSelector_Uses_Inners() { // Arrange HttpRequestMessage request = new HttpRequestMessage(); Type randomType = typeof(string); MediaTypeHeaderValue mediaType = new MediaTypeHeaderValue("text/fake"); Mock <IRequiredMemberSelector> mockSelector = new Mock <IRequiredMemberSelector>(); Mock <TFormatter> mockFormatter = new Mock <TFormatter>() { CallBase = true }; MediaTypeFormatter innerFormatter = mockFormatter.Object; MediaTypeFormatter tracer = CreateTracer( mockFormatter.Object, request, new TestTraceWriter() ); tracer.RequiredMemberSelector = mockSelector.Object; // Act MediaTypeFormatter valueReturned = innerFormatter.GetPerRequestFormatterInstance( randomType, request, mediaType ); // Assert Assert.Same(tracer.RequiredMemberSelector, valueReturned.RequiredMemberSelector); Assert.Same(tracer.RequiredMemberSelector, innerFormatter.RequiredMemberSelector); }
public void GetPerRequestFormatterInstance_SupportedEncodings_Uses_Inners() { // Arrange HttpRequestMessage request = new HttpRequestMessage(); Type randomType = typeof(string); MediaTypeHeaderValue mediaType = new MediaTypeHeaderValue("text/fake"); Mock <Encoding> mockEncoding = new Mock <Encoding>(); Mock <TFormatter> mockFormatter = new Mock <TFormatter>() { CallBase = true }; MediaTypeFormatter innerFormatter = mockFormatter.Object; MediaTypeFormatter tracer = CreateTracer( mockFormatter.Object, request, new TestTraceWriter() ); tracer.SupportedEncodings.Add(mockEncoding.Object); // Act MediaTypeFormatter valueReturned = innerFormatter.GetPerRequestFormatterInstance( randomType, request, mediaType ); // Assert Assert.Same(tracer.SupportedEncodings, valueReturned.SupportedEncodings); Assert.Same(tracer.SupportedEncodings, innerFormatter.SupportedEncodings); }
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken) { List <MediaTypeFormatter> perRequestFormatters = new List <MediaTypeFormatter>(); MediaTypeFormatter perRequestFormatter = _formatter.GetPerRequestFormatterInstance(Descriptor.ParameterType, actionContext.Request, actionContext.Request.Content.Headers.ContentType); perRequestFormatters.Add(perRequestFormatter); HttpParameterBinding innerBinding = CreateInnerBinding(perRequestFormatters); return(innerBinding.ExecuteBindingAsync(metadataProvider, actionContext, cancellationToken)); }
public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType) { var instance = _internalFormatter.GetPerRequestFormatterInstance(type, request, mediaType); if (instance == null) { return(this); } else { return(new FiveLevelsOfMediaTypeFormatter(instance)); } }
private static bool IsODataFormatter(this MediaTypeFormatter formatter, out IEdmModel edmModel) { Contract.Assert(formatter != null); ODataMediaTypeFormatter odataFormatter = formatter as ODataMediaTypeFormatter; if (odataFormatter != null) { edmModel = odataFormatter.Model; return(true); } // Detects ODataFormatters that are wrapped by tracing // Creates a dummy request message and sees if the formatter adds a model to the request properties // This is a workaround until tracing provides information about the wrapped inner formatter using (HttpRequestMessage request = new HttpRequestMessage()) { try { formatter.GetPerRequestFormatterInstance(typeof(IEdmModel), request, mediaType: null); object model; if (request.Properties.TryGetValue(ODataMediaTypeFormatter.EdmModelKey, out model)) { edmModel = model as IEdmModel; if (edmModel != null) { return(true); } } } catch { // Ignore exceptions - it isn't the OData formatter we're looking for } } edmModel = null; return(false); }
private MediaTypeFormatter GetFormatter(Type responseType, out IEdmModel model) { HttpConfiguration configuration = Request.GetConfiguration(); if (configuration == null) { throw Error.InvalidOperation(SRResources.RequestMustContainConfiguration); } MediaTypeFormatter odataFormatter = configuration.GetODataFormatter(out model); if (odataFormatter == null) { throw Error.InvalidOperation(SRResources.NoODataFormatterForMetadata); } model.SetEdmxVersion(_defaultEdmxVersion); model.SetDataServiceVersion(_defaultDataServiceVersion); odataFormatter = odataFormatter.GetPerRequestFormatterInstance(responseType, Request, mediaType: null); return(odataFormatter); }
public void SetDefaultContentHeaders_SetsRightContentType(string acceptHeader, string acceptCharset, string contentType) { // Arrange MediaTypeHeaderValue expectedResult = MediaTypeHeaderValue.Parse(contentType); // If no accept header is present the content negotiator will pick application/json; odata.metadata=minimal // based on CanWriteType MediaTypeHeaderValue mediaType = acceptHeader == null? MediaTypeHeaderValue.Parse("application/json; odata.metadata=minimal") : MediaTypeHeaderValue.Parse(acceptHeader); HttpRequestMessage request = new HttpRequestMessage(); request.EnableODataDependencyInjectionSupport(); if (acceptHeader != null) { request.Headers.TryAddWithoutValidation("Accept", acceptHeader); } if (acceptCharset != null) { request.Headers.TryAddWithoutValidation("Accept-Charset", acceptCharset); mediaType.CharSet = acceptCharset; } HttpContentHeaders contentHeaders = new StringContent(String.Empty).Headers; contentHeaders.Clear(); MediaTypeFormatter formatter = ODataMediaTypeFormatters .Create() .First(f => f.SupportedMediaTypes.Contains(MediaTypeHeaderValue.Parse("application/json"))); formatter = formatter.GetPerRequestFormatterInstance(typeof(int), request, mediaType); // Act formatter.SetDefaultContentHeaders(typeof(int), contentHeaders, mediaType); // Assert Assert.Equal(expectedResult, contentHeaders.ContentType); }
/// <summary> /// Returns a specialized instance of the <see cref="JsonpMediaTypeFormatter"/> that can handle formatting a response for the given /// parameters. This method is called after a formatter has been selected through content negotiation. /// </summary> /// <param name="type">The type being serialized.</param> /// <param name="request">The request.</param> /// <param name="mediaType">The media type chosen for the serialization. Can be <c>null</c>.</param> /// <returns>An instance that can format a response to the given <paramref name="request"/>.</returns> public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType) { if (type == null) { throw new ArgumentNullException("type"); } if (request == null) { throw new ArgumentNullException("request"); } string callback; if (IsJsonpRequest(request, _callbackQueryParameter, out callback)) { return(new JsonpMediaTypeFormatter(request, callback, _jsonMediaTypeFormatter, _callbackQueryParameter)); } // Not JSONP? Let the JSON formatter handle it return(_jsonMediaTypeFormatter.GetPerRequestFormatterInstance(type, request, mediaType)); }
public void GetPerRequestFormatterInstance_Calls_Inner_And_Wraps_Tracer_Around_It() { // Arrange HttpRequestMessage request = new HttpRequestMessage(); Type randomType = typeof(string); MediaTypeHeaderValue mediaType = new MediaTypeHeaderValue("plain/text"); Mock <TFormatter> mockFormatter = new Mock <TFormatter>() { CallBase = true }; MediaTypeFormatter formatterObject = mockFormatter.Object; mockFormatter .Setup(f => f.GetPerRequestFormatterInstance(randomType, request, mediaType)) .Returns(formatterObject) .Verifiable(); MediaTypeFormatter tracer = CreateTracer( mockFormatter.Object, request, new TestTraceWriter() ); // Act MediaTypeFormatter valueReturned = tracer.GetPerRequestFormatterInstance( randomType, request, mediaType ); // Assert IFormatterTracer tracerReturned = Assert.IsAssignableFrom <IFormatterTracer>( valueReturned ); Assert.Same(formatterObject, tracerReturned.InnerFormatter); mockFormatter.Verify(); }
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken) { var formatter = _formatter.GetPerRequestFormatterInstance(Descriptor.ParameterType, actionContext.Request, actionContext.Request.Content.Headers.ContentType); return(Descriptor.BindWithFormatter(new[] { formatter }).ExecuteBindingAsync(metadataProvider, actionContext, cancellationToken)); }
public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType) { return(_innerFormatter.GetPerRequestFormatterInstance(type, request, mediaType)); }