internal static bool WillReadUri( this HttpParameterBinding parameterBinding )
        {
            if ( parameterBinding is not IValueProviderParameterBinding valueProviderParameterBinding )
            {
                return false;
            }

            var valueProviderFactories = valueProviderParameterBinding.ValueProviderFactories;

            if ( valueProviderFactories.Any() && valueProviderFactories.All( factory => factory is IUriValueProviderFactory ) )
            {
                return true;
            }

            return false;
        }
        public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            var perRequestFormatters = new List <MediaTypeFormatter>();

            foreach (MediaTypeFormatter formatter in _formatters)
            {
                MediaTypeFormatter perRequestFormatter = formatter.GetPerRequestFormatterInstance(Descriptor.ParameterType, actionContext.Request, actionContext.Request.Content.Headers.ContentType);
                perRequestFormatters.Add(perRequestFormatter);
            }

            HttpParameterBinding innerBinding = CreateInnerBinding(perRequestFormatters);

            Contract.Assert(innerBinding != null);

            return(innerBinding.ExecuteBindingAsync(metadataProvider, actionContext, cancellationToken));
        }
        private static ApiParameterDescription CreateParameterDescriptionFromBinding(HttpParameterBinding parameterBinding)
        {
            Contract.Requires(parameterBinding != null);

            var parameterDescription = CreateParameterDescriptionFromDescriptor(parameterBinding.Descriptor);

            if (parameterBinding.WillReadBody)
            {
                parameterDescription.Source = ApiParameterSource.FromBody;
            }
            else if (parameterBinding.WillReadUri())
            {
                parameterDescription.Source = ApiParameterSource.FromUri;
            }

            return(parameterDescription);
        }
        public static bool WillReadUri(this HttpParameterBinding parameterBinding)
        {
            Contract.Requires(parameterBinding != null);

            var valueProviderParameterBinding = parameterBinding as IValueProviderParameterBinding;

            if (valueProviderParameterBinding != null)
            {
                var valueProviderFactories = valueProviderParameterBinding.ValueProviderFactories;
                var providerFactories      = valueProviderFactories as IList <ValueProviderFactory> ?? valueProviderFactories.ToList();
                if (providerFactories.Any() && providerFactories.All(factory => factory is IUriValueProviderFactory))
                {
                    return(true);
                }
            }

            return(false);
        }
        public void ParameterBindings_Uses_Inners()
        {
            // Arrange
            HttpActionBinding binding = new Mock <HttpActionBinding>()
            {
                CallBase = true
            }.Object;

            HttpParameterBinding[] parameterBindings = new HttpParameterBinding[0];
            binding.ParameterBindings = parameterBindings;
            HttpActionBindingTracer tracer = new HttpActionBindingTracer(
                binding,
                new TestTraceWriter()
                );

            // Assert
            Assert.Same(parameterBindings, tracer.ParameterBindings);
        }
Exemple #6
0
        // Creates wrapping tracers for all HttpParameterBindings
        HttpActionBinding IActionValueBinder.GetBinding(HttpActionDescriptor actionDescriptor)
        {
            HttpActionBinding actionBinding = _innerBinder.GetBinding(actionDescriptor);

            if (actionBinding == null)
            {
                return(null);
            }

            HttpParameterBinding[] parameterBindings    = actionBinding.ParameterBindings;
            HttpParameterBinding[] newParameterBindings = new HttpParameterBinding[
                parameterBindings.Length
                                                          ];
            for (int i = 0; i < newParameterBindings.Length; i++)
            {
                HttpParameterBinding parameterBinding = parameterBindings[i];

                // Intercept FormatterParameterBinding to replace its formatters
                FormatterParameterBinding formatterParameterBinding =
                    parameterBinding as FormatterParameterBinding;
                newParameterBindings[i] =
                    formatterParameterBinding != null
                        ? (HttpParameterBinding) new FormatterParameterBindingTracer(
                        formatterParameterBinding,
                        _traceWriter
                        )
                        : (HttpParameterBinding) new HttpParameterBindingTracer(
                        parameterBinding,
                        _traceWriter
                        );
            }

            // Replace the inner HttpActionBinding's parameter bindings with our tracing versions.
            // This allows each individual parameter binding to trace.
            actionBinding.ParameterBindings = newParameterBindings;

            // Then create an HttpActionBindingTracer to wrap the actual HttpActionBinding
            if (!(actionBinding is HttpActionBindingTracer))
            {
                return(new HttpActionBindingTracer(actionBinding, _traceWriter));
            }

            return(actionBinding);
        }
Exemple #7
0
        private ApiParameterDescription CreateParameterDescriptionFromBinding(
            HttpParameterBinding parameterBinding
            )
        {
            ApiParameterDescription parameterDescription = CreateParameterDescriptionFromDescriptor(
                parameterBinding.Descriptor
                );

            if (parameterBinding.WillReadBody)
            {
                parameterDescription.Source = ApiParameterSource.FromBody;
            }
            else if (parameterBinding.WillReadUri())
            {
                parameterDescription.Source = ApiParameterSource.FromUri;
            }

            return(parameterDescription);
        }
Exemple #8
0
        public static bool WillReadUri(this HttpParameterBinding parameterBinding)
        {
            if (parameterBinding == null)
            {
                throw Error.ArgumentNull("parameterBinding");
            }

            ModelBinderParameterBinding modelParameterBinding = parameterBinding as ModelBinderParameterBinding;

            if (modelParameterBinding != null)
            {
                if (modelParameterBinding.ValueProviderFactories.All(factory => factory is IUriValueProviderFactory))
                {
                    return(true);
                }
            }

            return(false);
        }
Exemple #9
0
        public void Decorator_GetInner_On_HttpParameterBindingTracer_Returns_HttpParameterBinding()
        {
            // Arrange
            Mock <HttpParameterDescriptor> mockParamDescriptor = new Mock <HttpParameterDescriptor>()
            {
                CallBase = true
            };

            mockParamDescriptor.Setup(d => d.ParameterName).Returns("paramName");
            mockParamDescriptor.Setup(d => d.ParameterType).Returns(typeof(string));
            HttpParameterBinding       expectedInner    = new Mock <HttpParameterBinding>(mockParamDescriptor.Object).Object;
            HttpParameterBindingTracer productUnderTest = new HttpParameterBindingTracer(expectedInner, new TestTraceWriter());

            // Act
            HttpParameterBinding actualInner = Decorator.GetInner(productUnderTest as HttpParameterBinding);

            // Assert
            Assert.Same(expectedInner, actualInner);
        }
        public void Add_with_type_match()
        {
            ParameterBindingRulesCollection pb          = new ParameterBindingRulesCollection();
            HttpParameterBinding            mockBinding = new EmptyParameterBinding();

            pb.Add(typeof(string), param => mockBinding);

            // Act
            HttpParameterBinding b1 = pb.LookupBinding(
                CreateParameterDescriptor(typeof(string), "first")
                );
            HttpParameterBinding b2 = pb.LookupBinding(
                CreateParameterDescriptor(typeof(int), "first")
                );

            // Assert
            Assert.Equal(mockBinding, b1);
            Assert.Null(b2); // doesn't match type, misses.
        }
Exemple #11
0
        /// <summary>
        /// Determines if a parameter will be read from the URI.
        /// </summary>
        /// <param name="parameterBinding">The parameter binding.</param>
        public static bool WillReadUri(this HttpParameterBinding parameterBinding)
        {
            if (parameterBinding == null)
            {
                return(false);
            }

            IValueProviderParameterBinding valueProviderParameterBinding = parameterBinding as IValueProviderParameterBinding;

            if (valueProviderParameterBinding != null)
            {
                IEnumerable <ValueProviderFactory> valueProviderFactories = valueProviderParameterBinding.ValueProviderFactories;
                if (valueProviderFactories.Any() && valueProviderFactories.All(factory => factory is QueryStringValueProviderFactory || factory is RouteDataValueProviderFactory))
                {
                    return(true);
                }
            }
            return(false);
        }
        public HttpActionBinding GetBinding(HttpActionDescriptor actionDescriptor)
        {
            if (actionDescriptor == null)
            {
                throw Error.ArgumentNull("actionDescriptor");
            }

            HttpActionBinding binding = _innerActionValueBinder.GetBinding(actionDescriptor);

            if (binding == null)
            {
                return(null);
            }

            HttpParameterBinding[] parameterBindings = binding.ParameterBindings;

            if (parameterBindings != null)
            {
                for (int i = 0; i < binding.ParameterBindings.Length; i++)
                {
                    HttpParameterBinding parameterBinding = binding.ParameterBindings[i];

                    // Replace the formatter parameter binding with one that will attach the request.
                    // Note that we do not replace any other types, including derived types, as we do not have a way to
                    // decorate/compose these instances; there is no way we can add request attachment behavior to an
                    // arbitrary implementation of HttpParameterBinding. Any custom parameter bindings that do not
                    // attach the request may fail when using with OData (and the exception retured in that instance
                    // will explain the necessity of providing this behavior when implementing HttpParameterBinding for
                    // OData).
                    if (parameterBinding != null && parameterBinding is FormatterParameterBinding)
                    {
                        Contract.Assert(parameterBinding.Descriptor != null);
                        Contract.Assert(actionDescriptor.Configuration != null);
                        Contract.Assert(actionDescriptor.Configuration.Formatters != null);
                        binding.ParameterBindings[i] = new PerRequestParameterBinding(parameterBinding.Descriptor,
                                                                                      actionDescriptor.Configuration.Formatters);
                    }
                }
            }

            return(binding);
        }
        public static bool WillReadUri(this HttpParameterBinding parameterBinding)
        {
            if (parameterBinding == null)
            {
                throw new ArgumentNullException("parameterBinding");
            }

            IValueProviderParameterBinding valueProviderParameterBinding = parameterBinding as IValueProviderParameterBinding;

            if (valueProviderParameterBinding != null)
            {
                IEnumerable <ValueProviderFactory> valueProviderFactories = valueProviderParameterBinding.ValueProviderFactories;
                if (valueProviderFactories.Any() && valueProviderFactories.All(factory => factory is IUriValueProviderFactory))
                {
                    return(true);
                }
            }

            return(false);
        }
        ApiParameterDescription CreateParameterDescriptionFromBinding(HttpParameterBinding parameterBinding)
        {
            Contract.Requires(parameterBinding != null);
            Contract.Ensures(Contract.Result <ApiParameterDescription>() != null);

            var description = CreateParameterDescription(parameterBinding.Descriptor);

            if (parameterBinding.WillReadBody)
            {
                description.Source = FromBody;
                return(description);
            }

            if (WillReadUri(parameterBinding))
            {
                description.Source = FromUri;
            }

            return(description);
        }
        /// <summary>
        /// Wills the read URI.
        /// </summary>
        /// <param name="parameterBinding">The parameter binding.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException"></exception>
        public static bool WillReadUri(this HttpParameterBinding parameterBinding)
        {
            if (parameterBinding == null)
            {
                throw new ArgumentNullException("parameterBinding");
            }
            var parameterBinding1 = parameterBinding as IValueProviderParameterBinding;

            if (parameterBinding1 != null)
            {
                var providerFactories = parameterBinding1.ValueProviderFactories;

                // && providerFactories.All(factory => factory is IUriValueProviderFactory))
                if (providerFactories.Any())
                {
                    return(true);
                }
            }
            return(false);
        }
        internal static bool WillReadUri(this HttpParameterBinding parameterBinding)
        {
            Contract.Requires(parameterBinding != null);

            var valueProviderParameterBinding = parameterBinding as IValueProviderParameterBinding;

            if (valueProviderParameterBinding == null)
            {
                return(false);
            }

            var valueProviderFactories = valueProviderParameterBinding.ValueProviderFactories;

            if (valueProviderFactories.Any() && valueProviderFactories.All(factory => factory is IUriValueProviderFactory))
            {
                return(true);
            }

            return(false);
        }
Exemple #17
0
        // Creates wrapping tracers for all HttpParameterBindings
        HttpActionBinding IActionValueBinder.GetBinding(HttpActionDescriptor actionDescriptor)
        {
            HttpActionBinding actionBinding = _innerBinder.GetBinding(actionDescriptor);

            HttpParameterBinding[] parameterBindings    = actionBinding.ParameterBindings;
            HttpParameterBinding[] newParameterBindings = new HttpParameterBinding[parameterBindings.Length];
            for (int i = 0; i < newParameterBindings.Length; i++)
            {
                HttpParameterBinding parameterBinding = parameterBindings[i];

                // Itercept FormatterParameterBinding to replace its formatters
                FormatterParameterBinding formatterParameterBinding = parameterBinding as FormatterParameterBinding;
                newParameterBindings[i] = formatterParameterBinding != null
                                            ? (HttpParameterBinding) new FormatterParameterBindingTracer(formatterParameterBinding, _traceWriter)
                                            : (HttpParameterBinding) new HttpParameterBindingTracer(parameterBinding, _traceWriter);
            }

            HttpActionBinding newActionBinding = new HttpActionBinding(actionDescriptor, newParameterBindings);

            return(newActionBinding);
        }
        protected HttpParameterBinding GetParameterBinding(HttpParameterDescriptor parameter)
        {
            if (parameter.ParameterBinderAttribute != null)
            {
                return(parameter.ParameterBinderAttribute.GetBinding(parameter));
            }

            HttpParameterBinding binding = parameter.Configuration.ParameterBindingRules.LookupBinding(parameter);

            if (binding != null)
            {
                return(binding);
            }

            if (parameter.ParameterType.IsPrimitive || parameter.ParameterType == typeof(string))
            {
                return(parameter.BindWithAttribute(new ModelBinderAttribute()));
            }

            return(new FromBodyAttribute().GetBinding(parameter));
        }
        // Determine how a single parameter will get bound.
        // This is all sync. We don't need to actually read the body just to determine that we'll bind to the body.
        protected virtual HttpParameterBinding GetParameterBinding(
            HttpParameterDescriptor parameter
            )
        {
            // Attribute has the highest precedence
            // Presence of a model binder attribute overrides.
            ParameterBindingAttribute attr = parameter.ParameterBinderAttribute;

            if (attr != null)
            {
                return(attr.GetBinding(parameter));
            }

            // No attribute, so lookup in global map.
            ParameterBindingRulesCollection pb = parameter.Configuration.ParameterBindingRules;

            if (pb != null)
            {
                HttpParameterBinding binding = pb.LookupBinding(parameter);
                if (binding != null)
                {
                    return(binding);
                }
            }

            // Not explicitly specified in global map or attribute.
            // Use a default policy to determine it. These are catch-all policies.
            Type type = parameter.ParameterType;

            if (TypeHelper.CanConvertFromString(type))
            {
                // For simple types, the default is to look in URI. Exactly as if the parameter had a [FromUri] attribute.
                return(parameter.BindWithAttribute(new FromUriAttribute()));
            }

            // Fallback. Must be a complex type. Default is to look in body. Exactly as if this type had a [FromBody] attribute.
            attr = new FromBodyAttribute();
            return(attr.GetBinding(parameter));
        }
Exemple #20
0
        public static bool WillReadUri(this HttpParameterBinding parameterBinding)
        {
            if (parameterBinding == null)
            {
                throw new ArgumentNullException("parameterBinding");
            }

            IValueProviderParameterBinding valueProviderParameterBinding = parameterBinding as IValueProviderParameterBinding;

            if (valueProviderParameterBinding != null)
            {
                IEnumerable <ValueProviderFactory> valueProviderFactories = valueProviderParameterBinding.ValueProviderFactories;
                // since The interface IUriValueProvderFactory is internal, following line of codes is altered
                // if (valueProviderFactories.Any() && valueProviderFactories.All(factory => factory is IUriValueProviderFactory))
                if (valueProviderFactories.Any() && valueProviderFactories.All(factory => (factory is QueryStringValueProviderFactory) || (factory is RouteDataValueProviderFactory)))
                {
                    return(true);
                }
            }

            return(false);
        }
        public void VoidReturnTypeThrows()
        {
            // Arrange
            ODataQueryParameterBindingAttribute attribute = new ODataQueryParameterBindingAttribute();
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/Customer/?$orderby=Name");
            HttpConfiguration  config  = new HttpConfiguration();

            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
            request.SetConfiguration(config);
            HttpControllerContext    controllerContext    = new HttpControllerContext(config, new HttpRouteData(new HttpRoute()), request);
            HttpControllerDescriptor controllerDescriptor = new HttpControllerDescriptor(new HttpConfiguration(), "CustomerLowLevel", typeof(CustomerHighLevelController));
            MethodInfo              methodInfo            = typeof(CustomerLowLevelController).GetMethod("GetVoidReturn");
            ParameterInfo           parameterInfo         = methodInfo.GetParameters().First();
            HttpActionDescriptor    actionDescriptor      = new ReflectedHttpActionDescriptor(controllerDescriptor, methodInfo);
            HttpActionContext       actionContext         = new HttpActionContext(controllerContext, actionDescriptor);
            HttpParameterDescriptor parameterDescriptor   = new ReflectedHttpParameterDescriptor(actionDescriptor, parameterInfo);
            HttpParameterBinding    binding = attribute.GetBinding(parameterDescriptor);

            // Act & Assert
            Assert.Throws <InvalidOperationException>(
                () => binding.ExecuteBindingAsync((ModelMetadataProvider)null, actionContext, CancellationToken.None).Wait(),
                "Cannot create an EDM model as the action 'GetVoidReturn' on controller 'CustomerLowLevel' has a void return type.");
        }
        public void Lookup_is_ordered()
        {
            ParameterBindingRulesCollection pb           = new ParameterBindingRulesCollection();
            HttpParameterBinding            mockBinding1 = new EmptyParameterBinding();
            HttpParameterBinding            mockBinding2 = new EmptyParameterBinding();
            HttpParameterBinding            mockBinding3 = new EmptyParameterBinding();

            pb.Add(param => param.ParameterName == "first" ? mockBinding1 : null);
            pb.Add(param => param.ParameterName == "first" ? mockBinding2 : null);
            pb.Add(param => param.ParameterType == typeof(int) ? mockBinding3 : null);

            // Act
            HttpParameterBinding b1 = pb.LookupBinding(CreateParameterDescriptor(null, "first"));
            HttpParameterBinding b2 = pb.LookupBinding(CreateParameterDescriptor(typeof(string), "none"));
            HttpParameterBinding b3 = pb.LookupBinding(CreateParameterDescriptor(typeof(int), "first"));
            HttpParameterBinding b4 = pb.LookupBinding(CreateParameterDescriptor(typeof(int), "last"));


            // Assert
            Assert.Equal(mockBinding1, b1);
            Assert.Null(b2);
            Assert.Equal(mockBinding1, b3);
            Assert.Equal(mockBinding3, b4);
        }
        public void BadReturnTypeThrows(string methodName)
        {
            // Arrange
            ODataQueryParameterBindingAttribute attribute = new ODataQueryParameterBindingAttribute();
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/Customer/?$orderby=Name");
            HttpConfiguration  config  = new HttpConfiguration();

            request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
            HttpControllerContext    controllerContext    = new HttpControllerContext(config, new HttpRouteData(new HttpRoute()), request);
            HttpControllerDescriptor controllerDescriptor = new HttpControllerDescriptor(new HttpConfiguration(), "CustomerLowLevel", typeof(CustomerHighLevelController));
            MethodInfo              methodInfo            = typeof(CustomerLowLevelController).GetMethod(methodName);
            ParameterInfo           parameterInfo         = methodInfo.GetParameters().First();
            HttpActionDescriptor    actionDescriptor      = new ReflectedHttpActionDescriptor(controllerDescriptor, methodInfo);
            HttpActionContext       actionContext         = new HttpActionContext(controllerContext, actionDescriptor);
            HttpParameterDescriptor parameterDescriptor   = new ReflectedHttpParameterDescriptor(actionDescriptor, parameterInfo);

            // Act
            HttpParameterBinding binding = attribute.GetBinding(parameterDescriptor);

            HttpResponseException responseException = Assert.Throws <HttpResponseException>(() =>
                                                                                            binding.ExecuteBindingAsync((ModelMetadataProvider)null, actionContext, CancellationToken.None).Wait());

            Assert.Equal(HttpStatusCode.InternalServerError, responseException.Response.StatusCode);
        }
Exemple #24
0
 public HttpParameterBindingTracer(HttpParameterBinding innerBinding, ITraceWriter traceWriter) : base(innerBinding.Descriptor)
 {
     InnerBinding = innerBinding;
     TraceWriter  = traceWriter;
 }
Exemple #25
0
        private static List <HttpParameterBinding> BindHandlers(List <HttpOperationHandler> handlers, string operationName, int serviceOperationIndex)
        {
            Fx.Assert(handlers != null, "The 'handlers' parameter should not be null.");
            Fx.Assert(operationName != null, "The 'operationName' parameter should not be null.");

            List <HttpParameterBinding> pipelineBindings = new List <HttpParameterBinding>();

            for (int inHandlerIndex = handlers.Count - 1; inHandlerIndex >= 1; inHandlerIndex--)
            {
                HttpOperationHandler inHandler     = handlers[inHandlerIndex];
                HandlerType          inHandlerType = GetHandlerType(inHandlerIndex, serviceOperationIndex);

                for (int inParamIndex = 0; inParamIndex < inHandler.InputParameters.Count; inParamIndex++)
                {
                    HttpParameter inParam = inHandler.InputParameters[inParamIndex];
                    List <HttpParameterBinding> bindings          = new List <HttpParameterBinding>();
                    List <HttpParameterBinding> tentativeBindings = new List <HttpParameterBinding>();

                    for (int outHandlerIndex = inHandlerIndex - 1; outHandlerIndex >= 0; outHandlerIndex--)
                    {
                        HttpOperationHandler outHandler     = handlers[outHandlerIndex];
                        HandlerType          outHandlerType = GetHandlerType(outHandlerIndex, serviceOperationIndex);

                        for (int outParamIndex = 0; outParamIndex < outHandler.OutputParameters.Count; outParamIndex++)
                        {
                            HttpParameter outParam = outHandler.OutputParameters[outParamIndex];

                            if (inParam.IsAssignableFromParameter(outParam.Type))
                            {
                                HttpParameterBinding binding = new HttpParameterBinding();
                                binding.InputHandler         = inHandler;
                                binding.InputHandlerIndex    = inHandlerIndex;
                                binding.InputParameter       = inParam;
                                binding.InputParameterIndex  = inParamIndex;
                                binding.InputHandlerType     = inHandlerType;
                                binding.OutputHandler        = outHandler;
                                binding.OutputHandlerIndex   = outHandlerIndex;
                                binding.OutputParameter      = outParam;
                                binding.OutputParameterIndex = outParamIndex;
                                binding.OutputHandlerType    = outHandlerType;

                                // If their names match or the input is either HttpRequesMessage,
                                //  HttpResponseMessage, or HttpContent, then go ahead and bind
                                if (string.Equals(outParam.Name, inParam.Name, StringComparison.OrdinalIgnoreCase) ||
                                    HttpTypeHelper.IsHttp(inParam.Type))
                                {
                                    bindings.Add(binding);
                                }
                                else
                                {
                                    // Otherwise we will tentatively bind if this is
                                    //  not a string conversion assignment
                                    if (outParam.Type != TypeHelper.StringType ||
                                        !inParam.ValueConverter.CanConvertFromString)
                                    {
                                        tentativeBindings.Add(binding);
                                    }
                                }
                            }
                        }
                    }

                    if (bindings.Count > 0)
                    {
                        pipelineBindings.AddRange(bindings);
                    }
                    else if (tentativeBindings.Count == 1)
                    {
                        pipelineBindings.AddRange(tentativeBindings);
                    }
                    else if (tentativeBindings.Count > 1)
                    {
                        ThrowForMulitpleTypeOnlyBindings(tentativeBindings, operationName);
                    }
                    else
                    {
                        ThrowForUnboundParameter(inHandler, inParam, inHandlerType, operationName);
                    }
                }
            }

            return(pipelineBindings);
        }
 public FromUriOrBodyParameterBinding(HttpParameterDescriptor desc)
     : base(desc)
 {
     _defaultUriBinding       = new FromUriAttribute().GetBinding(desc);
     _defaultFormatterBinding = new FromBodyAttribute().GetBinding(desc);
 }
 public AllRequestParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor)
 {
     modelBinding     = new ModelBinderAttribute().GetBinding(descriptor);
     formatterBinding = new FromBodyAttribute().GetBinding(descriptor);
 }
 public ODataQueryPackager(HttpParameterBinding binding, HttpActionContext context)
 {
     _binding = binding;
     _context = context;
 }
        private static List<HttpParameterBinding> BindHandlers(List<HttpOperationHandler> handlers, string operationName, int serviceOperationIndex)
        {
            Fx.Assert(handlers != null, "The 'handlers' parameter should not be null.");
            Fx.Assert(operationName != null, "The 'operationName' parameter should not be null.");

            List<HttpParameterBinding> pipelineBindings = new List<HttpParameterBinding>();

            for (int inHandlerIndex = handlers.Count - 1; inHandlerIndex >= 1; inHandlerIndex--)
            {
                HttpOperationHandler inHandler = handlers[inHandlerIndex];
                HandlerType inHandlerType = GetHandlerType(inHandlerIndex, serviceOperationIndex);

                for (int inParamIndex = 0; inParamIndex < inHandler.InputParameters.Count; inParamIndex++)
                {
                    HttpParameter inParam = inHandler.InputParameters[inParamIndex];
                    List<HttpParameterBinding> bindings = new List<HttpParameterBinding>();
                    List<HttpParameterBinding> tentativeBindings = new List<HttpParameterBinding>();

                    for (int outHandlerIndex = inHandlerIndex - 1; outHandlerIndex >= 0; outHandlerIndex--)
                    {
                        HttpOperationHandler outHandler = handlers[outHandlerIndex];
                        HandlerType outHandlerType = GetHandlerType(outHandlerIndex, serviceOperationIndex);

                        for (int outParamIndex = 0; outParamIndex < outHandler.OutputParameters.Count; outParamIndex++)
                        {
                            HttpParameter outParam = outHandler.OutputParameters[outParamIndex];

                            if (inParam.IsAssignableFromParameter(outParam.Type))
                            {
                                HttpParameterBinding binding = new HttpParameterBinding();
                                binding.InputHandler = inHandler;
                                binding.InputHandlerIndex = inHandlerIndex;
                                binding.InputParameter = inParam;
                                binding.InputParameterIndex = inParamIndex;
                                binding.InputHandlerType = inHandlerType;
                                binding.OutputHandler = outHandler;
                                binding.OutputHandlerIndex = outHandlerIndex;
                                binding.OutputParameter = outParam;
                                binding.OutputParameterIndex = outParamIndex;
                                binding.OutputHandlerType = outHandlerType;

                                // If their names match or the input is either HttpRequesMessage,
                                //  HttpResponseMessage, or HttpContent, then go ahead and bind
                                if (string.Equals(outParam.Name, inParam.Name, StringComparison.OrdinalIgnoreCase) ||
                                    HttpTypeHelper.IsHttp(inParam.Type))
                                {
                                    bindings.Add(binding);
                                }
                                else
                                {
                                    // Otherwise we will tentatively bind if this is
                                    //  not a string conversion assignment
                                    if (outParam.Type != TypeHelper.StringType ||
                                        !inParam.ValueConverter.CanConvertFromString)
                                    {
                                        tentativeBindings.Add(binding);
                                    }
                                }
                            }
                        }
                    }

                    if (bindings.Count > 0)
                    {
                        pipelineBindings.AddRange(bindings);
                    }
                    else if (tentativeBindings.Count == 1)
                    {
                        pipelineBindings.AddRange(tentativeBindings);
                    }
                    else if (tentativeBindings.Count > 1)
                    {
                        ThrowForMulitpleTypeOnlyBindings(tentativeBindings, operationName);
                    }
                    else
                    {
                        ThrowForUnboundParameter(inHandler, inParam, inHandlerType, operationName);
                    }
                }
            }

            return pipelineBindings;
        }
 public UserAwareHttpParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor)
 {
     _httpParameterDescriptor = descriptor;
     _paramaterBinding        = new FromBodyAttribute().GetBinding(descriptor);
 }
    //private readonly HttpParameterBinding _formatterBinding;

    public QueryFilterParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor)
    {
        _modelBinding = new ModelBinderAttribute().GetBinding(descriptor);
        //_formatterBinding = new FromBodyAttribute().GetBinding(descriptor);
    }