Champs d'en-tête de requête 431 trop volumineux - TooBigHeaders

Vous consultez la documentation d'Apigee Edge.
Consultez la documentation Apigee X.
en savoir plus

Problème constaté

En réponse aux appels d'API, l'application cliente reçoit un code d'état HTTP 431 Request Header Fields Too Large avec le code d'erreur protocol.http.TooBigHeaders .

Message d'erreur

L'application cliente reçoit le code de réponse suivant:

HTTP/1.1 431 Request Header Fields Too Large

De plus, le message d'erreur suivant peut s'afficher:

{
   "fault":{
      "faultstring":"request headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}

Causes possibles

Cette erreur se produit si la taille totale de tous les en-têtes de requête envoyés par l'application cliente à Apigee Edge dans le cadre de la requête HTTP est supérieure à la limite autorisée dans Apigee Edge conformément à la section 5 du document RFC 6585: 431 Request Header Fields Too Large.

Voici les causes possibles de cette erreur:

Cause Description Instructions de dépannage applicables
La taille des en-têtes de requête est supérieure à la limite autorisée La taille totale de tous les en-têtes envoyés par l'application cliente dans le cadre de la requête HTTP adressée à Apigee Edge est supérieure à la limite autorisée dans Apigee Edge. Utilisateurs Edge Public and Private Cloud

Étapes de diagnostic courantes

Utilisez l'un des outils ou techniques suivants pour diagnostiquer cette erreur:

Surveillance des API

Pour diagnostiquer l'erreur à l'aide de la surveillance des API:

  1. Connectez-vous à l'interface utilisateur Apigee Edge en tant qu'utilisateur disposant du rôle approprié.
  2. Accédez à l'organisation dans laquelle vous souhaitez examiner le problème.

  3. Accédez à la page Analyze > API Monitoring > Investigate (Analyser > Surveillance des API > Enquêter).
  4. Sélectionnez la période spécifique au cours de laquelle vous avez observé les erreurs.
  5. Tracez le code d'erreur par rapport à l'heure.
  6. Sélectionnez une cellule ayant le code d'erreur protocol.http.TooBigHeaders et le code d'état 431 comme indiqué ci-dessous:

    ( Afficher l'image plus grande)

  7. Vous verrez les informations sur le code d'erreur protocol.http.TooBigHeaders comme indiqué ci-dessous:

    ( Afficher l'image plus grande)

  8. Cliquez sur Afficher les journaux et développez la ligne de la requête ayant échoué:

    ( Afficher l'image plus grande)

  9. Dans la fenêtre Journaux, notez les détails suivants:

    • Code d'état:431
    • Source de l'erreur: apigee
    • Code d'erreur:protocol.http.TooBigHeaders.
    • Longueur de la requête(octets) : 32150 (> 25 KB)
  10. Si la source d'erreur a la valeur apigee ou MP, le code d'erreur a la valeur protocol.http.TooBigHeaders et la longueur de la requête est supérieure à 25 Ko, cela indique que la taille totale de tous les en-têtes de requête envoyés par l'application cliente dans le cadre d'une requête HTTP dépasse la limite autorisée dans Apigee.

Outil de traçage

NGINX

Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX, procédez comme suit:

  1. Si vous êtes un utilisateur du cloud privé, vous pouvez utiliser les journaux d'accès NGINX pour déterminer les informations essentielles sur les erreurs HTTP 431.
  2. Vérifiez les journaux d'accès NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    :ORG, ENV et PORT# sont remplacés par des valeurs réelles.

  3. Recherchez s'il existe des erreurs 431 pendant une durée spécifique (si le problème s'est produit par le passé) ou si des requêtes échouent toujours avec 431.
  4. Si vous trouvez des erreurs 431 avec le X-Apigee-fault-code correspondant à la valeur de X-Apigee-fault-code , déterminez la valeur de la source X-Apigee-fault-code .

    L'exemple d'entrée ci-dessus du journal d'accès NGINX contient les valeurs suivantes pour X-Apigee-fault-code et X-Apigee-fault-code :

    En-têtes de réponse Valeur
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source MP

    Notez la longueur de la requête: 40159 (40 Ko sont supérieurs à 25 Ko, il s'agit de la limite autorisée pour les en-têtes de requête dans Apigee Edge)

    Dans l'exemple d'entrée de journal ci-dessus, X-Apigee-fault-source a la valeur apigee ou MP, X-Apigee-fault-code a la valeur protocol.http.TooBigHeaders et la longueur de la requête est de 40 Ko, ce qui est supérieur à la limite autorisée dans Apigee : 25 Ko. Cela indique clairement que la taille totale de tous les en-têtes de requête envoyés par l'application cliente dans le cadre d'une requête HTTP a dépassé la limite autorisée de 25 Ko dans Apigee Edge.

Cause: la taille des en-têtes de requête dépasse la limite autorisée

Diagnostic

  1. Déterminez le code d'erreur, la source de l'erreur et la taille de la longueur de la requête de l'erreur observée à l'aide de l'API Monitoring ou des journaux d'accès NGINX, comme expliqué dans la section Étapes de diagnostic courantes.
  2. Si la source d'erreur a la valeur apigee ou MP, le code d'erreur a la valeur protocol.http.TooBigHeaders et la longueur de la requête est supérieure à 25 Ko, cela indique que la taille de la requête envoyée par l'application cliente à Apigee est supérieure à la limite autorisée dans Apigee Edge.
  3. Vous pouvez vérifier que la taille des en-têtes de requête dépasse la limite autorisée de 25 Ko en utilisant l'une des méthodes suivantes:

    Message d'erreur

    Pour valider à l'aide du message d'erreur:

    Si vous avez accès au message d'erreur complet reçu d'Apigee Edge, reportez-vous au faultstring. faultstring indique que la taille totale des en-têtes de requête a dépassé la limite autorisée de 25 Ko.

    Exemple de message d'erreur:

    "faultstring":"request headers size exceeding 25,600"
    

    Demande réelle

    Pour valider à l'aide de la requête réelle:

    Si vous avez accès à la requête réelle envoyée par l'application cliente, procédez comme suit:

    1. Vérifiez la taille des en-têtes transmis dans la requête.
    2. Si vous constatez que la taille totale des en-têtes dépasse la limite autorisée dans Apigee Edge, c'est la cause du problème.

      Exemple de requête:

      curl -v https://HOSTALIAS/test -H "header0: 000000000000000000……..000000<trimmed>" -H "header1: 111111111111111111……..111111<trimmed>" -H "header2: 222222222222222222……..222222<trimmed>"-H "header3: 333333333333333333……..333333<trimmed>"
      

      Dans le cas ci-dessus, la taille totale des en-têtes header0, header1, header2 et header3 est supérieure à 25 Ko, c'est-à-dire qu'elle contient plus de 25 000 caractères ASCII (octets).

      Si vous utilisez un autre client, vous pouvez consulter les journaux du client et essayer de connaître la taille de la ligne de requête envoyée à Apigee Edge.

    Journaux du processeur de messages

    Pour valider à l'aide des journaux du processeur de messages:

    Si vous êtes un utilisateur de cloud privé, vous pouvez utiliser les journaux du processeur de messages pour vérifier si la taille des en-têtes de requête dépasse la limite autorisée dans Apigee Edge.

    1. Vérifiez les journaux du processeur de messages:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. Recherchez s'il existe des erreurs 431 pendant une durée spécifique (si le problème s'est déjà produit par le passé) ou si des requêtes échouent toujours avec 431. Vous pouvez utiliser les chaînes de recherche suivantes.
      grep -ri "exceeding"
      
      grep -ri "RequestHeadersTooLarge"
      
    3. Vous verrez des lignes de system.log semblables à ce qui suit :
      2021-07-27 08:30:28,419  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() :
      Request:GET, uri:/test/, message Id:null,
      exception:com.apigee.errors.http.user.RequestHeadersTooLarge{
      code = protocol.http.TooBigHeaders, message = request headers size
      exceeding 25,600, associated contexts = []}, context:Context@9c5903
      input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.205.251:8443 Local:192.168.67.23:22188]@25130
      useCount=1 bytesRead=0 bytesWritten=15367 age=667062ms  lastIO=0ms
      isOpen=true)
      

      Le texte message = request headers size exceeding 25,600 dans le message d'erreur ci-dessus indique que la taille totale des en-têtes de requête est supérieure à 25 Ko. Par conséquent, Apigee Edge génère l'exception com.apigee.errors.http.user.RequestHeadersTooLarge et renvoie le code d'état 431 avec le code d'erreur protocol.http.TooBigHeaders aux applications clientes.

Résolution

Corriger la taille

Option 1 [recommandée]: corriger l'application cliente de sorte qu'elle n'envoie pas d'en-têtes de requêtes dont la taille totale dépasse la limite autorisée

  1. Analysez la raison pour laquelle le client spécifique envoie un en-tête de requête de grande taille, ce qui fait que la taille totale de l'en-tête dépasse la limite autorisée, telle que définie dans Limites.
  2. Si ce n'est pas ce que vous souhaitez, modifiez votre application cliente de sorte qu'elle envoie des en-têtes de requête dont la taille est inférieure à la limite autorisée.

    Dans l'exemple décrit ci-dessus, vous pouvez résoudre le problème en transmettant le paramètre de valeurs d'en-tête long dans le corps de la requête ou la charge utile:

    curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'
    
  3. Si vous souhaitez envoyer un en-tête supérieur à la limite autorisée, passez à l'option suivante.

CwC

Option 2 : Utiliser la propriété CwC pour augmenter le nombre maximal de lignes de requête

Apigee fournit une propriété CwC qui lui permet d'augmenter la taille maximale des lignes de requête. Pour en savoir plus, consultez Définir le nombre maximal de lignes de requête sur le processeur de messages.

Limites

Apigee s'attend à ce que l'application cliente et le serveur backend n'envoient pas d'en-têtes de requête/réponse dont la taille est supérieure à la limite autorisée telle qu'indiquée dans les limites d'en-tête de requête/réponse d'Apigee.

  1. Si vous êtes un utilisateur du cloud public, la limite maximale de taille des en-têtes de requête et de réponse est indiquée pour la taille de l'en-tête de requête/réponse dans les limites d'Apigee.
  2. Si vous êtes un utilisateur du cloud privé , vous avez peut-être modifié la limite maximale par défaut pour la taille des en-têtes de requête et de réponse (même si ce n'est pas une pratique recommandée). Pour déterminer la taille maximale de l'en-tête de requête, suivez les instructions de la section Vérifier la limite actuelle.

Comment vérifier la limite actuelle ?

Cette section explique comment vérifier que la propriété HTTPRequest.headers.limit a été mise à jour avec une nouvelle valeur sur les processeurs de messages.

  1. Sur la machine du processeur de messages, recherchez la propriété HTTPRequest.headers.limit dans le répertoire /opt/apigee/edge-message-processor/conf et vérifiez la valeur qui a été définie comme indiqué ci-dessous :
    grep -ri "HTTPRequest.headers.limit" /opt/apigee/edge-message-processor/conf
    
  2. L'exemple de résultat de la commande ci-dessus est le suivant :
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.headers.limit=25k
    
  3. Dans l'exemple de sortie ci-dessus, notez que la propriété HTTPRequest.headers.limit a été définie avec la valeur 25k dans http.properties.

    Cela indique que la taille de l'en-tête de requête configurée dans Apigee pour le cloud privé est limitée à 25 Ko.

Spécification

Apigee Edge s'attend à ce que l'application cliente n'envoie pas d'en-têtes de grande taille dans la requête. Si la requête contient des en-têtes dont la taille totale dépasse la limite spécifiée, Apigee génère une erreur 431 Request Header Fields Too Large conformément aux spécifications RFC suivantes:

Spécification
RFC 6585, section 5: 431 Request Header Fields Too Large (Champs d'en-tête de requête trop grands)

Si vous avez encore besoin d'aide de l'assistance Apigee, consultez la section Vous devez recueillir des informations de diagnostic.

Vous devez collecter des informations de diagnostic

Rassemblez les informations de diagnostic suivantes, puis contactez l'assistance Apigee Edge:

Si vous êtes un utilisateur de cloud public, fournissez les informations suivantes:

  • Le nom de l'organisation.
  • Nom de l'environnement
  • Nom du proxy d'API
  • Complétez la commande curl permettant de reproduire l'erreur 431.
  • Fichier de suivi des requêtes API

Si vous êtes un utilisateur du Private Cloud, fournissez les informations suivantes:

  • Message d'erreur complet observé pour les requêtes ayant échoué
  • Le nom de l'organisation.
  • Nom de l'environnement
  • Groupe de proxys d'API
  • Fichier de suivi des requêtes API ayant échoué
  • Complétez la commande curl permettant de reproduire l'erreur 431.
  • Journaux d'accès NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    :ORG, ENV et PORT# sont remplacés par des valeurs réelles.

  • Journaux système du processeur de messages /opt/apigee/var/log/edge-message-processor/logs/system.log