Como evitar um erro 10053 (WSAECONNABORTED) se uma operação do HttpGet no Android durar muito tempo?
Eu tenho um aplicativo Android se comunicando com um aplicativo de serviço da Web Delphi 2006 usando o Indy 10 TIdHttpServer (vindo com o Delphi 2006). O aplicativo Delphi gera um grande arquivo XML e serve isso. A geração de XML pode durar mais de 5 minutos.
Se a duração deGenerateXml()
é mais do que cerca de 5 minutos (*), detecto um erro 10053 emTIdHTTPResponseInfo.WriteContent
se estiver executando no IDE do Delphi:
Socket Error # 10053 Software caused connection abort.
No entanto, no lado do Android nada é detectado e oHttpGet
-chama dura para sempre.
Minhas perguntas são:
1.) Por que recebo o erro 10053 e como posso evitá-lo? Parece que o Android expira a conexão, mashttp.socket.timeout
está definido para infinito.
e
2.) O que posso fazer para detectar tal erro no lado do cliente (além de definir o tempo limite, que teria que ser muito grande para ser útil)? Posso fazer algo em TIdHttpServer.OnException?
Aqui está o meu código. Android - função de download, que é executada dentro de um AsyncTask:
protected static HttpEntity downloadEntity(String url) throws IOException {
HttpClient client = new DefaultHttpClient();
//Check because of Error 10053: but timeout is null -> infinite
Log.d("TAG", "http.socket.timeout: " + client.getParams().getParameter("http.socket.timeout"));
HttpGet get = new HttpGet(url);
HttpResponse response;
try {
//in case of Error 10053 the following call seems to last forever (in PlainSocketImpl.read)
response = client.execute(get);
} catch (ClientProtocolException e) {
//...
}
//...
return response.getEntity();
}
Implementação do Delphi do TIdHttpServer.OnCommandGet:
procedure ServeXmlDoc(XmlDoc: IXMLDocument; ResponseInfo: TIdHTTPResponseInfo);
var
TempStream: TMemoryStream;
begin
ResponseInfo.ContentType := 'text/xml';
TempStream := TMemoryStream.Create;
XMLDoc.SaveToStream(TempStream);
ResponseInfo.FreeContentStream := True;
ResponseInfo.ContentStream := TempStream;
end;
procedure TMyService.HTTPServerCommandGet(AContext: TIdContext; RequestInfo: TIdHTTPRequestInfo;
ResponseInfo: TIdHTTPResponseInfo);
begin
Coinitialize(nil);
try
//...
ServeXmlDoc(GenerateXml(), ResponseInfo);
finally
CoUninitialize;
end;
end;
Editar: (*) Fiz testes adicionais e experimentei o erro, mesmo nos casos em que todo o processo teve uma duração inferior a 2 minutos.