/// <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); }
/// <summary> /// /// </summary> /// <param name="serializer"></param> public DeepSleepFormUrlEncodedMediaSerializer(IFormUrlEncodedObjectSerializer serializer) { this.serializer = serializer; }
/// <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; }