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
+27 -7
View File
@@ -334,16 +334,26 @@ begin
LHttp.UserAgent := 'PMServer'; // GitHub refuse toute requete sans LHttp.UserAgent := 'PMServer'; // GitHub refuse toute requete sans
LHttp.CustomHeaders['Authorization'] := 'token ' + FToken; LHttp.CustomHeaders['Authorization'] := 'token ' + FToken;
LHttp.CustomHeaders['Content-Type'] := 'application/json'; LHttp.CustomHeaders['Content-Type'] := 'application/json';
// 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 try
LReq.Position := 0;
LResync.Clear;
LResp := LHttp.Put(FBaseUrl, LReq, LResync); LResp := LHttp.Put(FBaseUrl, LReq, LResync);
Break;
except except
on E: Exception do on E: Exception do
begin begin
Result.Status := ssNetworkError; Result.Status := ssNetworkError;
Result.Error := E.ClassName + ': ' + E.Message; Result.Error := E.ClassName + ': ' + E.Message;
Exit; if LTry = 2 then Exit;
end; end;
end; end;
end;
if LResp = nil then Exit;
Result.HttpCode := LResp.StatusCode; Result.HttpCode := LResp.StatusCode;
case LResp.StatusCode of case LResp.StatusCode of
200, 201: 200, 201:
@@ -395,11 +405,14 @@ begin
inherited Create; inherited Create;
FBaseUrl := ABaseUrl.Trim; FBaseUrl := ABaseUrl.Trim;
FToken := AToken.Trim; FToken := AToken.Trim;
// 15 s ne suffisaient pas a GitHub depuis un telephone en mobile ou en // 15 s ne suffisaient pas a GitHub depuis ce telephone : un simple 404 a ete
// Wi-Fi charge : un simple 404 a ete mesure a 16,3 s, donc la requete // mesure a 16,3 s. Mais allonger seul ne suffit pas - mesure aussi : depuis
// s'abandonnait juste avant la reponse et la synchro rendait "HTTP 0" une // le shell du meme telephone, le ping passe et le port 443 s'ouvre tout de
// fois sur deux. Le delai ne coute rien quand le reseau repond vite. // suite, alors que la requete de l'application expire. Le lien perd des
FTimeoutMs := 40000; // 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; end;
function TSyncClient.Fetch(const AKnownETag: string): TSyncResult; function TSyncClient.Fetch(const AKnownETag: string): TSyncResult;
@@ -447,16 +460,23 @@ begin
LStream := TStringStream.Create('', TEncoding.UTF8); LStream := TStringStream.Create('', TEncoding.UTF8);
try try
LResp := nil;
for var LTry := 1 to 2 do
begin
try try
LResp := LHttp.Get(FBaseUrl, LStream); LResp := LHttp.Get(FBaseUrl, LStream);
Break;
except except
on E: Exception do on E: Exception do
begin begin
Result.Status := ssNetworkError; Result.Status := ssNetworkError;
Result.Error := E.ClassName + ': ' + E.Message; Result.Error := E.ClassName + ': ' + E.Message;
Exit; if LTry = 2 then Exit;
LStream.Clear;
end; end;
end; end;
end;
if LResp = nil then Exit;
Result.HttpCode := LResp.StatusCode; Result.HttpCode := LResp.StatusCode;
Result.ETag := LResp.HeaderValue['ETag']; 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 // Le depot est reste ou nous l'avions laisse : rien a fondre, il
// ne manque que notre publication. // ne manque que notre publication.
FETag := LGet.ETag 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 else
begin begin
LErr := Format('read failed (HTTP %d) %s', [LGet.HttpCode, LGet.Error]); LErr := Format('read failed (HTTP %d) %s', [LGet.HttpCode, LGet.Error]);