500 Erro interno do servidor - EmptyPath

Você está lendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
info

Sintoma

O aplicativo cliente recebe um código de status HTTP 500 Internal Server Error com o código de erro protocol.http.EmptyPath como 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ê pode receber a seguinte mensagem de erro:

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

Causas possíveis

Esse erro ocorre se o URL de solicitação do servidor de back-end, representado pela variável de fluxo target.url, contiver um caminho vazio.

De acordo com as especificações RFC 3986, seção 3: componentes de 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 SEMPRE precisa ter uma barra (/), mesmo que não haja outros caracteres como parte do caminho.

Portanto, se o URL da solicitação do servidor de back-end não tiver o componente path, ou seja, não tiver uma barra (/), o Apigee Edge vai responder com 500 Internal Server Error e o código de erro protocol.http.EmptyPath.

Por exemplo, se o target.url tiver o valor https://www.mocktarget.apigee.net, esse erro vai ocorrer porque o componente path está vazio ou ausente.

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 vazio O URL do servidor de back-end representado pela variável de fluxo target.url tem um caminho vazio. Usuários da nuvem pública e privada do Edge

Etapas comuns do diagnóstico

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

Monitoramento de APIs

Procedimento 1: usar o API Monitoring

Para diagnosticar o erro usando o API Monitoring:

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

  3. Acesse a página Analisar > Monitoramento de APIs > Investigar.
  4. Selecione o período específico em que você observou os erros.
  5. Crie um gráfico com Código de falha e Tempo.

  6. Selecione uma célula com o código de falha protocol.http.EmptyPath, conforme mostrado abaixo:

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

  8. Clique em Ver registros para expandir 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 de falha:protocol.http.EmptyPath
  10. Se a Origem da falha for target e o Código da falha for protocol.http.EmptyPath, isso indica que o URL do servidor de back-end tem um caminho vazio.

Trace

Procedimento 2: usar a ferramenta Trace

Para diagnosticar o erro usando a ferramenta Trace:

  1. Ative a sessão de rastreamento e uma das seguintes opções:
    • Aguarde o erro 500 Internal Server Error ocorrer ou
    • Se for possível reproduzir o problema, faça a chamada de API para reproduzir o problema 500 Internal Server Error
  2. Verifique se a opção Mostrar todos os FlowInfos está ativada:

  3. Selecione uma das solicitações com falha e examine o rastreamento.
  4. Navegue pelas diferentes fases do rastreamento e localize onde a falha ocorreu.
  5. Normalmente, o erro aparece em um fluxo após a fase Fluxo de solicitação de destino iniciado, conforme mostrado abaixo:

  6. Anote o valor do erro no rastreamento.

    error: Request path cannot be empty

    Como o erro é gerado pelo Apigee Edge após a fase Fluxo de solicitação de destino iniciado, ele indica que o path no URL do servidor de back-end está vazio. Isso provavelmente vai acontecer se a variável de fluxo target.url (que representa o URL do servidor de back-end) tiver sido atualizada com um caminho vazio por uma das políticas no fluxo de solicitação.

  7. Examine a seção Variáveis lidas e atribuídas em cada um dos fluxos de trás para frente, do ponto de erro até a fase Fluxo de solicitação de destino iniciado.
  8. Determine a política em que a variável de fluxo target.url é atualizada.

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

    No exemplo de rastreamento mostrado acima, observe que o valor da variável de fluxo target.url é atualizado em uma política JavaScript chamada SetTargetURL da seguinte maneira:

    target.url : https://mocktarget.apigee.net
  9. A target.url tem os seguintes componentes:
    • scheme: https://mocktarget.apigee.net
    • path: vazio
  10. Portanto, você recebe o erro Request path cannot be empty.
  11. Navegue até a fase AX (dados do Analytics registrados) no rastreamento e clique nela.
  12. Role a tela para baixo até a seção Detalhes da fase - Cabeçalhos de erro e determine os valores de X-Apigee-fault-code e X-Apigee-fault-source, conforme mostrado abaixo:

  13. Você vai ver os valores de X-Apigee-fault-code e X-Apigee-fault-source como protocol.http.EmptyPath e target , respectivamente, indicando que esse erro é causado porque o URL do servidor de back-end tem um caminho vazio.
    Cabeçalhos de resposta Valor
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

Procedimento 3: usar registros de acesso do NGINX

Para diagnosticar o erro usando registros de acesso do NGINX:

  1. Se você for um usuário do Private Cloud, poderá usar os registros de acesso do NGINX para determinar as principais informações sobre 500 Internal Server Error HTTP.
  2. Verifique os registros de acesso do NGINX:

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

  3. Pesquise para ver se há erros 500 com o código de erro protocol.http.EmptyPath durante um período específico (se o problema aconteceu no passado) ou se ainda há solicitações com falha 500.
  4. Se você encontrar erros de 500 com o X-Apigee-fault-code correspondente ao valor de protocol.http.EmptyPath, determine o valor de X-Apigee-fault-source.

    Exemplo de erro 500 do registro de acesso do NGINX:

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

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

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

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

Diagnóstico

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

  4. Determine se a variável de fluxo target.url realmente tem um caminho vazio e a origem do valor dela usando uma destas etapas:

    Trace

    Como usar a ferramenta Trace

    Se você capturou um trace desse erro, siga as etapas explicadas em Como usar a ferramenta Trace e:

    1. Verifique se target.url tem um caminho vazio.
    2. Se sim, descubra qual política modificou ou atualizou o valor de target.url para conter um caminho vazio.

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

    3. No rastreamento de amostra acima, observe que a política do JavaScript modificou ou atualizou o valor de target.url para conter um caminho vazio.
    4. O target.url tem os seguintes componentes:
      • scheme: https://mocktarget.apigee.net
      • path: vazio

    Registros

    Como usar registros no servidor de registros

    1. Se você não tiver um rastreamento para esse erro (um problema intermitente), verifique se registrou as informações sobre o valor da variável de fluxo target.url usando políticas como MessageLogging ou ServiceCallout no servidor de registros.
    2. Se você tiver os registros, analise-os e:
      1. Verifique se target.url tem um caminho vazio e
      2. Determine qual política modificou target.url para conter um caminho vazio.

    Proxy de API

    Analisar o proxy de API com falha

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

    • A política no proxy de API
    • Todos os fluxos compartilhados invocados do proxy
  5. Examine a política específica (por exemplo, AssignMessage ou JavaScript) que modifica ou atualiza a variável de fluxo target.url com cuidado e determine a causa da atualização de target.url para ter um caminho vazio.

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

    Exemplo 1

    Exemplo 1: atualização da política de JavaScript da variável target.url

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

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

    O target.url tem os seguintes componentes:

    • scheme: https://mocktarget.apigee.net
    • path: vazio

    Como o caminho está vazio, o Apigee Edge retorna 500 Internal Server Error com o código de erro protocol.http.EmptyPath.

    Exemplo 2

    Exemplo 2: atualização da política de JavaScript da variável target.url

    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 é atualizada concatenando o valor https://mocktarget.apigee.net contido em uma variável url e o valor de outra variável path, que é recuperado de request.header.Path..

    Se você tiver acesso à solicitação ou ao rastreamento 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>
    

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

    Então:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    A target.url tem os seguintes componentes:

    • scheme: https://mocktarget.apigee.netnull
    • path: vazio

    Exemplo 3

    Exemplo 3: política AssignMessage atualizando a variável target.url por outra variável

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

    A target.url tem os seguintes componentes:

    • scheme: https://mocktarget.apigee.net
    • path: vazio

    Em todos os exemplos acima, o caminho no URL do servidor de back-end, ou seja, target.url está vazio. Portanto, o Apigee Edge retorna 500 Internal Server Error com o código de erro protocol.http.EmptyPath.

Resolução

De acordo com a especificação RFC 3986, seção 2: componentes de sintaxe, o componente path é obrigatório e sempre precisa ter uma barra (/) no final, mesmo que não haja outros caracteres como parte do path. Siga estas etapas para corrigir o problema:

  1. Verifique se o URL do servidor de back-end, representado pela variável de fluxo target.url, sempre tem um caminho não vazio.
    1. Em alguns casos, talvez não haja um nome de recurso no caminho. Nesse caso, verifique se o caminho tem pelo menos uma barra (/).
    2. Se você usar outras variáveis para determinar o valor da variável de fluxo target.url, verifique se elas não têm um caminho vazio.
    3. Se você realizar operações de string para determinar o valor da variável de fluxo target.url, verifique se o resultado ou o resultado das operações de string não tem um caminho vazio.
  2. Nos exemplos discutidos em Diagnóstico, é possível corrigir esse problema conforme explicado abaixo:

    Exemplo 1

    Exemplo 1: atualização da política de JavaScript da variável target.url

    Adicione uma barra (/) à variável url para corrigir esse problema, conforme mostrado abaixo:

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

    Exemplo 2

    Exemplo 2: atualização da política de JavaScript da variável target.url

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

    Transmita um caminho válido, por exemplo, /iloveapis como parte do cabeçalho da solicitação 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: /iloveapis"
    

    Exemplo 3

    Exemplo nº 3: política AssignMessage atualizando a variável target.url por outra variável

    Adicione um caminho válido no elemento <Value> da política AssignMessage. Por exemplo, você pode ter /json como o caminho para a API MockTarget. Ou seja, modifique o elemento <Value> para https://mocktarget.apigee.net/json, 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/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>

Especificação

O Apigee Edge espera que o URL do servidor de back-end não tenha um caminho vazio, de acordo com as seguintes especificações:

Especificação
RFC 3986, seção 3: componentes de sintaxe
RFC 3986, seção 3.3: caminho

Se você ainda precisar de ajuda do suporte da Apigee, acesse Precisa de 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, 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
  • Comando curl completo usado para reproduzir o 500 Internal Server Error com o código de erro protocol.http.EmptyPath
  • Arquivo de rastreamento para as solicitações de API

Se você for um usuário da nuvem privada, forneça as seguintes 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

    Em que: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