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
- Create node with path "/startseite"
- Create redirect from "/start" to "/startseite"
- Send a GraphQL query:
query foo {
one: route(path:"start") {
path
}
two: route(path:"/start") {
path
}
}
{
"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