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.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';
|
||||||
try
|
// Deux essais, meme raison qu'a la lecture : un SYN perdu ne dit rien
|
||||||
LResp := LHttp.Put(FBaseUrl, LReq, LResync);
|
// du serveur. Le corps est renvoye depuis le debut a chaque essai.
|
||||||
except
|
LResp := nil;
|
||||||
on E: Exception do
|
for var LTry := 1 to 2 do
|
||||||
begin
|
begin
|
||||||
Result.Status := ssNetworkError;
|
try
|
||||||
Result.Error := E.ClassName + ': ' + E.Message;
|
LReq.Position := 0;
|
||||||
Exit;
|
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;
|
||||||
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
|
||||||
try
|
LResp := nil;
|
||||||
LResp := LHttp.Get(FBaseUrl, LStream);
|
for var LTry := 1 to 2 do
|
||||||
except
|
begin
|
||||||
on E: Exception do
|
try
|
||||||
begin
|
LResp := LHttp.Get(FBaseUrl, LStream);
|
||||||
Result.Status := ssNetworkError;
|
Break;
|
||||||
Result.Error := E.ClassName + ': ' + E.Message;
|
except
|
||||||
Exit;
|
on E: Exception do
|
||||||
|
begin
|
||||||
|
Result.Status := ssNetworkError;
|
||||||
|
Result.Error := E.ClassName + ': ' + E.Message;
|
||||||
|
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'];
|
||||||
|
|||||||
@@ -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]);
|
||||||
|
|||||||
Reference in New Issue
Block a user