From a89e2272723878dc76aab68328cee507048dbf20 Mon Sep 17 00:00:00 2001 From: r-zakarya <82443831+r-zakarya@users.noreply.github.com> Date: Sat, 26 Sep 2026 13:12:02 +0100 Subject: [PATCH] fix(apk): verdict honnete de la verification, et plus de connexion reutilisee "unchanged (HTTP 0)" confondait "rien n'a change" et "je n'ai pas pu demander". Et quand le Wi-Fi se reconnecte avec une autre IP, la pile Java garde des sockets sur l'interface morte : mesure faite, curl atteint les deux adresses de GitHub depuis le shell du telephone pendant que l'application expire sur l'ancienne. Co-Authored-By: Claude Opus 5 --- android-client/PMA.SyncClient.pas | 6 ++++ mainApk.pas | 48 ++++++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/android-client/PMA.SyncClient.pas b/android-client/PMA.SyncClient.pas index 2c5a6d7..3336678 100644 --- a/android-client/PMA.SyncClient.pas +++ b/android-client/PMA.SyncClient.pas @@ -332,6 +332,7 @@ begin LHttp.ResponseTimeout := FTimeoutMs; LHttp.HandleRedirects := False; LHttp.UserAgent := 'PMServer'; // GitHub refuse toute requete sans + LHttp.CustomHeaders['Connection'] := 'close'; // voir Fetch LHttp.CustomHeaders['Authorization'] := 'token ' + FToken; LHttp.CustomHeaders['Content-Type'] := 'application/json'; // Deux essais, meme raison qu'a la lecture : un SYN perdu ne dit rien @@ -441,6 +442,11 @@ begin LHttp.ConnectionTimeout := FTimeoutMs; LHttp.ResponseTimeout := FTimeoutMs; LHttp.UserAgent := 'PMServer'; // GitHub refuse toute requete sans + // PAS DE CONNEXION REUTILISEE. Le telephone change de reseau (Wi-Fi qui + // se reconnecte, IP qui change) et la pile Java garde des sockets ouverts + // sur l'interface morte : la requete suivante attend son delai entier + // pour rien. Une poignee de main de plus coute bien moins que cela. + LHttp.CustomHeaders['Connection'] := 'close'; // Pas de redirection suivie : une redirection vers un autre hote nous // ferait envoyer le jeton ailleurs. LHttp.HandleRedirects := False; diff --git a/mainApk.pas b/mainApk.pas index 6f1d119..8b777cd 100644 --- a/mainApk.pas +++ b/mainApk.pas @@ -3987,10 +3987,26 @@ end; procedure TForm8.ProbeRemote; begin - if FBusy or (FUrl = '') or (FToken = '') then Exit; + // JOURNALISE MEME QUAND ELLE NE FAIT RIEN. Une verification muette ne se + // distingue pas d'une verification absente : on ne savait pas si le depot + // avait ete interroge, seulement qu'il n'avait rien dit. + if FBusy or (FUrl = '') or (FToken = '') then + begin + Log('check: skipped (busy or no repository configured)'); + Exit; + end; // Un coffre ne ici n'a pas de depot a interroger. - if HasLocalContainer then Exit; - if FETag = '' then Exit; + if HasLocalContainer then + begin + Log('check: skipped (local vault, no repository)'); + Exit; + end; + if FETag = '' then + begin + Log('check: skipped (no fingerprint to compare)'); + Exit; + end; + Log('check: asking the repository if it moved'); TThread.CreateAnonymousThread( procedure @@ -4006,10 +4022,29 @@ begin LGet := LClient.Fetch(FETag); LAhead := (LGet.Status = ssOK) and (LGet.ETag <> '') and not SameText(LGet.ETag.Trim, FETag.Trim); + // TROIS VERDICTS, PAS DEUX. "Rien n'a change" et "je n'ai pas pu + // demander" se ressemblent - le temoin reste eteint dans les deux + // cas - et le journal les confondait sous "unchanged (HTTP 0)". + TThread.Queue(nil, + procedure + begin + if LAhead then + Log(' it moved - sync to bring it in') + else if LGet.Status in [ssOK, ssNotModified] then + Log(Format(' unchanged (HTTP %d)', [LGet.HttpCode])) + else + Log(Format(' no answer (HTTP %d) %s', + [LGet.HttpCode, LGet.Error])); + end); except - // Hors reseau : ce n'est pas une nouvelle du depot, c'est une absence - // de nouvelle. Le temoin ne change pas. - Exit; + on E: Exception do + begin + // Hors reseau : ce n'est pas une nouvelle du depot, c'est une + // absence de nouvelle. Le temoin ne change pas, mais le journal le + // dit - sinon rien ne distingue "pas joignable" de "rien change". + TThread.Queue(nil, procedure begin Log(' not reachable'); end); + Exit; + end; end; finally LClient.Free; @@ -4019,7 +4054,6 @@ begin procedure begin if FRemoteAhead then Exit; // deja dit - Log('remote has moved - sync to bring it in'); SetRemoteAhead(True); end); end).Start;