/// <summary> /// Returns list of segments in the specified path (eg: /foo/bar -> foo, bar). /// </summary> /// <param name="absoluteUri">The absolute URI of the request.</param> /// <param name="serviceBaseUri">The service base URI for the request.</param> /// <returns>List of unescaped segments.</returns> private List <string> EnumerateSegments(Uri absoluteUri, Uri serviceBaseUri) { Debug.Assert(absoluteUri != null, "absoluteUri != null"); Debug.Assert(absoluteUri.IsAbsoluteUri, "absoluteRequestUri.IsAbsoluteUri(" + absoluteUri.IsAbsoluteUri + ")"); Debug.Assert(serviceBaseUri != null, "serviceBaseUri != null"); Debug.Assert(serviceBaseUri.IsAbsoluteUri, "serviceBaseUri.IsAbsoluteUri(" + serviceBaseUri + ")"); //// This is a copy of the RequestUriProcessor.EnumerateSegments if (!UriUtils.UriInvariantInsensitiveIsBaseOf(serviceBaseUri, absoluteUri)) { throw new ODataException(Strings.UriQueryPathParser_RequestUriDoesNotHaveTheCorrectBaseUri(absoluteUri, serviceBaseUri)); } try { Uri uri = absoluteUri; int numberOfSegmentsToSkip = 0; // Skip over the base URI segments #if SILVERLIGHT numberOfSegmentsToSkip = serviceBaseUri.AbsolutePath.Split('/').Length; string[] uriSegments = uri.AbsolutePath.Split('/'); #else numberOfSegmentsToSkip = serviceBaseUri.Segments.Length; string[] uriSegments = uri.Segments; #endif List <string> segments = new List <string>(); for (int i = numberOfSegmentsToSkip; i < uriSegments.Length; i++) { string segment = uriSegments[i]; if (segment.Length != 0 && segment != "/") { if (segment[segment.Length - 1] == '/') { segment = segment.Substring(0, segment.Length - 1); } if (segments.Count == this.maxDepth) { throw new ODataException(Strings.UriQueryPathParser_TooManySegments); } segments.Add(Uri.UnescapeDataString(segment)); } } return(segments); } catch (UriFormatException uriFormatException) { throw new ODataException(Strings.UriQueryPathParser_SyntaxError, uriFormatException); } }
/// <summary> /// Returns list of segments in the specified path (eg: /abc/pqr -> abc, pqr). /// </summary> /// <param name="absoluteUri">The absolute URI of the request.</param> /// <param name="serviceBaseUri">The service base URI for the request.</param> /// <returns>List of unescaped segments.</returns> internal ICollection <string> ParsePathIntoSegments(Uri absoluteUri, Uri serviceBaseUri) { DebugUtils.CheckNoExternalCallers(); if (!UriUtils.UriInvariantInsensitiveIsBaseOf(serviceBaseUri, absoluteUri)) { throw new ODataException(Strings.UriQueryPathParser_RequestUriDoesNotHaveTheCorrectBaseUri(absoluteUri, serviceBaseUri)); } try { Uri uri = absoluteUri; int numberOfSegmentsToSkip = 0; // Skip over the base URI segments #if (SILVERLIGHT || PORTABLELIB) && !WINRT numberOfSegmentsToSkip = serviceBaseUri.AbsolutePath.Split('/').Length; string[] uriSegments = uri.AbsolutePath.Split('/'); #else numberOfSegmentsToSkip = serviceBaseUri.Segments.Length; string[] uriSegments = uri.Segments; #endif List <string> segments = new List <string>(); for (int i = numberOfSegmentsToSkip; i < uriSegments.Length; i++) { string segment = uriSegments[i]; if (segment.Length != 0 && segment != "/") { if (segment[segment.Length - 1] == '/') { segment = segment.Substring(0, segment.Length - 1); } if (segments.Count == this.maxSegments) { throw new ODataException(Strings.UriQueryPathParser_TooManySegments); } segments.Add(Uri.UnescapeDataString(segment)); } } return(segments.ToArray()); } #if PORTABLELIB catch (FormatException uriFormatException) #else catch (UriFormatException uriFormatException) #endif { throw new ODataException(Strings.UriQueryPathParser_SyntaxError, uriFormatException); } }