Meu projeto Delphi 12 está usando o componente NetHTTPClient para baixar um arquivo de 2 GB.
O download progride rapidamente e sem interrupções, mas depois de 60 segundos (cerca de um terço do download) é gerada uma exceção dizendo que a conexão expirou.
Ajustei as três configurações de tempo (ResponseTimeout, SendTimeout e ConnectionTimeout) dos valores padrões de 60.000 (um minuto) para 600.000 e isso contornou o problema porque o download leva cerca de três minutos.
Como posso fazer com que ele só gere um tempo limite de conexão quando o tempo limite da conexão realmente expirar?
Na maioria das plataformas, o
ResponseTimeout
é o tempo máximo permitido para a conclusão de uma resposta. O padrão é 1 minuto. Ao defini-lo para 10 minutos, você estará dando tempo suficiente para a conclusão do download.O
ResponseTimeout
comportamento depende da plataforma em que seu código está sendo executado.No Windows,
TNetHTTPClient
usaWinHTTP
, e os documentos do MSDN dizem o seguinte para aWinHTTPSetTimeouts()
função:No Linux,
TNetHTTPClient
usaCurl
, e a documentação do Curl diz o seguinte para a opçãoCURLOPT_TIMEOUT
/ :CURLOPT_TIMEOUT_MS
Se
ResponseTimeout
for menor que 0,TNetHTTPClient
definirá aCURLOPT_TIMEOUT_MS
opção como 0, ou seja, infinita.No MacOS e no iOS,
TNetHTTPClient
usaURLSession
, e os documentos da Apple dizem o seguinte sobre aURLSessionConfiguration.timeoutIntervalForResource
propriedade:Se
ResponseTimeout
for menor que 0,TNetHTTPClient
definirátimeoutIntervalForResource
como 1 ano.No Android,
TNetHTTPClient
usaURLConnection
, e a documentação do Android Java diz o seguinte para oURLConnection.setReadTimeout()
método:Isso significa que,
ResponseTimeout
na verdade, há um tempo limite por byte, e não um tempo máximo de resposta, como em outras plataformas. Veja: Entendendo URLConnection.setReadTimeout() .Então, para responder à sua pergunta, se você definir o
ResponseTimeout
como<= 0
em todas as plataformas, o sistemaTNetHTTPClient
aguardará indefinidamente (ou quase isso) a conclusão da resposta. Mas, como você espera que o download seja concluído em 3 minutos, definir um tempo limite de 10 minutos é razoável.Regras semelhantes se aplicam à
ConnectTimeout
propriedade (tempo máximo para conectar ao servidor) eSendTimeout
à propriedade (tempo máximo para enviar uma solicitação) - exceto queTNetHTTPClient
não parece ser implementadoSendTimeout
para Android e Linux neste momento, apenas para Windows e MacOS/iOS.TNetHTTPClient
possui um eventoOnReceiveData
que permite saber se o servidor ainda está enviando dados regularmente. Para isso, você pode registrar a hora atual ao iniciar a solicitação e, a partir doOnReceiveData
evento, salvar a hora novamente e permitir que a transferência continue. Além disso, adicione um TTimer para verificar periodicamente o tempo salvo em relação à hora atual e determinar se algo foi recebido nesse meio tempo.Veja a documentação .