Exemple #1
0
        internal RequestBuilder Match(HttpMethod method, string pathAndQuery)
        {
            var segments        = PathAndQueryToSegments(pathAndQuery);
            var queryParameters = new Dictionary <string, string>();

            if (segments.Last().Contains("?"))
            {
                var parts = segments.Last().Split('?');

                segments[segments.Length - 1] = parts[0];

                queryParameters = parts[1]
                                  .Split('&')
                                  .Select(p => p.Split('='))
                                  .ToDictionary(p => p[0], p => p.Length == 2 ? p[1] : null);
            }

            if (segments.Last() == "")
            {
                segments = segments.Take(segments.Length - 1).ToArray();
            }

            RouteSegment pointer = null;

            foreach (var segment in segments)
            {
                if (pointer == null)
                {
                    if (!RootSegments.ContainsKey(segments[0]))
                    {
                        return(null);
                    }

                    pointer = RootSegments[segment];
                }
                else
                {
                    if (!pointer.Segments.ContainsKey(segment))
                    {
                        if (pointer.Segments.Any())
                        {
                            var first = pointer.Segments.Keys.First();

                            if (IsParameter(first))
                            {
                                pointer = pointer.Segments[first];
                            }
                        }
                        else
                        {
                            return(null);
                        }
                    }
                    else
                    {
                        pointer = pointer.Segments[segment];
                    }
                }
            }

            if (pointer != null)
            {
                if (pointer.HasForQueryParameters(method))
                {
                    // Match on query parameters
                    return(pointer.GetForQueryParameters(method, queryParameters));
                }

                return(pointer.GetWithoutQueryParameters(method));
            }

            return(null);
        }