Drupal + searchApi + SearchStax : résoudre l'erreur « internal server error »

É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

Drupal & Composer - Appliquer un patch dans le fichier composer.json

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.

Ajouter un commentaire

Ne sera pas publié
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...