Enrola o erro de retorno 52 ou 56 com a chamada da API REST com mais de 5 minutos

1

Então eu tenho tentado descobrir isso por cerca de uma semana agora. Aqui está a situação:

Eu uso o CURL em PHP para extrair dados de uma API. À medida que a resposta à chamada da API aumenta (obtendo mais de 15 mil registros de uma vez), notei que qualquer chamada de API que leva 5 ou mais minutos (em poucos segundos) não retorna nos servidores CentOS e Suse. Então, eu testei a chamada da API da CLI via CURL e recebo o mesmo problema. Estranhamente, se eu executar o comando CURL via OS X, o comando é executado corretamente e retorna após ~ 7 ou mais minutos.

Aqui está o comando (creds censurado) Estou correndo via CURL:

curl -m 0 -k --trace-ascii trace.txt --trace-time -X GET -H "tenant-code: 1cmPx7tqVDVTdN1GSelwycFUmICmASnLCmNQsV72" -H "Authorization: Basic JxHAsXeUiHMRkS8Msiu6pWb3PvY20p6am3QvXCY3knXTAntlxTBS3EyEDgly" -H "Content-Type: application/json" -H "Cache-Control: no-cache" 'https://api.endpoint.com/API/v1/system/users/search?groupid=555' > dump.txt

E aqui está a saída da versão da CURL para cada plataforma:

CentOS (isso é onde eu realmente preciso que isso funcione) -

curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 

Suse -

curl 7.19.7 (x86_64-suse-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8j zlib/1.2.7 libidn/1.10
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

OS X -

curl 7.37.1 (x86_64-apple-darwin14.0) libcurl/7.37.1 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM NTLM_WB SSL libz 

E estes são os códigos de erro que recebo do Centos:

curl: (56) SSL read: errno -5961

Não consigo encontrar o código mencionado na documentação. link

Recebo um erro ligeiramente diferente do Suse:

curl: (52) SSL read: error:00000000:lib(0):func(0):reason(0), errno 104

O erro 104 me leva a acreditar que o servidor está parando / redefinindo a conexão, mas os logs do lado do servidor não mostram que ele está sendo descartado e o OS X pode extrair os dados sem um problema. Eu até tentei falsificar o agente do usuário para ter certeza de que esse não era o problema.

Então, neste ponto, presumo que o pacote SSL SecureTransport esteja fazendo algo que o OpenSSL e o NSS não estão fazendo. A questão é o que e se não, qual é o problema?

    
por Hybrid 14.08.2015 / 18:54

1 resposta

2

Execute o comando curl na máquina MacOSX, mas não redirecione a saída, deixe-a transmitir para a janela do seu shell. Preste atenção para ver se parece haver algum buffer envolvido, ou seja, você obtém a saída desde o início, um pouco de cada vez, ou você não obtém nada por 5 minutos e depois uma enxurrada de dados de uma vez?

Execute o comando curl novamente em uma máquina em que ele expira e compare o comportamento. Se a sua saída estiver sendo armazenada em buffer por algum processo em segundo plano no servidor de API, você poderá não obter resultados até que conclua sua consulta. Algo entre seu aplicativo cliente, o sistema operacional do seu cliente, o sistema operacional do servidor, a API REST do servidor e o SSL entre eles provavelmente tem um valor de tempo limite diferente de zero e, se esse cronômetro não vir nenhum fluxo de dados por cinco minutos, pode fechar sua conexão sem dizer muito sobre o motivo. Eu vejo isso acontecer muito em serviços baseados em HTTP. Em perl, costumo colocar um $|=1; no topo do código para desativar o buffer de saída no lado do servidor.

Também é possível que um dispositivo de terceiros, como um Cisco ASA, possa ter regras de tempo limite e problemas de acionamento. Eu tenho esse problema com backups AMANDA que estão tentando ler de um cliente no lado externo de um ASA. Se o cliente demorar muito para retornar suas estimativas de tamanho através do ASA de volta ao servidor AMANDA, o ASA descartará sua regra de NAT dinâmica e o backup falhará. Vale a pena investigar essa sugestão se o MacOSX que funciona não tiver um firewall entre ele e o servidor da API, mas os que falharem têm um.

Não me surpreenderia se o MacOSX tivesse um valor de tempo limite definido em algum lugar como 0 (espere para sempre), onde o Linux usa como padrão algo com um limite de 60 ou 90 segundos.

    
por 14.08.2015 / 19:16