public async void InvokeQueryRequestMiddleware_Transforms_ODataQueryRequest() { // Arrange RequestDelegate next = c => Task.CompletedTask; IODataQueryRequestParser[] parsers = new IODataQueryRequestParser[] { new DefaultODataQueryRequestParser() }; ODataQueryRequestMiddleware middleware = new ODataQueryRequestMiddleware(parsers, next); HttpContext context = new DefaultHttpContext(); HttpRequest request = context.Request; context.Request.Path = new PathString("/$query"); request.ContentType = "text/plain"; request.Method = "Post"; context.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes("$filter=Id le 5")); // Act await middleware.Invoke(context); // Assert Assert.Equal("Get", request.Method, ignoreCase: true); Assert.Equal("?$filter=Id le 5", request.QueryString.Value); }
/// <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="parser">The query request parser.</param> /// <param name="request">The Http request.</param> internal static async Task TransformQueryRequestAsync(IODataQueryRequestParser parser, HttpRequest request) { if (request == null) { throw Error.ArgumentNull(nameof(request)); } // Parse query options in request body string queryOptions = await parser.ParseAsync(request).ConfigureAwait(false); string requestPath = request.Path.Value.TrimEnd('/'); string queryString = request.QueryString.Value; // Strip off the /$query part requestPath = requestPath.Substring(0, requestPath.LastIndexOf("/$query", 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> /// Instantiates a new instance of <see cref="ODataQueryRequestMiddleware"/>. /// </summary> /// <param name="queryRequestParser">The query request parser.</param> /// <param name="next">The next middleware.</param> public ODataQueryRequestMiddleware(IODataQueryRequestParser queryRequestParser, RequestDelegate next) { _parser = queryRequestParser; _next = next; }