400 Richiesta errata - DecompressionFailureAtRequest

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

Sintomo

L'applicazione client riceve un codice di stato HTTP 400 Bad Request con codice di errore messaging.adaptors.http.flow.DecompressionFailureAtRequest in risposta alle chiamate API.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 400 Bad Request

Inoltre, potrebbe essere visualizzato un messaggio di errore simile a quello mostrato di seguito:

{
   "fault":{
      "faultstring":"Decompression failure at request",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
      }
   }
}

Possibili cause

Questo errore si verifica solo se:

  • La codifica specificata nell'intestazione della richiesta HTTP Content-Encoding è valida e supportata da Apigee Edge,
  • MA

  • Il formato del payload inviato dal client come parte della richiesta HTTP non corrisponde al formato di codifica specificato nell'intestazione Content-Encoding

Questo perché Apigee Edge non riesce a decodificare il payload utilizzando la codifica specificata, poiché il formato del payload non ha lo stesso formato della codifica specificata nell'intestazione Content-Encoding.

Ecco alcuni esempi di valori Content-Encoding supportati e di come Apigee Edge prevede che sia il formato del payload in questi casi:

Scenario Content-Encoding Formato payload previsto
Codifica singola gzip

Il formato Unix gzip.

Consulta il formato GZIP RFC1952.

Codifica singola sgonfiare

Questo formato utilizza la struttura zlib con l'algoritmo di compressione deflate.

Consulta RFC1950 e RFC1951.

Codifica multipla

Codifica multipla

Ad esempio, nei casi in cui la codifica viene eseguita due volte, può essere:

  • gzip, sgonfiare
  • gzip, gzip
  • deflate, gzip
  • sgonfiare, sgonfiare
Più codifica applicata al payload nell'ordine specificato, così come appare nell'intestazione.

Le possibili cause di questo errore sono le seguenti:

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili a
Il formato del payload della richiesta non corrisponde alla codifica specificata nell'intestazione Content-Encoding Il formato del payload della richiesta inviato dal client non è codificato o non corrisponde alla codifica specificata nell'intestazione Content-Encoding. Utenti di cloud pubblico e privato perimetrale

Passaggi di diagnosi più comuni

Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:

Monitoraggio delle API

Per diagnosticare l'errore utilizzando il monitoraggio delle API:

  1. Accedi alla UI di Apigee Edge come utente con un ruolo appropriato.
  2. Passa all'organizzazione in cui vuoi esaminare il problema.

  3. Vai alla pagina Analizza > Monitoraggio API > Esamina.
  4. Seleziona il periodo di tempo specifico in cui hai riscontrato gli errori.
  5. Assicurati che il filtro Proxy sia impostato su Tutti.
  6. Traccia Codice di errore su Ora.
  7. Seleziona una cella con il codice di errore messaging.adaptors.http.flow.DecompressionFailureAtRequest come mostrato di seguito:

    ( visualizza immagine ingrandita)

  8. Le informazioni sul codice di errore messaging.adaptors.http.flow.DecompressionFailureAtRequest vengono visualizzate come mostrato di seguito:

    ( visualizza immagine ingrandita)

  9. Fai clic su Visualizza log ed espandi la riga in cui viene visualizzato l'errore 400.

    ( visualizza immagine ingrandita)

  10. Nella finestra Log, prendi nota dei seguenti dettagli:
    • Codice di stato: 400
    • Origine errore: proxy
    • Codice di errore: messaging.adaptors.http.flow.DecompressionFailureAtRequest.
  11. Se Origine dell'errore ha il valore proxy, significa che il formato del payload della richiesta non corrisponde alla codifica supportata specificata nell'intestazione Content-Encoding.

Strumento Traccia

Per diagnosticare l'errore utilizzando lo strumento Trace:

  1. Abilita la sessione di traccia e:
    1. Attendi che si verifichi l'errore 400 Bad Request oppure
    2. Se riesci a riprodurre il problema, effettua la chiamata API e riproduci 400 Bad Request.
  2. Assicurati che l'opzione Mostra tutte le FlowInfos sia abilitata:

  3. Seleziona una delle richieste non riuscite ed esamina la traccia.
  4. Naviga tra le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
  5. In genere, troverai l'errore in un flusso subito dopo la fase Richiesta ricevuta dal client, come mostrato di seguito:

    ( visualizza immagine ingrandita)

  6. Prendi nota dei valori delle proprietà della traccia:

    • errore: Decompression failure at request
    • error.class: com.apigee.rest.framework.BadRequestException
    • error.cause: Not in GZIP format

    error.cause indica che il payload della richiesta NON è in formato GZIP. Ciò significa che Apigee Edge prevedeva che il payload della richiesta fosse in formato GZIP, come sarebbe stato specificato nell'intestazione Content-Encoding.

  7. Determina il valore dell'intestazione della richiesta Content-Encoding. A questo scopo, vai alla fase Richiesta ricevuta dal client, come mostrato di seguito:

    ( visualizza immagine ingrandita)

    Tieni presente che il valore dell'intestazione della richiesta Content-Encoding è infatti gzip.

    La traccia di esempio precedente mostra che la codifica specificata nell'intestazione della richiesta Content-Encoding è gzip. Tuttavia, il payload della richiesta non è in formato GZIP. Di conseguenza, Apigee non può decomprimere il payload utilizzando gzip e restituisce l'errore Decompression failure at request.

  8. Prendi nota del codice di stato e del messaggio di errore restituiti da Apigee Edge, navigando

    alla fase Response sent to Client (Risposta inviata al client) nella traccia, come mostrato di seguito:

    ( visualizza immagine ingrandita)

    Prendi nota dei seguenti dettagli dalla traccia:

    • Codice di stato: 400 Bad Request.
    • Contenuto dell'errore: {"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
  9. Vai alla fase AX (Analytics Data Recorded) nella traccia e fai clic.

  10. Scorri verso il basso fino alla sezione Dettagli fase, Intestazioni degli errori e determina i valori di X-Apigee-fault-code e X-Apigee-fault-source come mostrato di seguito:

    ( visualizza immagine ingrandita)

  11. Vedrai i valori di X-Apigee-fault-code e X-Apigee-fault-source come messaging.adaptors.http.flow.DecompressionFailureAtRequest e policy, a indicare che il formato del payload della richiesta non corrispondeva alla codifica specificata nell'intestazione Content-Encoding.
    Intestazioni della risposta Valore
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

NGINX

Per diagnosticare l'errore utilizzando i log degli accessi di NGINX:

  1. Se sei un utente Private Cloud, puoi utilizzare i log degli accessi di NGINX per determinare le informazioni chiave sugli errori HTTP 400.
  2. Controlla i log degli accessi di NGINX:

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

    Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.

  3. Cerca per vedere se si sono verificati errori 400 durante un periodo di tempo specifico (se il problema si è verificato in passato) o se ci sono ancora richieste che continuano a non riuscire con 400.
  4. Se riscontri errori 400 con X-Apigee-fault-code corrispondente al valore di messaging.adaptors.http.flow.DecompressionFailureAtRequest, determina il valore di X-Apigee-fault-source.

    Esempio di errore 400 dal log degli accessi di NGINX:

    La voce di esempio sopra riportata dal log degli accessi di NGINX ha i seguenti valori per X-Apigee-fault-code e X-Apigee-fault-source:

    Intestazioni della risposta Valore
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

Causa: il formato del payload della richiesta non corrisponde alla codifica specificata nell'intestazione Content-Encoding

Per impostazione predefinita, Apigee Edge decomprime sempre il payload se l'intestazione della richiesta Content-Encoding contiene una codifica valida e supportata. Pertanto, si prevede che il formato del payload della richiesta dovrebbe corrispondere alla codifica specificata nell'intestazione della richiesta Content-Encoding. In caso di mancata corrispondenza, viene visualizzato questo errore.

Diagnostica

  1. Determina il codice di errore e l'origine dell'errore per l'errore osservato utilizzando API Monitoring, lo strumento Trace o i log degli accessi NGINX, come spiegato nella sezione Passaggi di diagnostica comuni.
  2. Se il Codice di errore è messaging.adaptors.http.flow.DecompressionFailureAtRequest e l'Origine dell'errore ha il valore policy o proxy, questo indica che la richiesta inviata dall'applicazione client ha un payload che non corrisponde alla codifica supportata specificata nell'intestazione della richiesta Content-Encoding.
  3. Puoi determinare la mancata corrispondenza nell'ambito della richiesta HTTP utilizzando uno dei seguenti metodi:

    Messaggio di errore

    Per eseguire la convalida utilizzando il messaggio di errore:

    1. Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, fai riferimento all'faultstring.

      Esempio di messaggio di errore:

      "faultstring":"Decompression failure at request"
      
    2. Nel messaggio di errore riportato sopra, viene visualizzato "Decompression failure at request", che implica che non è stato possibile decomprimere la richiesta utilizzando la codifica specificata nell'intestazione Content-Encoding.

    Traccia

    Per eseguire la convalida utilizzando Trace:

    1. Determina il valore dell'intestazione della richiesta Content-Encoding e della proprietà error.cause utilizzando Trace, come spiegato nei Passaggi comuni della diagnostica.
    2. I valori della traccia di esempio sono i seguenti:

      • Codifica dei contenuti: gzip
      • error.cause: Not in GZIP format

      Il valore nell'intestazione della richiesta Content-Encoding è gzip; tuttavia, il payload della richiesta non è in formato GZIP (come indicato da error.cause). Di conseguenza, Apigee Edge risponde con 400 Bad Request e il codice di errore messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    Richiesta effettiva

    Per eseguire la convalida utilizzando la richiesta effettiva:

    Se hai accesso alla richiesta effettiva effettuata dall'applicazione client, procedi nel seguente modo:

    1. Determina il valore passato all'intestazione della richiesta Content-Encoding.
    2. Determina il formato del payload inviato come parte della richiesta.
    3. Se il valore dell'intestazione Content-Encoding è nell'elenco della codifica supportata, ma il formato del payload della richiesta non corrisponde alla codifica specificata nell'intestazione Content-Encoding, questa è la causa del problema.

      Richiesta di esempio:

      curl -v "http://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.zip
      

      La richiesta di esempio precedente invia il valore gzip all'intestazione Content-Encoding, che è una codifica supportata in Apigee Edge. Tuttavia, il payload della richiesta request_payload.zip è in formato ZIP. Pertanto, questa richiesta ha esito negativo con un codice di stato 400 Bad Request e il codice di errore: messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    Log del processore di messaggi

    Per eseguire la convalida utilizzando i log del processore di messaggi:

    Se sei un utente Private Cloud, puoi utilizzare i log del processore di messaggi per determinare le informazioni chiave sugli errori HTTP 400.

    1. Determina l'ID messaggio della richiesta non riuscita utilizzando il monitoraggio delle API, lo strumento Trace o i log di accesso NGINX, come spiegato nella sezione Passaggi di diagnostica comuni.
    2. Cerca l'ID messaggio nel log del processore di messaggi:

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

    3. Troverai una delle seguenti eccezioni:

      Scenario n. 1

      Scenario 1: quando la richiesta API ha l'intestazione Content-Encoding: gzip

      2021-07-28 10:21:16,861  NIOThread@0 ERROR HTTP.SERVER -
      HTTPServer$Context.onInputException() : Message id:rt-57-1
      SSLClientChannel[Accepted: Remote:192.168.199.8:8443
      Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0
      bytesWritten=28764 age=2739893ms  lastIO=0ms
      isOpen=true.onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      
      2021-07-28 10:21:16,862  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:POST, uri:/test,
      message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format,
      context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1
      bytesRead=0 bytesWritten=28764 age=2739894ms  lastIO=0ms  isOpen=true)
      2021-07-28 10:21:16,862  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() :
      Exception java.util.zip.ZipException: Not in GZIP format occurred while writing
      to channel null
      2021-07-28 10:21:16,863  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: Not in GZIP format
      

      La riga java.util.zip.ZipException: Not in GZIP format nel messaggio di errore riportato sopra indica che il payload della richiesta non viene inviato in formato GZIP, sebbene Content-Encoding sia specificato come gzip. Di conseguenza, Apigee Edge genera l'eccezione e restituisce alle applicazioni client un codice di stato 400 con codice di errore messaging.adaptors.http.flow.DecompressionFailureAtRequest.

      Scenario 2

      Scenario 2: quando la richiesta API ha l'intestazione Content-Encoding: deflate

      2021-07-28 15:26:31,893  NIOThread@1 ERROR HTTP.SERVER -
      HTTPServer$Context.onInputException() : Message id:rt-47875-1
      SSLClientChannel[Accepted: Remote:192.168.199.8:8443
      Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0
      bytesWritten=37230 age=3498856ms  lastIO=1ms
      isOpen=true.onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
                        ….
      Caused by: java.util.zip.DataFormatException: incorrect header check
             ..
      2021-07-28 15:26:31,894  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:POST, uri:/test,
      message Id:rrt-47875-1, exception:java.util.zip.ZipException:
      incorrect header check, context:Context@69b3ac45
      input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276
      useCount=1 byt	esRead=0 bytesWritten=37230 age=3498856ms
      lastIO=1ms  isOpen=true)
      

      Le righe java.util.zip.ZipException: incorrect header check e Caused by: java.util.zip.DataFormatException: incorrect header check nel messaggio di errore precedente indicano che il payload della richiesta non viene inviato nel formato deflate e non corrisponde alla codifica specificata nell'intestazione Content-Encoding di deflate. Di conseguenza, Apigee Edge genera l'eccezione e restituisce alle applicazioni client un codice di stato 400 con codice di errore messaging.adaptors.http.flow.DecompressionFailureAtRequest.

Risoluzione

  1. Se non è necessario un payload di richiesta compresso nel flusso proxy API in Apigee Edge e nel server di backend, non passare l'intestazione Content-Encoding. Se è necessario comprimere il payload della richiesta, vai al passaggio 2.
  2. Assicurati che l'applicazione client invii sempre quanto segue:
    • Qualsiasi codifica supportata come valore per l'intestazione Content-Encoding nella richiesta
    • Il payload della richiesta nel formato supportato per Apigee Edge corrisponde al formato di codifica specificato nell'intestazione Content-Encoding
  3. Nell'esempio discusso sopra, il payload della richiesta è in formato ZIP, ma l'intestazione della richiesta specifica Content-Encoding: gzip. Puoi risolvere il problema inviando l'intestazione della richiesta come Content-Encoding: gzip e il payload della richiesta anch'esso in formato gzip:
    curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
    

Specifiche

Apigee Edge risponde con il codice di stato 400 Bad Request con il codice di errore messaging.adaptors.http.flow.DecompressionFailureAtRequest in base alle seguenti specifiche RFC:

Specifiche
RFC 7231, sezione 6.5.1
RFC 7231, sezione 3.1.2.2

Se hai ancora bisogno di aiuto dall'Assistenza Apigee, vai a È necessario raccogliere dati diagnostici.

Devi raccogliere dati diagnostici

Raccogli le seguenti informazioni diagnostiche e poi contatta l'assistenza Apigee Edge:

Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:

  • Nome dell'organizzazione.
  • Nome ambiente
  • Nome proxy API
  • Comando curl completo utilizzato per riprodurre l'errore 400
  • File di traccia per le richieste API

Se sei un utente Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome ambiente
  • Bundle del proxy API
  • File di traccia per le richieste API
  • Log degli accessi NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.

  • Log di sistema del processore di messaggi /opt/apigee/var/log/edge-message-processor/logs/system.log