fix(apk): depot vide = creation, et deux essais reseau au lieu d'un long

404 a la lecture pendant une publication etait traite comme un echec : sur un
depot neuf, rien ne partait jamais. Sans sha, l'API des contenus cree le
fichier. Et le lien Wi-Fi de ce telephone perd des paquets (ping 71-236 ms
alors que le port 443 s'ouvre depuis le shell) : deux essais de 20 s valent
mieux qu'une attente unique de 40 s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-25 17:29:37 +01:00
parent 329588dc1c
commit 24614d71ba
2 changed files with 47 additions and 21 deletions
+41 -21
View File
@@ -334,16 +334,26 @@ begin
LHttp.UserAgent := 'PMServer'; // GitHub refuse toute requete sans
LHttp.CustomHeaders['Authorization'] := 'token ' + FToken;
LHttp.CustomHeaders['Content-Type'] := 'application/json';
try
LResp := LHttp.Put(FBaseUrl, LReq, LResync);
except
on E: Exception do
begin
Result.Status := ssNetworkError;
Result.Error := E.ClassName + ': ' + E.Message;
Exit;
// Deux essais, meme raison qu'a la lecture : un SYN perdu ne dit rien
// du serveur. Le corps est renvoye depuis le debut a chaque essai.
LResp := nil;
for var LTry := 1 to 2 do
begin
try
LReq.Position := 0;
LResync.Clear;
LResp := LHttp.Put(FBaseUrl, LReq, LResync);
Break;
except
on E: Exception do
begin
Result.Status := ssNetworkError;
Result.Error := E.ClassName + ': ' + E.Message;
if LTry = 2 then Exit;
end;
end;
end;
if LResp = nil then Exit;
Result.HttpCode := LResp.StatusCode;
case LResp.StatusCode of
200, 201:
@@ -395,11 +405,14 @@ begin
inherited Create;
FBaseUrl := ABaseUrl.Trim;
FToken := AToken.Trim;
// 15 s ne suffisaient pas a GitHub depuis un telephone en mobile ou en
// Wi-Fi charge : un simple 404 a ete mesure a 16,3 s, donc la requete
// s'abandonnait juste avant la reponse et la synchro rendait "HTTP 0" une
// fois sur deux. Le delai ne coute rien quand le reseau repond vite.
FTimeoutMs := 40000;
// 15 s ne suffisaient pas a GitHub depuis ce telephone : un simple 404 a ete
// mesure a 16,3 s. Mais allonger seul ne suffit pas - mesure aussi : depuis
// le shell du meme telephone, le ping passe et le port 443 s'ouvre tout de
// suite, alors que la requete de l'application expire. Le lien perd des
// paquets (ping 71 a 236 ms), et c'est le SYN qui se perd. D'ou DEUX essais
// courts plutot qu'une seule longue attente, et un total qui reste sous le
// garde-fou de 50 s de l'ecran.
FTimeoutMs := 20000;
end;
function TSyncClient.Fetch(const AKnownETag: string): TSyncResult;
@@ -447,16 +460,23 @@ begin
LStream := TStringStream.Create('', TEncoding.UTF8);
try
try
LResp := LHttp.Get(FBaseUrl, LStream);
except
on E: Exception do
begin
Result.Status := ssNetworkError;
Result.Error := E.ClassName + ': ' + E.Message;
Exit;
LResp := nil;
for var LTry := 1 to 2 do
begin
try
LResp := LHttp.Get(FBaseUrl, LStream);
Break;
except
on E: Exception do
begin
Result.Status := ssNetworkError;
Result.Error := E.ClassName + ': ' + E.Message;
if LTry = 2 then Exit;
LStream.Clear;
end;
end;
end;
if LResp = nil then Exit;
Result.HttpCode := LResp.StatusCode;
Result.ETag := LResp.HeaderValue['ETag'];
+6
View File
@@ -1387,6 +1387,12 @@ begin
// Le depot est reste ou nous l'avions laisse : rien a fondre, il
// ne manque que notre publication.
FETag := LGet.ETag
else if LGet.Status = ssNoSnapshot then
// DEPOT VIDE : c'est une creation, pas un echec. Sans sha, l'API
// des contenus cree le fichier ; avec un sha inconnu d'elle, elle
// refuserait. On publiait donc "read failed (HTTP 404)" en boucle
// sur un depot neuf, et rien ne partait jamais.
FETag := ''
else
begin
LErr := Format('read failed (HTTP %d) %s', [LGet.HttpCode, LGet.Error]);