502 Gateway inválido - DecompressionFailureAtResponse

Você está vendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
informações

Sintoma

O aplicativo cliente recebe um código de status HTTP de 502 Bad Gateway com código de erro messaging.adaptors.http.flow.DecompressionFailureAtResponse como resposta a chamadas de API.

Mensagem de erro

O aplicativo cliente recebe este código de resposta:

HTTP/1.1 502 Bad Gateway

Além disso, talvez você veja uma mensagem de erro semelhante à mostrada abaixo:

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

Causas possíveis

Esse erro só ocorrerá se:

  • A codificação especificada no cabeçalho da resposta HTTP (do servidor de back-end/destino) Content-Encoding é válida e aceita pelo Apigee Edge.
  • MAS

  • O formato do payload enviado pelo servidor de back-end/destino como parte da resposta HTTP não corresponde ao formato de codificação especificado no cabeçalho Content-Encoding

Isso ocorre porque o Apigee Edge não consegue decodificar o payload usando a codificação especificada, porque o formato do payload não está no mesmo formato que a codificação especificada no cabeçalho Content-Encoding.

Veja alguns exemplos de valores Content-Encoding aceitos e como o Apigee Edge espera que a representação do payload seja nesses casos:

Cenário Content-Encoding Representação de payload
Codificação única gzip

O formato Unix gzip.

Consulte Formato RFC1952 GZIP.

Codificação única diminuir

Esse formato usa a estrutura zlib com o algoritmo de compressão de desinflar.

Consulte RFC1950 e RFC1951.

Codificação múltipla

Codificação múltipla

Por exemplo, nos casos em que a codificação é feita duas vezes, ela pode ser:

  • gzip, desinflar
  • gzip, gzip
  • deflar, gzip
  • deflar, deflar
Codificação múltipla aplicada ao payload na ordem determinada, conforme aparece no cabeçalho.

As possíveis causas para esse erro são as seguintes:

Causa Descrição Instruções de solução de problemas aplicáveis para
O formato do payload da resposta não corresponde ao Content-Encoding O formato do payload de resposta enviado pelo servidor de back-end/destino não está codificado ou não corresponde à codificação especificada no cabeçalho Content-Encoding. Usuários de nuvens públicas e privadas de borda

Etapas comuns do diagnóstico

Use uma das seguintes ferramentas/técnicas para diagnosticar esse erro:

Monitoramento de APIs

Para diagnosticar o erro usando o monitoramento de APIs:

  1. Faça login na interface do Apigee Edge como usuário com um papel apropriado.
  2. Alterne para a organização em que você quer investigar o problema.

  3. Navegue até a página Analisar > Monitoramento de API > Investigar.
  4. Selecione o período específico em que você observou os erros.
  5. Verifique se o filtro Proxy está definido como Todos.
  6. Trace o Código de falha em relação a Time.
  7. Selecione uma célula com o código de falha messaging.adaptors.http.flow.DecompressionFailureAtResponse, conforme mostrado abaixo:

    ( ver imagem ampliada)

  8. As informações sobre o código de falha messaging.adaptors.http.flow.DecompressionFailureAtResponse são mostradas conforme mostrado abaixo:

    ( ver imagem ampliada)

  9. Clique em Ver registros e expanda a linha que falha com o erro 502.

    ( ver imagem ampliada)

  10. Na janela Registros, observe os seguintes detalhes:
    • Código de status: 502
    • Origem da falha: target
    • Código de falha: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. Se a origem da falha tiver o valor target, isso indica que o formato do payload da resposta não corresponde à codificação compatível especificada no cabeçalho de resposta do servidor de back-end Content-Encoding.

Ferramenta de rastreamento

Para diagnosticar o erro usando a ferramenta Trace:

  1. Ative a sessão de rastreamento e:
    1. Aguarde a ocorrência do erro 502 Bad Gateway ou
    2. Se você conseguir reproduzir o problema, faça a chamada de API e reproduza 502 Bad Gateway.
  2. Verifique se a opção Mostrar todos os FlowInfos está ativada:

  3. Selecione uma das respostas com falha e examine o rastro.
  4. Navegue pelas diferentes fases do rastro e localize onde a falha ocorreu.
  5. Normalmente, você encontra o erro em um fluxo logo após a fase Resposta recebida do servidor de destino, conforme mostrado abaixo:

    ( ver imagem ampliada)

  6. Observe os valores das propriedades do trace:

    • Content-Encoding:gzip
    • Corpo do conteúdo de resposta: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Navegue para a fase de erro logo após a fase Resposta recebida do servidor de destino:

    ( ver imagem ampliada)

    Observe as propriedades:

    • erro: Decompression failure at response
    • error.class::com.apigee.errors.http.server.BadGateway
    • error.cause: Not in GZIP format

      O error.cause declara que o payload da resposta não está no formato GZIP. Isso significa que o Apigee Edge esperava que o payload de resposta estivesse no formato GZIP, como especificado no cabeçalho Content-Encoding (determinado na etapa anterior).Portanto, o Apigee Edge não pode descompactar o payload usando gzip e retorna o erro Decompression failure at response.

    Observe que a resposta do servidor de destino/back-end é 200 neste caso. No entanto, o aplicativo cliente receberá uma resposta 502 porque o erro é retornado pelo Apigee Edge.

  8. Navegue para a fase Resposta enviada ao cliente no trace e clique nela.

    ( ver imagem ampliada)

    Observe os seguintes detalhes do trace:

    • Código de status: 502 Bad Gateway.
    • Conteúdo do erro: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. Navegue até a fase AX (Dados do Analytics registrados) no rastro e clique nela.

  10. Role para baixo até a seção Phase Details, Error Headers e determine os valores de X-Apigee-fault-code e X-Apigee-fault-source, conforme mostrado abaixo:

    ( ver imagem ampliada)

  11. Você verá os valores de X-Apigee-fault-code e X-Apigee-fault-source como messaging.adaptors.http.flow.DecompressionFailureAtResponse e target, indicando que o formato do payload da resposta não corresponde à codificação especificada no cabeçalho Content-Encoding.
    Cabeçalhos de resposta Valor
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

NGINX

Para diagnosticar o erro usando os registros de acesso do NGINX:

  1. Se você for um usuário da nuvem privada, poderá usar os registros de acesso do NGINX para determinar as principais informações sobre os erros HTTP 502.
  2. Verifique os registros de acesso do NGINX:

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

    Onde:ORG, ENV e PORT# são substituídos por valores reais.

  3. Pesquise se há erros 502 durante um período específico (se o problema ocorreu anteriormente) ou se ainda há respostas com falha com 502.
  4. Se você encontrar erros 502 com o X-Apigee-fault-code correspondente ao valor de messaging.adaptors.http.flow.DecompressionFailureAtResponse, determine o valor de X-Apigee-fault-source.

    Exemplo de erro 502 do registro de acesso do NGINX:

    A entrada de amostra acima do registro de acesso do NGINX tem os seguintes valores para X-Apigee-fault-code e X-Apigee-fault-code :

    Cabeçalhos de resposta Valor
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

Causa: o formato do payload da resposta não corresponde ao Content-Encoding

Por padrão, o Apigee Edge sempre descompacta o payload se o cabeçalho de resposta Content-Encoding contiver uma codificação compatível. Portanto, espera-se que o formato do payload de resposta corresponda à codificação especificada no cabeçalho de resposta Content-Encoding. Se houver uma incompatibilidade, você vai receber esse erro.

Diagnóstico

  1. Determine o código de falha e a origem da falha do erro observado usando o monitoramento da API, a ferramenta de rastreamento ou os registros de acesso do NGINX, conforme explicado nas etapas comuns de diagnóstico.
  2. Se o código de falha for messaging.adaptors.http.flow.DecompressionFailureAtResponse e a Origem de falha tiver o valor target, isso indica que o formato do payload de resposta enviado pelo servidor de back-end/destino não corresponde à codificação compatível especificada no cabeçalho de resposta Content-Encoding.
  3. É possível determinar a incompatibilidade como parte da resposta HTTP usando um dos seguintes métodos:

    Mensagem de erro

    Para validar usando a mensagem de erro, siga estas etapas:

    1. Se você tiver acesso à mensagem de erro completa recebida do Apigee Edge, consulte faultstring.

      Exemplo de mensagem de erro:

      "faultstring":"Decompression failure at response"
      
    2. Na mensagem de erro acima, ele exibe "Decompression failure at response", o que significa que não foi possível descompactar a resposta usando a codificação especificada no cabeçalho Content-Encoding.

    Trace

    Para validar usando o Trace:

    1. Determine o Content-Type e o error.causa usando o Trace, conforme explicado em Etapas comuns de diagnóstico.
    2. Os valores do trace de amostra são os seguintes:

      • Content-Encoding:gzip
      • error.cause: Not in GZIP format

      O valor no cabeçalho de resposta Content-Encoding é gzip. No entanto, o payload da resposta não está no formato GZIP (conforme indicado por error.causa). Portanto, o Apigee Edge responde com 502 Bad Gateway e o código de erro messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Solicitação real

    Para validar usando a solicitação real, faça o seguinte:

    Se você tiver acesso à solicitação real feita ao aplicativo do servidor de destino/back-end, execute as seguintes etapas:

    1. Se você for um usuário da nuvem pública/privada, faça uma solicitação diretamente ao servidor de back-end a partir do próprio servidor de back-end ou de qualquer outra máquina de onde você tenha permissão para fazer a solicitação ao servidor de back-end.
    2. Se você for um usuário da nuvem privada, também poderá fazer a solicitação ao servidor de back-end a partir de um dos processadores de mensagens.
    3. Analise a resposta enviada pelo servidor de back-end e determine o valor transmitido no cabeçalho de resposta Content-Encoding.
    4. Determine o formato do payload enviado como parte da solicitação.
    5. Se o valor do cabeçalho Content-Encoding estiver na lista de codificação com suporte, mas o formato do payload de resposta não corresponder à codificação especificada no cabeçalho Content-Encoding, essa será a causa do problema.

      Exemplo:

      curl -v https://HOSTALIAS/test
      

      ***trimmed***
      >
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Encoding: gzip
      < Date: Mon, 02 Aug 2021 08:17:35 GMT
      < Transfer-Encoding: chunked
      <
      < response_payload.zip Response Body(not in GZIP format)>
      

      A resposta de amostra acima envia o valor gzip para o cabeçalho Content-Encoding, que é uma codificação compatível no Apigee Edge. No entanto, o response_payload.zip é enviado como um arquivo ZIP. Portanto, essa resposta falha com um erro 502 Bad Gateway com o código do erro: messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Registros do processador de mensagens

    Para validar usando os registros do processador de mensagens:

    Se você for um usuário de nuvem privada, poderá usar os registros do processador de mensagens para determinar as principais informações sobre erros HTTP 502.

    1. Verifique o registro do processador de mensagens:

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

    2. Pesquise se há erros 502 durante um período específico (se o problema ocorreu anteriormente) ou se há respostas ainda falhando com 502. Use a seguinte string de pesquisa:

      grep -ri "ZipException"
      
    3. Você encontrará linhas do system.log parecidas com estas:

      Cenário 1

      Cenário 1: quando a resposta da API tem o cabeçalho Content-Encoding: gzip

      2021-08-02 06:50:25,433  NIOThread@2 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0
      bytesWritten=203 age=469ms  lastIO=0ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      ---trimmed--
      2021-08-02 06:50:25,433  NIOThread@2 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details : host=null
      path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:50:25,434  NIOThread@2 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format)
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: Not in GZIP format
      occurred while writing to channel null
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: Not in GZIP format
      

      A linha java.util.zip.ZipException: Not in GZIP format na mensagem de erro acima indica que o payload da resposta não é enviado no formato GZIP, embora Content-Encoding seja especificado como gzip. Portanto, o Apigee Edge gera a exceção e retorna um código de status 502 com código de falha messaging.adaptors.http.flow.DecompressionFailureAtResponse para aplicativos clientes.

      Cenário 2

      Cenário 2: quando a resposta da API tem o cabeçalho Content-Encoding: deflate

      2021-08-02 06:35:21,215  NIOThread@0 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0
      bytesWritten=202 age=439ms  lastIO=2ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
      ---trimmed----
      Caused by:
      java.util.zip.DataFormatException: incorrect header check
      ---trimmed---
      2021-08-02 06:35:21,215  NIOThread@0 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details :
      host=null path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:35:21,216  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277,
      incorrect header check)
      2021-08-02 06:35:21,216  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: incorrect header check occurred while writing to channel null
      2021-08-02 06:35:21,217  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: incorrect header check
      
      

      As linhas java.util.zip.ZipException: incorrect header check e Caused by: java.util.zip.DataFormatException: incorrect header check na mensagem de erro acima indicam que o payload da resposta não é enviado no formato de desinflação e não corresponde à codificação especificada no cabeçalho Content-Encoding de desinflação. Portanto, o Apigee Edge gera a exceção e retorna um código de status 502 com código de falha messaging.adaptors.http.flow.DecompressionFailureAtResponse para aplicativos clientes.

Resolução

  1. Se não houver necessidade do payload de resposta compactada no fluxo do proxy de API na Apigee Edge e no servidor de back-end, não transmita o cabeçalho Content-Encoding. Se for necessário compactar o payload da resposta, vá para a etapa 2.
  2. Se for necessário compactar o payload de resposta, verifique se o servidor de back-end sempre envia o seguinte:
    • Qualquer uma das codificação compatíveis como o valor do cabeçalho Content-Encoding na resposta
    • O payload de resposta no formato compatível para o Apigee Edge corresponde ao formato de codificação especificado no cabeçalho Content-Encoding
  3. No exemplo discutido acima, o payload de resposta está no formato ZIP, mas o cabeçalho de resposta especifica Content-Encoding: gzip. Para corrigir o problema, envie o cabeçalho da resposta como Content-Encoding: gzip e o payload da resposta no formato gzip:
    curl -v https://HOSTALIAS/v1/test
    
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Encoding: gzip
    < Date: Mon, 02 Aug 2021 08:17:35 GMT
    < Transfer-Encoding: chunked
    <
    < response_payload.gz Response Body(in GZIP format)>
    

Especificação

O Apigee Edge responde com o código de status 502 Bad Gateway com código de erro messaging.adaptors.http.flow.DecompressionFailureAtResponse de acordo com as seguintes especificações de RFC:

Especificação
RFC 7231, seção 6.5.1
RFC 7231, seção 3.1.2.2

Se você ainda precisar de ajuda do suporte da Apigee, acesse É necessário coletar informações de diagnóstico.

É necessário coletar informações de diagnóstico

Reúna as seguintes informações de diagnóstico e entre em contato com o suporte do Apigee Edge:

Se você for um usuário da nuvem pública, forneça as seguintes informações:

  • Nome da organização
  • Nome do ambiente
  • Nome do proxy de API
  • Completar o comando curl usado para reproduzir o erro 502
  • Arquivo de rastreamento das respostas da API

Se você for um usuário da nuvem privada, forneça as seguintes informações:

  • Mensagem de erro completa observada para as respostas com falha
  • Nome do ambiente
  • Pacote de proxy de API
  • Arquivo de rastreamento das respostas da API
  • Registros de acesso do NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Onde:ORG, ENV e PORT# são substituídos por valores reais.

  • Registros do sistema do processador de mensagens /opt/apigee/var/log/edge-message-processor/logs/system.log