500 Erro interno do servidor - BadPath

Esta é a documentação do Apigee Edge.
Acesse Documentação da Apigee X.
informações

Sintoma

O aplicativo cliente recebe um código de status HTTP de 500 Internal Server Error com o código de erro protocol.http.BadPath como uma resposta para chamadas de API.

Mensagem de erro

O aplicativo cliente recebe o seguinte código de resposta:

HTTP/1.1 500 Internal Server Error

Além disso, você poderá encontrar a seguinte mensagem de erro:

{
   "fault":{
      "faultstring":"Invalid request path",
      "detail":{
         "errorcode":"protocol.http.BadPath"
      }
   }
}

Causas possíveis

Esse erro ocorrerá se o URL de solicitação do servidor de back-end, representado pela variável de fluxo target.url, contém uma path que começa com um ponto de interrogação (?) por uma barra (/), o que é inválido.

De acordo com as especificações Seção 3 do RFC 3986: componentes da sintaxe e RFC 3986, seção 3.3: caminho:

  1. A sintaxe de URI tem os seguintes componentes:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. O componente path é obrigatório e PRECISA começar com e sempre tenha uma barra (/).

Portanto, se o URL de solicitação do servidor de back-end tiver um componente path começando com um ponto de interrogação (?) em vez de uma barra (/), a Apigee O Edge responde com 500 Internal Server Error e um código de erro. protocol.http.BadPath.

Por exemplo: se target.url tiver o valor https://www.mocktarget.apigee.net?json, esse erro vai ocorrer à medida que path é inválido porque começa com um ponto de interrogação (?) em vez de uma barra (/).

Causa Descrição Instruções de solução de problemas aplicáveis para
O URL do servidor de back-end (target.url) tem um caminho inválido O componente do caminho no URL do servidor de back-end representado pela variável de fluxo target.url começa com um ponto de interrogação (?) em vez de um avanço (/). Usuários de nuvem pública e privada de borda

Etapas comuns do diagnóstico

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

Monitoramento de APIs

Procedimento no 1: como usar o monitoramento de APIs

Para diagnosticar o erro usando a API Monitoring:

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

  3. Navegue até o menu Analisar > Monitoramento de APIs > Investigar.
  4. Selecione o período específico em que você observou os erros.
  5. Compare Código de falha com Time.

  6. Selecione uma célula que tenha o código de falha protocol.http.BadPath, conforme mostrado abaixo:

  7. As informações sobre o código de falha protocol.http.BadPath são exibidas como mostrados abaixo:

  8. Clique em Ver registros e expanda a linha da solicitação com falha.

  9. Na janela Registros, observe os seguintes detalhes:
    • Código de status: 500
    • Origem da falha: target
    • Código da falha:protocol.http.BadPath
  10. Se a Origem da falha for target e o Código da falha for protocol.http.BadPath, isso indica que o URL do servidor de back-end tem um caminho inválido.

Trace

Procedimento no 2: como usar a ferramenta Trace

Para diagnosticar o erro usando a ferramenta Trace:

  1. Ative a sessão de rastreamento e
    • Aguarde a ocorrência do erro 500 Internal Server Error ou
    • Se você puder reproduzir o problema, faça a chamada de API para reproduzir o problema 500 Internal Server Error
  2. Verifique se Mostrar todos os FlowInfos está ativado:

  3. Selecione uma das solicitações com falha e examine o trace.
  4. Navegar pelas diferentes fases do trace e localizar onde a falha ocorreu.
  5. Normalmente, o erro está em um fluxo após o início do fluxo de solicitação de destino . fase, conforme mostrado abaixo:

  6. Observe o valor do erro no trace:

    error: Caminho da solicitação inválido

    Como o erro é gerado pelo Apigee Edge após o fluxo de solicitação de destino iniciado indica que o URL do servidor de back-end tem um caminho inválido. Isso provavelmente acontecerá se a variável de fluxo target.url (que representa o URL para o servidor de back-end) no Apigee Edge possivelmente foi atualizado com um caminho inválido por meio de uma das políticas no fluxo de solicitações de destino.

  7. Examine a seção Variáveis lidas e atribuídas em cada fluxo de trás para frente do fluxo de erro para a fase Fluxo de solicitação de destino iniciado.
  8. Determine a política em que a variável de fluxo target.url estava atualizado em:

    Exemplo de trace mostrando que a política JavaScript atualizou a variável de fluxo target.url:

    No trace de amostra mostrado acima, observe o valor da variável de fluxo target.url foi atualizado em uma política de JavaScript chamada JS- SetTargetURL da seguinte maneira: target.url : https://mocktarget.apigee.net?json

  9. O valor em target.url tem estes componentes:
    • esquema: https
    • autoridade: mocktarget.apigee.net
    • caminho: ?json
  10. Como o componente path começa com um ponto de interrogação (?) em vez de uma barra (/), você recebe o erro Invalid request path.
  11. Navegue até a fase AX (dados do Analytics registrados) no trace e clique nela.
  12. Role para baixo até a seção Detalhes da fase - Cabeçalhos de erro e determine as de X-Apigee-fault-code e X-Apigee-fault-source, conforme mostrado abaixo:

  13. Você vai encontrar os valores de X-Apigee-fault-code e X-Apigee-fault-source como protocol.http.BadPath e target , respectivamente, indicando que esse erro foi causado porque o URL do servidor de back-end tem um caminho inválido.

    Cabeçalhos de resposta Valor
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

NGINX

Procedimento no 3: como usar registros de acesso do NGINX

Para diagnosticar o erro usando 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 o 500 Internal Server Error do HTTP.
  2. Verifique os registros de acesso do NGINX:

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

  3. Pesquise se há algum erro 500 com o código de erro. protocol.http.BadPath durante um período específico (se o problema tiver acontecido no anterior) ou se ainda há solicitações falhando com 500.
  4. Se você encontrar erros 500 com a correspondência X-Apigee-fault-code o valor de protocol.http.BadPath, depois determine o valor da expressão X- Apigee-fault-source.

    Exemplo de erro 500 do registro de acesso do NGINX:

    O exemplo de entrada do registro de acesso do NGINX acima tem os seguintes valores para X-Apigee- código de falha e X-Apigee-fault-source:

    Cabeçalhos Valor
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

    Os valores de X-Apigee-fault-code e X-Apigee-fault-source são protocol.http.BadPath e target , respectivamente, indicando que esse erro é causado porque o URL do servidor de back-end tem um caminho inválido.

Causa: o URL do servidor de back-end (target.url) tem um caminho inválido

Diagnóstico

  1. Determine o código da falha e a origem da falha do 500 Internal Server Error usando os registros de acesso do API Monitoring, da ferramenta Trace ou do NGINX, conforme explicado em Etapas comuns de diagnóstico.
  2. Se o Código da falha for protocol.http.BadPath e a Origem da falha tiver o valor target, isso indica que o URL do servidor de back-end tem um objeto invalid caminho de conversão.
  3. O URL do servidor de back-end é representado pela variável de fluxo target.url na Apigee Borda Esse erro normalmente acontece quando você tenta atualizar o URL do servidor de back-end. (target.url) dinamicamente usando qualquer uma das políticas (dentro de proxy/fluxo compartilhado) no fluxo de solicitação de destino, de modo que ele tenha um caminho inválido.

  4. Determine se a variável de fluxo target.url realmente tem um erro inválido path e a origem do valor usando um dos seguintes métodos:

    Trace

    Como usar a ferramenta Trace

    Se você capturou um rastro para esse erro, use as etapas explicadas em Usar a ferramenta Trace e

    1. Verifique se target.url tem um caminho inválido, ou seja, se ele começa com um ponto de interrogação (?) em vez de uma barra (/).
    2. Em caso afirmativo, descubra a política que modificou ou atualizou o valor de target.url conter um caminho inválido.

      Exemplo de trace mostrando que a política JavaScript atualizou a variável de fluxo target.url

    3. No trace de amostra acima, observe que a política de JavaScript modificou ou atualizou o valor de target.url para conter um caminho inválido.
    4. O target.url tem estes componentes:
      • esquema: https
      • autoridade: mocktarget.apigee.net
      • caminho: ?json

      O caminho começa com um ponto de interrogação (?) em vez de um barra (/), portanto, é inválida.

    Registros

    Como usar registros no servidor de registros

    1. Se não houver rastreamento para esse erro (um problema intermitente), verifique se você registrou as informações sobre o valor da variável de fluxo target.url, com o uso de políticas como MessageLogging ou Service callout ao seu servidor de registros.
    2. Se você tiver os registros, revise-os
      1. Verifique se target.url tem um caminho inválido.
      2. Veja se é possível determinar as informações sobre qual política foi modificada target.url deve conter um caminho inválido

    Proxy de API

    Como analisar o proxy de API com falha

    Se você não tiver um trace ou registros para esse erro, revise a API com falha proxy para determinar o que modificou ou atualizou a variável de fluxo target.url conter um caminho inválido. Verifique os seguintes itens:

    • A política no proxy de API
    • Quaisquer fluxos compartilhados invocados do proxy
  5. Examine cuidadosamente a política específica (por exemplo: AssignMessage ou JavaScript) que modifica ou atualiza a variável de fluxo target.url e determina a causa atualizando target.url para ter um caminho inválido.

    Confira alguns exemplos de políticas que atualizam a variável de fluxo target.url para conter um caminho inválido que leva a esse erro.

    Amostra 1

    Exemplo 1: política de JavaScript atualizando a variável target.url

    var url = "https://mocktarget.apigee.net?json"
    context.setVariable("target.url", url);
    

    No exemplo acima, a variável de fluxo target.url é atualizada com o valor https://mocktarget.apigee.net?json contido em outro variável url.

    O valor de url tem estes componentes:

    • esquema: https
    • autoridade: mocktarget.apigee.net
    • caminho: ?json

    O caminho começa com um ponto de interrogação (?) em vez de uma barra (/), que é inválida. Assim, o Apigee Edge retorna 500 Internal Server Error com o código de erro protocol.http.BadPath.

    Amostra 2

    Exemplo 2: política de JavaScript atualizando a variável target.url com base no valor do cabeçalho da solicitação

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    No exemplo acima, observe que a variável de fluxo target.url foi atualizada concatenando o valor https://mocktarget.apigee.net contido em um url e o valor de outra variável path, cujo valor é recuperado de request.header.Path.

    Se você tiver acesso à solicitação ou ao trace real, poderá verificar o valor real transmitido para request.header.Path.

    Exemplo de solicitação feita pelo usuário

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
    

    Neste exemplo, o caminho do cabeçalho não é enviado como parte da solicitação. Portanto, o valor da variável path na política JavaScript é null.

    Então:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + "?user"
    • target.url = https://mocktarget.apigee.net?user

    O valor de target.url tem estes componentes:

    • esquema: https
    • autoridade: mocktarget.apigee.net
    • caminho: ?user

    O caminho começa com um ponto de interrogação (?) em vez de uma barra (/), que é inválida. Portanto, a Apigee Edge retorna 500 Internal Server Error com o código de erro protocol.http.BadPath.

    Amostra 3

    Exemplo 3: política AttributionMessage atualizando a variável target.url

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net?echo</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    Observe que o valor de url tem os seguintes componentes:

    • esquema: https
    • autoridade: mocktarget.apigee.net
    • caminho: ?echo

    Novamente neste exemplo, o caminho começa com um ponto de interrogação (?). em vez de uma barra (/), que é inválida. Portanto, O Apigee Edge retorna 500 Internal Server Error com código de erro protocol.http.BadPath.

Resolução

De acordo com a especificação do URL RFC 3986, seção 3: componentes de sintaxe, o componente path é obrigatório. e PRECISA sempre começar com "/". Siga as etapas abaixo para corrigir esse problema:

  1. Verifique se o URL do servidor de back-end, representado pela variável de fluxo target.url sempre tem um caminho válido e sempre começa com um (/).
    1. Em alguns casos, pode não haver um nome de recurso no caminho, então certifique-se de que o o caminho tenha pelo menos uma barra (/).
    2. Se você usa outras variáveis para determinar o valor da variável de fluxo target.url e, em seguida, verifique se outras variáveis não têm um caminho inválido.
    3. Se você executar qualquer operação de string para determinar o valor da variável de fluxo target.url, depois verifique se o resultado ou resultado da string operações não têm um caminho inválido.
  2. Nos exemplos discutidos acima, você pode corrigir esse problema conforme explicado abaixo:

    Amostra 1

    Exemplo 1: política de JavaScript atualizando a variável target.url

    Use uma barra (/) em vez de um ponto de interrogação (?) na url para corrigir esse problema, conforme mostrado abaixo:

    var url = "https://mocktarget.apigee.net/json"
    context.setVariable("target.url", url);
    

    Amostra 2

    Exemplo 2: política de JavaScript atualizando a variável target.url com base no valor do cabeçalho da solicitação

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    Verifique se você está transmitindo um caminho válido, por exemplo: /user como parte da solicitação cabeçalho Path para corrigir esse problema, conforme mostrado abaixo:

    Exemplo de solicitação:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
    

    Amostra 3

    Exemplo 3: política AttributionMessage atualizando a variável target.url

    Adicione um caminho válido no elemento <Value> da políticaAssignMessage. Ou seja, substitua o ponto de interrogação (?) por um barra (/) no elemento <Value> e defina-o como https://mocktarget.apigee.net/echo para corrigir esse problema, conforme mostrado abaixo:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/echo</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    Especificação

    O Apigee Edge espera que o path componente no URL do servidor de back-end PRECISA sempre começar com uma barra (/) da seguinte forma: especificações:

    Especificação
    Seção 3 do RFC 3986: componentes da sintaxe
    RFC 3986, seção 3.3: caminho

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

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

    Se o problema persistir mesmo depois de seguir as instruções acima, colete as seguintes informações: 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 da API
    • Comando curl completo usado para reproduzir o 500 Internal Server Error com o código de erro protocol.http.BadPath
    • Arquivo de rastreamento para as solicitações de API

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

    • Mensagem de erro completa observada para as solicitações com falha
    • Nome do ambiente
    • Pacote de proxy de API
    • Arquivo de rastreamento para as solicitações de 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

    Referências

    Variáveis de fluxo: destino