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));
        }
示例#4
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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();
        }
示例#10
0
        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));
        }
示例#11
0
 public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, HttpRequestMessage request, MediaTypeHeaderValue mediaType)
 {
     return(_innerFormatter.GetPerRequestFormatterInstance(type, request, mediaType));
 }