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:
@@ -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'];
|
||||
|
||||
@@ -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]);
|
||||
|
||||
Reference in New Issue
Block a user