Exemple #1
0
        /// <summary>Processes the HTTP request URI binding.</summary>
        /// <param name="context">The context.</param>
        /// <param name="formUrlEncodedObjectSerializer">The form URL encoded object serializer.</param>
        /// <returns></returns>
        internal static async Task <bool> ProcessHttpRequestUriBinding(this ApiRequestContext context, IFormUrlEncodedObjectSerializer formUrlEncodedObjectSerializer)
        {
            if (!context.RequestAborted.IsCancellationRequested)
            {
                var addedBindingError = false;

                if (context.Routing?.Route?.Location?.UriParameterType != null || (context.Routing?.Route?.Location?.SimpleParameters.Count ?? 0) > 0)
                {
                    var nameValues = new Dictionary <string, string>();

                    if ((context.Routing?.Route?.RouteVariables?.Count ?? 0) > 0)
                    {
                        foreach (var routeVar in context.Routing.Route.RouteVariables.Keys)
                        {
                            if (!nameValues.ContainsKey(routeVar))
                            {
                                nameValues.Add(routeVar, context.Routing.Route.RouteVariables[routeVar]);
                            }
                        }
                    }

                    if ((context.Request.QueryVariables?.Count ?? 0) > 0)
                    {
                        foreach (var qvar in context.Request.QueryVariables.Keys)
                        {
                            if (!nameValues.ContainsKey(qvar))
                            {
                                nameValues.Add(qvar, context.Request.QueryVariables[qvar]);
                            }
                        }
                    }

                    // ----------------------------------------
                    // Bind the Simple Parameters if exists
                    // ----------------------------------------
                    var simpleParameters = new Dictionary <ParameterInfo, object>();

                    if (context.Routing.Route.Location.SimpleParameters != null)
                    {
                        context.Request.InvocationContext.SimpleParameters = context.Routing.Route.Location.SimpleParameters
                                                                             .ToDictionary((k) => k, (k) => null as object);
                    }

                    if ((context.Request.InvocationContext?.SimpleParameters.Count ?? 0) > 0)
                    {
                        foreach (var nameValue in nameValues)
                        {
                            var simpleParameter = context.Request.InvocationContext.SimpleParameters
                                                  .Where(s => s.Value == null)
                                                  .FirstOrDefault(p => p.Key.Name == nameValue.Key).Key;

                            // case insensitive check
                            if (simpleParameter == null)
                            {
                                simpleParameter = context.Request.InvocationContext.SimpleParameters
                                                  .Where(s => s.Value == null)
                                                  .FirstOrDefault(p => string.Compare(p.Key.Name, nameValue.Key, true) == 0).Key;
                            }

                            if (simpleParameter != null && context.Request.InvocationContext.SimpleParameters.ContainsKey(simpleParameter))
                            {
                                try
                                {
                                    context.Request.InvocationContext.SimpleParameters[simpleParameter] = TypeExtensions.IsArrayType(simpleParameter.ParameterType)
                                        ? ConvertArrayValue(nameValue.Value, simpleParameter.ParameterType)
                                        : ConvertValue(nameValue.Value, simpleParameter.ParameterType);
                                }
                                catch
                                {
                                    addedBindingError = true;

                                    var error = context.Configuration?.ValidationErrorConfiguration?.UriBindingValueError ?? string.Empty;

                                    var errorMessage = error
                                                       .Replace("{paramName}", simpleParameter.Name)
                                                       .Replace("{paramValue}", nameValue.Value ?? string.Empty)
                                                       .Replace("{paramType}", simpleParameter.ParameterType.Name);

                                    if (!string.IsNullOrWhiteSpace(errorMessage))
                                    {
                                        context.Validation.Errors.Add(errorMessage);
                                    }
                                }
                            }
                        }
                    }

                    // ----------------------------------------
                    // Bind the UrlModel if UrlModelType exists
                    // ----------------------------------------
                    if (context.Routing.Route.Location.UriParameterType != null)
                    {
                        var bindingValues = nameValues
                                            .Select(kv => $"{kv.Key}={kv.Value}");

                        var formUrlEncoded = string.Join("&", bindingValues);

                        try
                        {
                            var uriModel = await formUrlEncodedObjectSerializer.Deserialize(
                                formUrlEncoded,
                                context.Routing.Route.Location.UriParameterType,
                                true).ConfigureAwait(false);

                            context.Request.InvocationContext.UriModel = uriModel;
                        }
                        catch (JsonException ex)
                        {
                            addedBindingError = true;

                            var error = context.Configuration?.ValidationErrorConfiguration?.UriBindingError ?? string.Empty;

                            var errorMessage = error.Replace("{paramName}", ex.Path?.TrimStart('$', '.') ?? string.Empty);

                            if (!string.IsNullOrWhiteSpace(errorMessage))
                            {
                                context.Validation.Errors.Add(errorMessage);
                            }
                        }
                    }
                }

                if (addedBindingError)
                {
                    context.Response.StatusCode = context.Configuration?.ValidationErrorConfiguration?.UriBindingErrorStatusCode ?? 400;

                    return(false);
                }

                return(true);
            }

            return(false);
        }
Exemple #2
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="serializer"></param>
 public DeepSleepFormUrlEncodedMediaSerializer(IFormUrlEncodedObjectSerializer serializer)
 {
     this.serializer = serializer;
 }
Exemple #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DeepSleepMultipartFormDataMediaSerializer"/> class.
 /// </summary>
 /// <param name="multipartStreamReader">The multipart stream reader.</param>
 /// <param name="formUrlEncodedObjectSerializer">The form URL encoded object serializer.</param>
 public DeepSleepMultipartFormDataMediaSerializer(IMultipartStreamReader multipartStreamReader, IFormUrlEncodedObjectSerializer formUrlEncodedObjectSerializer)
 {
     this.multipartStreamReader          = multipartStreamReader;
     this.formUrlEncodedObjectSerializer = formUrlEncodedObjectSerializer;
 }