UrlTokenBindings parseURL(AsyncWebServerRequest *request, char templatePath[]) {
  if (!request) {
    auto emptyIterator = std::make_shared<TokenIterator>("", 0, '/');
    return UrlTokenBindings(emptyIterator, emptyIterator);
  }

  char urlBuffer[100];
  request->url().toCharArray(urlBuffer, sizeof(urlBuffer));
  
  int urlLength = strlen(urlBuffer);
  if (urlLength == 0 || urlLength >= sizeof(urlBuffer)) {
    auto emptyIterator = std::make_shared<TokenIterator>("", 0, '/');
    return UrlTokenBindings(emptyIterator, emptyIterator);
  }

  auto templateIterator = std::make_shared<TokenIterator>(templatePath, strlen(templatePath), '/');
  auto pathIterator = std::make_shared<TokenIterator>(urlBuffer, urlLength, '/');
  
  UrlTokenBindings bindings(templateIterator, pathIterator);
  return bindings;