From 24614d71ba2da940015251b0bde33246053d5e67 Mon Sep 17 00:00:00 2001 From: r-zakarya <82443831+r-zakarya@users.noreply.github.com> Date: Fri, 25 Sep 2026 17:29:37 +0100 Subject: [PATCH] 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 --- android-client/PMA.SyncClient.pas | 62 ++++++++++++++++++++----------- mainApk.pas | 6 +++ 2 files changed, 47 insertions(+), 21 deletions(-) diff --git a/android-client/PMA.SyncClient.pas b/android-client/PMA.SyncClient.pas index 8d33281..2c5a6d7 100644 --- a/android-client/PMA.SyncClient.pas +++ b/android-client/PMA.SyncClient.pas @@ -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']; diff --git a/mainApk.pas b/mainApk.pas index 62f224c..e708eef 100644 --- a/mainApk.pas +++ b/mainApk.pas @@ -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]);