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

Vous consultez la documentation Apigee Edge.
Accédez à la documentation**Apigee X**.
info

Problème constaté

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

Message d'erreur

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

HTTP/1.1 431 Request Header Fields Too Large

Vous pouvez également observer le message d'erreur suivant :

{
   "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 de la 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 à Apigee Edge est supérieure à la limite autorisée dans Apigee Edge. Utilisateurs d'Edge Public Cloud et Private Cloud

Étapes de diagnostic courantes

Utilisez l'un des outils/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 d'un rôle approprié.
  2. Basculez vers l'organisation dans laquelle vous souhaitez examiner le problème.

  3. Accédez à la page Analyze > API Monitoring > Investigate (Analyser > Surveillance des API > Examiner).
  4. Sélectionnez la période spécifique pendant laquelle vous avez observé les erreurs.
  5. Tracez le code d'erreur par rapport au temps.
  6. Sélectionnez une cellule contenant le code d'erreur protocol.http.TooBigHeaders et le code d'état 431, comme illustré ci-dessous :

    ( Agrandir l'image)

  7. Les informations sur le code d'erreur protocol.http.TooBigHeaders s'affichent, comme illustré ci-dessous :

    ( Agrandir l'image)

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

    ( Agrandir l'image)

  9. Dans la fenêtre Logs (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(en octets) 32150 (> 25 KB)
  10. Si la source de l'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 de la requête HTTP est supérieure à la limite autorisée dans Apigee.

Outil Trace

NGINX

Pour diagnostiquer l'erreur à l'aide des journaux d'accès NGINX :

  1. Si vous êtes un utilisateur de Private Cloud, vous pouvez utiliser les journaux d'accès NGINX pour déterminer les informations clés 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

    Où : 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 dans 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 protocol.http.TooBigHeaders, déterminez la valeur de la X-Apigee-fault-source.

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

    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 est supérieur à 25 Ko, la limite autorisée pour les en-têtes de requête dans Apigee Edge)

    Dans l'entrée de journal d'exemple ci-dessus, la X-Apigee-fault-source a la valeur apigee ou MP, la 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 de la 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 est supérieure à 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 pour l' erreur observée à l'aide de la surveillance des API ou des journaux d'accès NGINX, comme expliqué dans les Étapes de diagnostic courantes.
  2. Si la source de l'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 a dépassé la limite autorisée de 25 Ko à l'aide de l'une des méthodes suivantes :

    Message d'erreur

    Pour effectuer la validation à l'aide du message d'erreur :

    Si vous avez accès au message d'erreur complet reçu d'Apigee Edge, alors consultez le faultstring. Le 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"

    Requête réelle

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

    Si vous avez accès à la requête réelle effectué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 est supérieure à la limite autorisée dans Apigee Edge, il s'agit de 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 déterminer la taille de la ligne de requête envoyée à Apigee Edge.

    Journaux du processeur de messages

    Pour effectuer la validation à l'aide des journaux du processeur de messages :

    Si vous êtes un utilisateur de Private Cloud, vous pouvez utiliser les journaux du processeur de messages pour vérifier si la taille des en-têtes de requête a dépassé 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 produit dans 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 trouverez des lignes de system.log semblables à celles-ci :
      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.

Solution

Taille fixe

Option 1 [recommandée]: Corrigez l'application cliente pour qu'elle n'envoie pas d'en-têtes de requête dont la taille totale est supérieure à 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, comme défini dans la section Limites.
  2. Si ce n'est pas souhaitable, modifiez votre application cliente afin qu'elle envoie des en-têtes de requête d'une taille inférieure à la limite autorisée.

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

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

CwC

Option 2 : Utilisez la propriété CwC pour augmenter la limite de la ligne de requête

Apigee fournit une propriété CwC qui lui permet d'augmenter la limite de taille de la ligne de requête. Pour en savoir plus, consultez Définir la limite de la ligne 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, comme indiqué dans la section Limite de taille des en-têtes de requête/réponse dans les limites d'Apigee Edge.

  1. Si vous êtes un utilisateur de Public Cloud, la limite maximale pour la taille des en-têtes de requête et de réponse est celle indiquée pour la taille des en-têtes de requête/réponse dans les limites d'Apigee Edge.
  2. Si vous êtes un utilisateur de Private Cloud, 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). Vous pouvez déterminer la limite maximale de taille des en-têtes de requête en suivant les instructions de la section Comment 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 définie, comme illustré 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 résultat 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 limite de taille des en-têtes de requête configurée dans Apigee pour Private Cloud est de 25 Ko.

Spécification

Apigee Edge s'attend à ce que l'application cliente n'envoie pas d'en-têtes de grande taille dans le cadre de la requête. Si la requête contient des en-têtes dont la taille totale est supérieure à la limite spécifiée, Apigee génère 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 (en anglais)

Si vous avez encore besoin d'aide de la part de l'assistance Apigee, consultez la section Vous devez collecter 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 Public Cloud, fournissez les informations suivantes :

  • Nom de l'organisation
  • Nom de l'environnement
  • Nom du proxy d'API
  • Commande curl complète utilisée pour reproduire l'erreur 431
  • Fichier de trace pour les requêtes API

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

  • Message d'erreur complet observé pour les requêtes ayant échoué
  • Nom de l'organisation
  • Nom de l'environnement
  • Bundle de proxy d'API
  • Fichier de trace pour les requêtes API ayant échoué
  • Commande curl complète utilisée pour reproduire l'erreur 431
  • Journaux d'accès NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Où : 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