Étrange souci que j'ai rencontré sur un projet Drupal avec searchApi relié à SearchStax.
Sur certaines page j'avais un code retour 500 « internal server error » alors que beaucoup d'autres fonctionnaient sans souci... Pas vraiment de log sur Searchstax pour creuser, ni d'option de debug. Le plus étrange, la même requête dans postman répondait correctement, mais en la faisant via le binaire curl, erreur aussi.
Cela semblait arriver sur les très grosses requêtes, sur une de celles qui posait souci, le body de la requête était proche de 8ko, oui, plus de 8000 caractères.
En finissant par comparer les headers, la solution se trouvait dans le « Accept-Encoding: gzip » présent par défaut dans postman. En l'ajoutant à la requête curl, c'est ok.
J'ai donc utilisé un event pour l'ajouter à l'ensemble des requêtes searchApi :
mon_module/src/EventSubscriber/MonModuleSearchSubscriber.php
<?php
namespace Drupal\mon_module\EventSubscriber;
use Solarium\Core\Event\PostCreateRequest as PostCreateRequestEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Pop_produit event subscriber.
*/
class MonModuleSearchSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents(): array {
return [
PostCreateRequestEvent::class => ['postCreateRequestAddHeader'],
];
}
public function postCreateRequestAddHeader(PostCreateRequestEvent $e) {
$request = $e->getRequest();
$request->addHeader('Accept-Encoding: gzip');
}
}
Plus d'erreur, mais on se retrouve maintenant avec une réponse encodée en gzip, il faut la décoder, pas possible d'utiliser un event ici, j'ai donc du faire un patch pour le fichier search_api_solr/Plugin/search_api/backend/SearchApiSolrBackend.php :
diff --git a/src/Plugin/search_api/backend/SearchApiSolrBackend.php b/src/Plugin/search_api/backend/SearchApiSolrBackend.php
index 752df404..0af49932 100644
--- a/src/Plugin/search_api/backend/SearchApiSolrBackend.php
+++ b/src/Plugin/search_api/backend/SearchApiSolrBackend.php
@@ -1930,6 +1930,9 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
// Send search request.
$response = $connector->search($solarium_query, $this->getCollectionEndpoint($index));
$body = $response->getBody();
+ if (@gzdecode($body) !== FALSE) {
+ $body = gzdecode($body);
+ }
if (200 != $response->getStatusCode()) {
throw new SearchApiSolrException(strip_tags($body), $response->getStatusCode());
}
et l'ajouter à mon composer.json (voir plus bas pour en savoir plus sur les patchs et composer) :
"patches": {
"drupal/search_api_solr": {
"Gzip Encoding": "./files/patches/search_api_solr_gzip_encoding.patch"
}
}
C'est pas fou, il y a peut-être une solution plus propre, mais j'espère que ça aidera quelqu'un car les ressources sur le sujet semblent inexistantes. La page searchstax concernant ce code d'erreur ne donne aucune piste pointant sur ce genre de solution.
Merci Romain pour m'avoir mis sur la bonne piste !
Contenus en rapport
Si vous utilisez composer pour gérer votre instance de Drupal, vous avez parfois besoin d'appliquer un patch (de votre conception ou depuis drupal.org) que ce soit pour un module tiers ou pour le core.
Si on est "à l'ancienne" on a le core et les module sous gestionnaire de version (git par exemple), cela reste simple, vous appliquez le patch et commitez le tout.
Avec Drupal et Drupal 8 encore plus la recherche passe la plupart du temps par Search API, une interface qui se branche devant plusieurs moteur de base de données (SolR, ElasticSearch, Database...)
Commentaires
Very nice post. Thanks for sharing the post. Best of Luck my dear friend<a href="https://www.eljnoub.com/">شيخ روحاني</a>
Thank you for this!! So helpful. Check out <a href="https://www.townsvillelawnservices.com.au/green-waste-removal">Townsville Green Waste Removal</a>
BETFIX SLOT ONLINE, a direct slot site from abroad that makes real money. Make money by yourself easily, no need to invest. Direct slot site, deposit, withdraw, true wallet, no minimum, 1 baht can be deposited, no bank account, add True Wallet, withdraw unlimitedly, 1 baht can be withdrawn as well. <a href="https://betflik-auto.bet/" rel='dofollow'>betflix auto</a>
Ajouter un commentaire