/// <summary> /// Transforms a POST request targeted at a resource path ending in $query into a GET request. /// The query options are parsed from the request body and appended to the request URL. /// </summary> /// <param name="request">The request.</param> internal static void TransformQueryRequest(this HttpRequest request) { // Fetch parser capable of parsing the query options in the request body IODataQueryOptionsParser queryOptionsParser = ODataQueryOptionsParserFactory.GetQueryOptionsParser(request); // Parse query options in request body string queryOptions = queryOptionsParser.ParseAsync(request.Body).Result; string requestPath = request.Path.Value; string queryString = request.QueryString.Value; // Strip off the /$query part requestPath = requestPath.Substring(0, requestPath.LastIndexOf('/' + ODataRouteConstants.QuerySegment, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrWhiteSpace(queryOptions)) { if (string.IsNullOrWhiteSpace(queryString)) { queryString = '?' + queryOptions; } else { queryString += '&' + queryOptions; } } request.Path = new PathString(requestPath); request.QueryString = new QueryString(queryString); request.Method = HttpMethods.Get; }
/// <summary> /// Transforms a POST request targeted at a resource path ending in $query into a GET request. /// The query options are parsed from the request body and appended to the request URL. /// </summary> /// <param name="request">The request.</param> internal static void TransformQueryRequest(this HttpRequestMessage request) { // Fetch parser capable of parsing the query options in the request body IODataQueryOptionsParser queryOptionsParser = ODataQueryOptionsParserFactory.GetQueryOptionsParser(request); // Parse query options in request body Stream requestStream = request.Content.ReadAsStreamAsync().Result; string queryOptions = queryOptionsParser.ParseAsync(requestStream).Result; Uri requestUri = request.RequestUri; string requestPath = requestUri.LocalPath; string queryString = requestUri.Query; // Strip off the /$query part requestPath = requestPath.Substring(0, requestPath.LastIndexOf('/' + ODataRouteConstants.QuerySegment, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrWhiteSpace(queryOptions)) { if (string.IsNullOrWhiteSpace(queryString)) { queryString = '?' + queryOptions; } else { queryString += '&' + queryOptions; } } request.RequestUri = new UriBuilder(requestUri.Scheme, requestUri.Host, requestUri.Port, requestPath, queryString).Uri; request.Method = HttpMethod.Get; }
protected override void UpdateConfiguration(WebRouteConfiguration configuration) { IList <IODataQueryOptionsParser> queryOptionsParsers = ODataQueryOptionsParserFactory.Create(); queryOptionsParsers.Insert(0, new CustomODataQueryOptionsParser()); configuration.Routes.Clear(); configuration.Count().Filter().OrderBy().Expand().MaxTop(null).Select(); configuration.MapODataServiceRoute( "odata", "odata", configureAction: containerBuilder => containerBuilder .AddService(Microsoft.OData.ServiceLifetime.Singleton, typeof(IEdmModel), _ => GetEdmModel(configuration)) .AddService(Microsoft.OData.ServiceLifetime.Singleton, typeof(IODataPathHandler), _ => new DefaultODataPathHandler()) .AddService(Microsoft.OData.ServiceLifetime.Singleton, typeof(IEnumerable <IODataRoutingConvention>), _ => ODataRoutingConventions.CreateDefault()) .AddService(Microsoft.OData.ServiceLifetime.Singleton, typeof(IEnumerable <IODataQueryOptionsParser>), _ => queryOptionsParsers) ); }
public void PlainTextODataQueryOptionsParser_IsReturnedBy_ODataQueryOptionsParserFactory() { var parsers = ODataQueryOptionsParserFactory.Create(); Assert.Contains(parsers, p => p.GetType().Equals(typeof(PlainTextODataQueryOptionsParser))); }
/// <summary> /// Create a container builder with the default OData services. /// </summary> /// <returns>An instance of <see cref="IContainerBuilder"/> to manage services.</returns> protected IContainerBuilder CreateContainerBuilderWithCoreServices() { IContainerBuilder builder; if (this.BuilderFactory != null) { builder = this.BuilderFactory(); if (builder == null) { throw Error.InvalidOperation(SRResources.NullContainerBuilder); } } else { builder = new DefaultContainerBuilder(); } builder.AddDefaultODataServices(); // Set Uri resolver to by default enabling unqualified functions/actions and case insensitive match. builder.AddService( ServiceLifetime.Singleton, typeof(ODataUriResolver), sp => new UnqualifiedODataUriResolver { EnableCaseInsensitive = true }); // Add parsers for requests targeted at resource paths ending in $query builder.AddService(ServiceLifetime.Singleton, typeof(IEnumerable<IODataQueryOptionsParser>), sp => ODataQueryOptionsParserFactory.Create()); return builder; }