docs: def match_route(self, url):
          # type: (str) -> MatchResult
          """Match the url against known routes.
  
          This method takes a concrete route "/foo/bar", and
          matches it against a set of routes.  These routes can
          use param substitution corresponding to API gateway patterns.
          For example::
  
              match_route('/foo/bar') -> '/foo/{name}'
  
          """
          # Otherwise we need to check for param substitution
          parsed_url = urlparse(url)
          parsed_qs = parse_qs(parsed_url.query, keep_blank_values=True)
          query_params = {k: v[-1] for k, v in parsed_qs.items()}
          path = parsed_url.path
          # API Gateway removes the trailing slash if the route is not the root
          # path. We do the same here so our route matching works the same way.
          if path != '/' and path.endswith('/'):
              path = path[:-1]
          parts = path.split('/')
          captured = {}
          for route_url in self.route_urls:
              url_parts = route_url.split('/')
              if len(parts) == len(url_parts):
                  for i, j in zip(parts, url_parts):
                      if j.startswith('{') and j.endswith('}'):
                          captured[j[1:-1]] = i
                          continue
                      if i != j:
                          break
                  else:
                      return MatchResult(route_url, captured, query_params)
          raise ValueError("No matching route found for: %s" % url)