示例#1
0
        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;
        }
示例#3
0
 /// <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;
 }