Regarde enfin les écrans s'afficher, et trouve ce que 618 tests taisaient

La 7ᵉ série s'était close sur un aveu : aucun écran n'avait été regardé.
Balayage des vingt-deux routes à 320, 375 et 1280 px. Les huit lots tiennent
leurs promesses ; trois défauts en sortent, qu'aucun test ne pouvait voir.

L'arbre des séries débordait de 8 px à 320 px : sa ligne est elle-même un
élément de flex, et « min-width: auto » lui interdisait de rétrécir. C'est
mot pour mot la leçon du lot M, non appliquée à cet étage de la cascade.

L'ISBN à tirets faisait défiler toute la fiche — 395 px pour un écran de 320.
« white-space: nowrap » y annulait le « word-break » dont le dd est muni
justement pour cela. Le défaut de CSS était déjà le bon comportement : une
ligne quand il y a la place, une coupure au tiret sinon.

Le troisième est le sérieux : le relais de couvertures rendait 404 une fois
sur trois sur une couverture qui existe. archive.org extrait l'image d'un ZIP
à la volée et met 5 à 15 s, le délai coupait à 10. Rien n'était alors mis en
cache, donc CORS puis relais se rejouaient à chaque affichage — le défaut même
que ce relais existe pour corriger. Un 404 ne prouve rien ici, par
construction : le relais répond 404 à tout refus pour ne pas être un oracle.
Il a désormais son propre délai, personne n'attendant derrière un cache qui
se remplit en tâche de fond.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-21 17:44:00 +02:00
co-authored by Claude Opus 5
parent d7ea12ddbf
commit 323b50676b
4 changed files with 139 additions and 7 deletions
+14 -1
View File
@@ -36,6 +36,19 @@ builder.Services.AddScoped<IFournisseurUtilisateur, FournisseurUtilisateurSsowat
// Timeout court : une source lente ne doit pas bloquer la cascade, l'appelant bascule sur la suivante.
var timeoutSources = TimeSpan.FromSeconds(10);
// ⚠️ Le relais de couvertures a son PROPRE délai, et bien plus long. Ce n'est pas une largesse :
// les deux appels n'ont pas le même témoin. Un lookup ISBN fait patienter quelqu'un devant un
// formulaire — d'où les 10 s ci-dessus, et la bascule sur la source suivante. Le relais, lui,
// remplit un cache en tâche de fond : personne n'attend derrière, et abandonner ne fait pas
// gagner du temps, cela perd la couverture.
//
// Mesuré le 2026-08-21 : les couvertures OpenLibrary aboutissent sur `archive.org`, qui les
// EXTRAIT D'UNE ARCHIVE ZIP à la volée et met 5 à 15 s. À 10 s, le relais répondait 404 une fois
// sur trois — indistinguable, pour l'appelant, d'une URL inconnue. L'image n'était alors jamais
// mise en cache, et le client rejouait CORS puis relais à CHAQUE affichage : exactement le
// défaut que ce relais existe pour corriger.
var timeoutRelaisCouvertures = TimeSpan.FromSeconds(30);
builder.Services.AddHttpClient<IBnfClient, BnfClient>(http =>
{
http.BaseAddress = new Uri(BnfClient.UrlBase);
@@ -67,7 +80,7 @@ builder.Services.AddScoped<IIsbnLookupService, IsbnLookupService>();
// le SSRF.
builder.Services.AddHttpClient<IServiceCouvertures, ServiceCouvertures>(http =>
{
http.Timeout = timeoutSources;
http.Timeout = timeoutRelaisCouvertures;
http.DefaultRequestHeaders.UserAgent.ParseAdd("MaBibli/0.1 (bibliotheque personnelle auto-hebergee)");
})
.ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler