Problem/Motivation

To work around a bug in node routing, I have to send a GraphQL query with 2 route queries: One with a trailing slash, one without.

When the targeted path is a redirect, a RedirectLoopException is thrown. In GraphQL this is shown as "Internal server error".

Steps to reproduce

  1. Create node with path "/startseite"
  2. Create redirect from "/start" to "/startseite"
  3. Send a GraphQL query:
query foo {
  one: route(path:"start") {
    path
  }
  two: route(path:"/start") {
    path
  }
}
  • Get an error:
    {
      "errors": [
        {
          "message": "Internal server error",
          "extensions": {
            "category": "internal"
          },
          "locations": [
            {
              "line": 5,
              "column": 3
            }
          ],
          "path": [
            "two"
          ]
        }
      ],
      "data": {
        "one": {
          "path": "/startseite"
        },
        "two": null
      }
    }
    
  • Exception

    For error #0: Drupal\redirect\Exception\RedirectLoopException: Redirect loop identified at /start for redirect 32 in Drupal\redirect\RedirectRepository->findMatchingRedirect() (line 138 of /var/www/drupal/docroot/modules/contrib/redirect/src/RedirectRepository.php)
    #0 /var/www/drupal/docroot/modules/contrib/graphql_core_schema/src/Plugin/GraphQL/DataProducer/Route.php(175): Drupal\redirect\RedirectRepository->findMatchingRedirect()
    #1 [internal function]: Drupal\graphql_core_schema\Plugin\GraphQL\DataProducer\Route->resolve()
    #2 /var/www/drupal/docroot/modules/contrib/graphql/src/Plugin/GraphQL/DataProducer/DataProducerPluginBase.php(55): call_user_func_array()
    #3 /var/www/drupal/docroot/modules/contrib/graphql/src/Plugin/GraphQL/DataProducer/DataProducerProxy.php(238): Drupal\graphql\Plugin\GraphQL\DataProducer\DataProducerPluginBase->resolveField()
    #4 /var/www/drupal/docroot/modules/contrib/graphql/src/Plugin/GraphQL/DataProducer/DataProducerProxy.php(181): Drupal\graphql\Plugin\GraphQL\DataProducer\DataProducerProxy->resolveUncached()
    #5 /var/www/drupal/docroot/modules/contrib/graphql/src/GraphQL/Utility/DeferredUtility.php(72): Drupal\graphql\Plugin\GraphQL\DataProducer\DataProducerProxy->Drupal\graphql\Plugin\GraphQL\DataProducer\{closure}()
    #6 /var/www/drupal/docroot/modules/contrib/graphql/src/Plugin/GraphQL/DataProducer/DataProducerProxy.php(167): Drupal\graphql\GraphQL\Utility\DeferredUtility::returnFinally()
    #7 /var/www/drupal/docroot/modules/contrib/graphql/src/GraphQL/Resolver/Composite.php(48): Drupal\graphql\Plugin\GraphQL\DataProducer\DataProducerProxy->resolve()
    #8 /var/www/drupal/docroot/modules/contrib/graphql/src/GraphQL/ResolverRegistry.php(81): Drupal\graphql\GraphQL\Resolver\Composite->resolve()
    #9 /var/www/drupal/docroot/modules/contrib/graphql/src/Entity/Server.php(354): Drupal\graphql\GraphQL\ResolverRegistry->resolveField()
    

    Other information

    I have to do two "route" queries, one with and one without slash, because the GraphQL query behaves differently when a node still exists at the source path of the redirect.

    To be able to do a proper redirect, I have to fetch both routes.

    Case 1: A node exists on redirect source "/start"

    • route request for "start" returns RedirectUrl to "/startseite"
    • route request for "/start" returns EntityCanonicalUrl

    Case 2: No node exists on redirect source "/start"

    • route request for "start" returns RedirectUrl to "/start"
    • route request for "/start" returns RedirectUrl to "/startseite"

    Comments

    cweiske created an issue.