Beispiel #1
0
        private static BodyModelBinder GetBodyBinder(
            IInputFormatter inputFormatter, IBodyModelValidator validator, IOptions <MvcOptions> mvcOptions)
        {
            var actionContext          = CreateActionContext(new DefaultHttpContext());
            var inputFormatterSelector = new Mock <IInputFormatterSelector>();

            inputFormatterSelector.Setup(o => o.SelectFormatter(It.IsAny <InputFormatterContext>())).Returns(inputFormatter);

            if (validator == null)
            {
                var mockValidator = new Mock <IBodyModelValidator>();
                mockValidator.Setup(o => o.Validate(It.IsAny <ModelValidationContext>(), It.IsAny <string>()))
                .Returns(true)
                .Verifiable();
                validator = mockValidator.Object;
            }

            if (mvcOptions == null)
            {
                var options = new Mock <MvcOptions>();
                options.CallBase = true;
                var mockMvcOptions = new Mock <IOptions <MvcOptions> >();
                mockMvcOptions.SetupGet(o => o.Options).Returns(options.Object);
                mvcOptions = mockMvcOptions.Object;
            }

            var binder = new BodyModelBinder(actionContext,
                                             inputFormatterSelector.Object,
                                             validator,
                                             mvcOptions);

            return(binder);
        }
Beispiel #2
0
        /// <summary>
        /// Bind this parameter from the body using the supplied set of formatters.
        /// </summary>
        /// <param name="parameter">parameter to provide binding for.</param>
        /// <param name="formatters">formatters to choose from when binding the body</param>
        /// <returns>a binding</returns>
        public static HttpParameterBinding BindWithFormatter(this HttpParameterDescriptor parameter, IEnumerable <MediaTypeFormatter> formatters)
        {
            HttpConfiguration   config     = parameter.Configuration;
            IBodyModelValidator validators = config.Services.GetBodyModelValidator();

            return(new FormatterParameterBinding(parameter, formatters, validators));
        }
 public ApiParameterBinding(HttpParameterDescriptor descriptor, bool willReadBody, IBodyModelValidator validator, bool isObject, bool fromBody) : base(descriptor)
 {
     _willReadBody = willReadBody;
     _validator    = validator;
     _isObject     = isObject;
     _fromBody     = fromBody;
 }
Beispiel #4
0
        /// <summary>
        /// Validates the given entity and adds the validation errors to the <see cref="ApiController.ModelState"/>, if any.
        /// </summary>
        /// <typeparam name="TEntity">The type of the entity to be validated.</typeparam>
        /// <param name="entity">The entity being validated.</param>
        /// <param name="keyPrefix">
        /// The key prefix under which the model state errors would be added in the <see cref="ApiController.ModelState"/>.
        /// </param>
        public void Validate <TEntity>(TEntity entity, string keyPrefix)
        {
            if (Configuration == null)
            {
                throw Error.InvalidOperation(
                          SRResources.TypePropertyMustNotBeNull,
                          typeof(ApiController).Name,
                          "Configuration"
                          );
            }

            IBodyModelValidator validator = Configuration.Services.GetBodyModelValidator();

            if (validator != null)
            {
                ModelMetadataProvider metadataProvider =
                    Configuration.Services.GetModelMetadataProvider();
                Contract.Assert(
                    metadataProvider != null,
                    "GetModelMetadataProvider throws on null."
                    );

                validator.Validate(
                    entity,
                    typeof(TEntity),
                    metadataProvider,
                    ActionContext,
                    keyPrefix
                    );
            }
        }
        private static BodyModelBinder GetBodyBinder(
            IInputFormatter inputFormatter, IBodyModelValidator validator)
        {
            var actionContext          = CreateActionContext(new DefaultHttpContext());
            var inputFormatterSelector = new Mock <IInputFormatterSelector>();

            inputFormatterSelector.Setup(o => o.SelectFormatter(It.IsAny <InputFormatterContext>())).Returns(inputFormatter);

            if (validator == null)
            {
                var mockValidator = new Mock <IBodyModelValidator>();
                mockValidator.Setup(o => o.Validate(It.IsAny <ModelValidationContext>(), It.IsAny <string>()))
                .Returns(true)
                .Verifiable();
                validator = mockValidator.Object;
            }

            var bodyValidationPredicatesProvidwer = new Mock <IValidationExcludeFiltersProvider>();

            bodyValidationPredicatesProvidwer.SetupGet(o => o.ExcludeFilters)
            .Returns(new List <IExcludeTypeValidationFilter>());

            var binder = new BodyModelBinder(actionContext,
                                             inputFormatterSelector.Object,
                                             validator,
                                             bodyValidationPredicatesProvidwer.Object);

            return(binder);
        }
Beispiel #6
0
 public BodyAndUriParameterBinding(HttpParameterDescriptor descriptor)
     : base(descriptor)
 {
     _httpConfiguration  = descriptor.Configuration;
     _formatters         = _httpConfiguration.Formatters;
     _bodyModelValidator = _httpConfiguration.Services.GetBodyModelValidator();
 }
Beispiel #7
0
        public static bool IsValid <TEntity>(this ApiController controller, TEntity entity, string keyPrefix, out ModelStateDictionary modelState)
        {
            HttpConfiguration configuration = controller.Configuration;

            if (configuration == null)
            {
                throw new InvalidOperationException("Configuration cannot be null");
            }
            IBodyModelValidator validator = configuration.Services.GetBodyModelValidator();

            if (validator != null)
            {
                ModelMetadataProvider metadataProvider = configuration.Services.GetModelMetadataProvider();

                HttpActionDescriptor actionDescriptor = controller.Request.GetActionDescriptor();
                if (actionDescriptor == null)
                {
                    throw new InvalidOperationException("Request must have an action descriptor.");
                }

                HttpActionContext actionContext = new HttpActionContext(controller.ControllerContext, actionDescriptor);
                if (!validator.Validate(entity, typeof(TEntity), metadataProvider, actionContext, keyPrefix))
                {
                    modelState = actionContext.ModelState;
                    return(false);
                }
            }

            modelState = null;
            return(true);
        }
 public BodyAndUriParameterBinding(HttpParameterDescriptor descriptor)
     : base(descriptor)
 {
     var httpConfiguration = descriptor.Configuration;
     Formatters = httpConfiguration.Formatters;
     BodyModelValidator = httpConfiguration.Services.GetBodyModelValidator();
 }
Beispiel #9
0
        public async Task ExecuteBindingAsync_PassesCancellationTokenTo_ReadContentAsync()
        {
            // Arrange
            var parameter = new Mock <HttpParameterDescriptor>();

            parameter.Setup(p => p.IsOptional).Returns(false);
            parameter.Setup(p => p.ParameterName).Returns("ParameterName");
            var formatters = Enumerable.Empty <MediaTypeFormatter>();
            IBodyModelValidator   validator        = null;
            ModelMetadataProvider metadataProvider = new Mock <ModelMetadataProvider>().Object;
            HttpRequestMessage    request          = new HttpRequestMessage();
            HttpActionContext     actionContext    = new HttpActionContext {
                ControllerContext = new HttpControllerContext {
                    Request = request
                }
            };
            CancellationTokenSource cts = new CancellationTokenSource();

            Mock <FormatterParameterBinding> binding = new Mock <FormatterParameterBinding>(parameter.Object, formatters, validator);

            binding.CallBase = true;
            binding.Setup(b => b.ReadContentAsync(request, null, formatters, It.IsAny <IFormatterLogger>()))
            .Returns(Task.FromResult <object>(42))
            .Verifiable();

            // Act
            await binding.Object.ExecuteBindingAsync(metadataProvider, actionContext, cts.Token);

            // Assert
            binding.Verify();
        }
Beispiel #10
0
        public async Task ReadContentAsync_PassesCancellationToken_Further()
        {
            // Arrange
            var parameter = new Mock <HttpParameterDescriptor>();

            parameter.Setup(p => p.IsOptional).Returns(false);
            IBodyModelValidator validator = null;
            HttpRequestMessage  request   = new HttpRequestMessage();

            request.Content = new StringContent("");
            request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("app/test");
            IFormatterLogger        logger = null;
            CancellationTokenSource cts    = new CancellationTokenSource();

            Mock <MediaTypeFormatter> formatter = new Mock <MediaTypeFormatter>();

            formatter.Setup(f => f.CanReadType(typeof(int))).Returns(true);
            formatter.Object.SupportedMediaTypes.Add(request.Content.Headers.ContentType);
            formatter.Setup(f => f.ReadFromStreamAsync(typeof(int), It.IsAny <Stream>(), request.Content, logger, cts.Token))
            .Returns(Task.FromResult <object>(42))
            .Verifiable();

            var formatters = new[] { formatter.Object };
            FormatterParameterBinding binding = new FormatterParameterBinding(parameter.Object, formatters, validator);

            // Act
            await binding.ReadContentAsync(request, typeof(int), formatters, logger, cts.Token);

            // Assert
            formatter.Verify();
        }
Beispiel #11
0
        public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
            ValueProviderResult valueProviderResult = GetCompatibleValueProviderResult(
                bindingContext
                );

            if (valueProviderResult == null)
            {
                return(false); // conversion would have failed
            }

            bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);
            object model = valueProviderResult.RawValue;

            ModelBindingHelper.ReplaceEmptyStringWithNull(bindingContext.ModelMetadata, ref model);
            bindingContext.Model = model;
            if (bindingContext.ModelMetadata.IsComplexType)
            {
                HttpControllerContext controllerContext = actionContext.ControllerContext;
                if (controllerContext == null)
                {
                    throw Error.Argument(
                              "actionContext",
                              SRResources.TypePropertyMustNotBeNull,
                              typeof(HttpActionContext).Name,
                              "ControllerContext"
                              );
                }

                HttpConfiguration configuration = controllerContext.Configuration;
                if (configuration == null)
                {
                    throw Error.Argument(
                              "actionContext",
                              SRResources.TypePropertyMustNotBeNull,
                              typeof(HttpControllerContext).Name,
                              "Configuration"
                              );
                }

                ServicesContainer services = configuration.Services;
                Contract.Assert(services != null);

                IBodyModelValidator   validator        = services.GetBodyModelValidator();
                ModelMetadataProvider metadataProvider = services.GetModelMetadataProvider();
                if (validator != null && metadataProvider != null)
                {
                    validator.Validate(
                        model,
                        bindingContext.ModelType,
                        metadataProvider,
                        actionContext,
                        bindingContext.ModelName
                        );
                }
            }

            return(true);
        }
Beispiel #12
0
 /// <summary>
 /// Bind this parameter from the body using the supplied set of formatters and validator.
 /// </summary>
 /// <param name="parameter">parameter to provide binding for.</param>
 /// <param name="formatters">formatters to choose from when binding the body</param>
 /// <param name="bodyModelValidator">a validator. Null to disable validation for this parameter.</param>
 /// <returns>a binding</returns>
 public static HttpParameterBinding BindWithFormatter(
     this HttpParameterDescriptor parameter,
     IEnumerable <MediaTypeFormatter> formatters,
     IBodyModelValidator bodyModelValidator
     )
 {
     return(new FormatterParameterBinding(parameter, formatters, bodyModelValidator));
 }
Beispiel #13
0
        public EasyPatchParameterBinding(HttpParameterDescriptor descriptor, Configuration config = null)
            : base(descriptor)
        {
            var httpConfiguration = descriptor.Configuration;

            BodyModelValidator = httpConfiguration.Services.GetBodyModelValidator();
            Formatters         = httpConfiguration.Formatters;
            configuration      = config ?? new Configuration();
        }
        public TypePrefixBodyModelValidator(IBodyModelValidator innerValidator)
        {
            if (innerValidator == null)
            {
                throw new ArgumentNullException("innerValidator");
            }

            this.innerValidator = innerValidator;
        }
        public PrefixlessBodyModelValidator(IBodyModelValidator innerValidator)
        {
            if (innerValidator == null)
            {
                throw new ArgumentNullException("innerValidator");
            }

            _innerValidator = innerValidator;
        }
Beispiel #16
0
        public TypePrefixBodyModelValidator(IBodyModelValidator innerValidator)
        {
            if (innerValidator == null)
            {
                throw new ArgumentNullException("innerValidator");
            }

            this.innerValidator = innerValidator;
        }
Beispiel #17
0
        public SkyBodyModelValidator(IBodyModelValidator innerValidator)
        {
            if (innerValidator == null)
            {
                throw new ArgumentNullException("innerValidator");
            }

            _innerValidator = innerValidator;
        }
Beispiel #18
0
 public BodyModelBinder([NotNull] IContextAccessor <ActionContext> context,
                        [NotNull] IInputFormatterSelector selector,
                        [NotNull] IBodyModelValidator bodyModelValidator,
                        [NotNull] IValidationExcludeFiltersProvider bodyValidationExcludeFiltersProvider)
 {
     _actionContext      = context.Value;
     _formatterSelector  = selector;
     _bodyModelValidator = bodyModelValidator;
     _bodyValidationExcludeFiltersProvider = bodyValidationExcludeFiltersProvider;
 }
 public FormatterParameterBinding(HttpParameterDescriptor descriptor, IEnumerable <MediaTypeFormatter> formatters, IBodyModelValidator bodyModelValidator)
     : base(descriptor)
 {
     if (descriptor.IsOptional)
     {
         _errorMessage = Error.Format(SRResources.OptionalBodyParameterNotSupported, descriptor.Prefix ?? descriptor.ParameterName, GetType().Name);
     }
     Formatters         = formatters;
     BodyModelValidator = bodyModelValidator;
 }
Beispiel #20
0
 public BodyModelBinder([NotNull] IContextAccessor <ActionContext> context,
                        [NotNull] IInputFormatterSelector selector,
                        [NotNull] IBodyModelValidator bodyModelValidator,
                        [NotNull] IOptions <MvcOptions> mvcOptions)
 {
     _actionContext      = context.Value;
     _formatterSelector  = selector;
     _bodyModelValidator = bodyModelValidator;
     _mvcOptions         = mvcOptions;
 }
 public FormatterParameterBinding(HttpParameterDescriptor descriptor, IEnumerable<MediaTypeFormatter> formatters, IBodyModelValidator bodyModelValidator)
     : base(descriptor)
 {
     if (descriptor.IsOptional)
     {
         _errorMessage = Error.Format(SRResources.OptionalBodyParameterNotSupported, descriptor.Prefix ?? descriptor.ParameterName, GetType().Name);
     }
     Formatters = formatters;
     BodyModelValidator = bodyModelValidator;
 }
Beispiel #22
0
 public BodyModelValidator(IBodyModelValidator originalValidator)
 {
     if (originalValidator != null)
     {
         _defaultValidator = originalValidator;
     }
     else
     {
         _defaultValidator = new DefaultBodyModelValidator();
     }
 }
Beispiel #23
0
        /// <summary>
        /// This attribute is used on action parameters to indicate
        /// they come only from the content body of the incoming <see cref="HttpRequestMessage"/>.
        /// </summary>
        public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException("parameter");
            }

            IEnumerable <MediaTypeFormatter> formatters = parameter.Configuration.Formatters;
            IBodyModelValidator validator = parameter.Configuration.Services.GetBodyModelValidator();

            return(parameter.BindWithFormatter(formatters, validator));
        }
Beispiel #24
0
 public BodyModelBinder([NotNull] IScopedInstance <ActionContext> context,
                        [NotNull] IScopedInstance <ActionBindingContext> bindingContext,
                        [NotNull] IInputFormatterSelector selector,
                        [NotNull] IBodyModelValidator bodyModelValidator,
                        [NotNull] IValidationExcludeFiltersProvider bodyValidationExcludeFiltersProvider)
 {
     _actionContext      = context.Value;
     _bindingContext     = bindingContext;
     _formatterSelector  = selector;
     _bodyModelValidator = bodyModelValidator;
     _bodyValidationExcludeFiltersProvider = bodyValidationExcludeFiltersProvider;
 }
 /// <summary>
 /// Bind this parameter from the body using the supplied set of formatters and validator. 
 /// </summary>
 /// <param name="parameter">parameter to provide binding for.</param>
 /// <param name="formatters">formatters to choose from when binding the body</param>
 /// <param name="bodyModelValidator">a validator. Null to disable validation for this parameter.</param>
 /// <returns>a binding</returns>
 public static HttpParameterBinding BindWithFormatter(this HttpParameterDescriptor parameter, IEnumerable<MediaTypeFormatter> formatters, IBodyModelValidator bodyModelValidator)
 {
     return new FormatterParameterBinding(parameter, formatters, bodyModelValidator);
 }
 public IdFromRouteFormatterParameterBinding(HttpParameterDescriptor descriptor, IEnumerable <MediaTypeFormatter> formatters, IBodyModelValidator bodyModelValidator)
     : base(descriptor, formatters, bodyModelValidator)
 {
 }
 public FormatterParameterBinding(HttpParameterDescriptor descriptor, IEnumerable<MediaTypeFormatter> formatters, IBodyModelValidator bodyModelValidator)
     : base(descriptor)
 {
     Formatters = formatters;
     BodyModelValidator = bodyModelValidator;
 }
Beispiel #28
0
 public FormatterParameterBinding(HttpParameterDescriptor descriptor, IEnumerable <MediaTypeFormatter> formatters, IBodyModelValidator bodyModelValidator)
     : base(descriptor)
 {
     Formatters         = formatters;
     BodyModelValidator = bodyModelValidator;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="PatchRequestParameterBinding"/> class.
 /// </summary>
 /// <param name="descriptor">The descriptor.</param>
 /// <param name="bodyModelValidator">The body model validator.</param>
 public PatchRequestParameterBinding(HttpParameterDescriptor descriptor, IBodyModelValidator bodyModelValidator)
     : base(descriptor)
 {
     _BodyModelValidator = bodyModelValidator;
 }
Beispiel #30
0
        /// <summary>
        /// Gets the binding.
        /// </summary>
        /// <param name="parameter">The parameter.</param>
        /// <returns>System.Web.Http.Controllers.HttpParameterBinding.</returns>
        public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter)
        {
            IBodyModelValidator bodyModelValidator = parameter.Configuration.Services.GetBodyModelValidator();

            return(new PatchRequestParameterBinding(parameter, bodyModelValidator));
        }
 public IdFromRouteFormatterParameterBinding(HttpParameterDescriptor descriptor, IEnumerable<MediaTypeFormatter> formatters, IBodyModelValidator bodyModelValidator)
     : base(descriptor, formatters, bodyModelValidator) { }
Beispiel #32
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PatchRequestParameterBinding"/> class.
 /// </summary>
 /// <param name="descriptor">The descriptor.</param>
 /// <param name="bodyModelValidator">The body model validator.</param>
 public PatchRequestParameterBinding(HttpParameterDescriptor descriptor, IBodyModelValidator bodyModelValidator)
     : base(descriptor)
 {
     _BodyModelValidator = bodyModelValidator;
 }
Beispiel #33
0
 public CustomBodyModelValidator(IBodyModelValidator validator)
 {
     _validator = validator;
 }
 public CustomBodyModelValidator(IBodyModelValidator validator)
 {
     _validator = validator;
 }
 public TypePrefixBodyModelValidator(IBodyModelValidator innerValidator)
 {
     this.innerValidator = innerValidator ?? throw new ArgumentNullException(nameof(innerValidator));
 }