/// <summary> /// Parses the <paramref name="queryUri"/> and returns a new instance of <see cref="QueryDescriptorQueryToken"/> /// describing the query specified by the uri. /// </summary> /// <param name="queryUri">The absolute URI which holds the query to parse. This must be a path relative to the <paramref name="serviceBaseUri"/>.</param> /// <param name="serviceBaseUri">The base URI of the service.</param> /// <param name="maxDepth">The maximum depth of any single query part. Security setting to guard against DoS attacks causing stack overflows and such.</param> /// <returns>A new instance of <see cref="QueryDescriptorQueryToken"/> which represents the query specified in the <paramref name="queryUri"/>.</returns> public static QueryDescriptorQueryToken ParseUri(Uri queryUri, Uri serviceBaseUri, int maxDepth) { ExceptionUtils.CheckArgumentNotNull(queryUri, "queryUri"); if (!queryUri.IsAbsoluteUri) { throw new ArgumentException(Strings.QueryDescriptorQueryToken_UriMustBeAbsolute(queryUri), "queryUri"); } ExceptionUtils.CheckArgumentNotNull(serviceBaseUri, "serviceBaseUri"); if (!serviceBaseUri.IsAbsoluteUri) { throw new ArgumentException(Strings.QueryDescriptorQueryToken_UriMustBeAbsolute(serviceBaseUri), "serviceBaseUri"); } if (maxDepth <= 0) { throw new ArgumentException(Strings.QueryDescriptorQueryToken_MaxDepthInvalid, "maxDepth"); } QueryDescriptorQueryToken queryDescriptor = new QueryDescriptorQueryToken(); UriQueryPathParser pathParser = new UriQueryPathParser(maxDepth); queryDescriptor.Path = pathParser.ParseUri(queryUri, serviceBaseUri); List <QueryOptionQueryToken> queryOptions = HttpUtils.ParseQueryOptions(queryUri); string filter = queryOptions.GetQueryOptionValueAndRemove(UriQueryConstants.FilterQueryOption); if (filter != null) { UriQueryExpressionParser expressionParser = new UriQueryExpressionParser(maxDepth); queryDescriptor.Filter = expressionParser.ParseFilter(filter); } string orderBy = queryOptions.GetQueryOptionValueAndRemove(UriQueryConstants.OrderByQueryOption); if (orderBy != null) { UriQueryExpressionParser expressionParser = new UriQueryExpressionParser(maxDepth); queryDescriptor.OrderByTokens = expressionParser.ParseOrderBy(orderBy); } string skip = queryOptions.GetQueryOptionValueAndRemove(UriQueryConstants.SkipQueryOption); if (skip != null) { int skipValue; if (!UriPrimitiveTypeParser.TryUriStringToNonNegativeInteger(skip, out skipValue)) { throw new ODataException(Strings.QueryDescriptorQueryToken_InvalidSkipQueryOptionValue(skip)); } queryDescriptor.Skip = skipValue; } string top = queryOptions.GetQueryOptionValueAndRemove(UriQueryConstants.TopQueryOption); if (top != null) { int topValue; if (!UriPrimitiveTypeParser.TryUriStringToNonNegativeInteger(top, out topValue)) { throw new ODataException(Strings.QueryDescriptorQueryToken_InvalidTopQueryOptionValue(top)); } queryDescriptor.Top = topValue; } // the remaining query options are stored on the query descriptor queryDescriptor.QueryOptions = queryOptions.Count == 0 ? null : new ReadOnlyCollection <QueryOptionQueryToken>(queryOptions); return(queryDescriptor); }
/// <summary> /// Parses the <paramref name="queryUri"/> and returns a new instance of <see cref="QueryDescriptorQueryToken"/> /// describing the query specified by the uri. /// </summary> /// <param name="queryUri">The absolute URI which holds the query to parse. This must be a path relative to the <paramref name="serviceBaseUri"/>.</param> /// <param name="serviceBaseUri">The base URI of the service.</param> /// <param name="maxDepth">The maximum depth of any single query part. Security setting to guard against DoS attacks causing stack overflows and such.</param> /// <returns>A new instance of <see cref="QueryDescriptorQueryToken"/> which represents the query specified in the <paramref name="queryUri"/>.</returns> public static QueryDescriptorQueryToken ParseUri(Uri queryUri, Uri serviceBaseUri, int maxDepth) { ExceptionUtils.CheckArgumentNotNull(queryUri, "queryUri"); if (!queryUri.IsAbsoluteUri) { throw new ArgumentException(Strings.QueryDescriptorQueryToken_UriMustBeAbsolute(queryUri), "queryUri"); } ExceptionUtils.CheckArgumentNotNull(serviceBaseUri, "serviceBaseUri"); if (!serviceBaseUri.IsAbsoluteUri) { throw new ArgumentException(Strings.QueryDescriptorQueryToken_UriMustBeAbsolute(serviceBaseUri), "serviceBaseUri"); } if (maxDepth <= 0) { throw new ArgumentException(Strings.QueryDescriptorQueryToken_MaxDepthInvalid, "maxDepth"); } QueryDescriptorQueryToken queryDescriptor = new QueryDescriptorQueryToken(); UriQueryPathParser pathParser = new UriQueryPathParser(maxDepth); queryDescriptor.Path = pathParser.ParseUri(queryUri, serviceBaseUri); List<QueryOptionQueryToken> queryOptions = HttpUtils.ParseQueryOptions(queryUri); string filter = queryOptions.GetQueryOptionValueAndRemove(UriQueryConstants.FilterQueryOption); if (filter != null) { UriQueryExpressionParser expressionParser = new UriQueryExpressionParser(maxDepth); queryDescriptor.Filter = expressionParser.ParseFilter(filter); } string orderBy = queryOptions.GetQueryOptionValueAndRemove(UriQueryConstants.OrderByQueryOption); if (orderBy != null) { UriQueryExpressionParser expressionParser = new UriQueryExpressionParser(maxDepth); queryDescriptor.OrderByTokens = expressionParser.ParseOrderBy(orderBy); } string skip = queryOptions.GetQueryOptionValueAndRemove(UriQueryConstants.SkipQueryOption); if (skip != null) { int skipValue; if (!UriPrimitiveTypeParser.TryUriStringToNonNegativeInteger(skip, out skipValue)) { throw new ODataException(Strings.QueryDescriptorQueryToken_InvalidSkipQueryOptionValue(skip)); } queryDescriptor.Skip = skipValue; } string top = queryOptions.GetQueryOptionValueAndRemove(UriQueryConstants.TopQueryOption); if (top != null) { int topValue; if (!UriPrimitiveTypeParser.TryUriStringToNonNegativeInteger(top, out topValue)) { throw new ODataException(Strings.QueryDescriptorQueryToken_InvalidTopQueryOptionValue(top)); } queryDescriptor.Top = topValue; } // the remaining query options are stored on the query descriptor queryDescriptor.QueryOptions = queryOptions.Count == 0 ? null : new ReadOnlyCollection<QueryOptionQueryToken>(queryOptions); return queryDescriptor; }