103 Early Hints
Utilisation
Lorsqu’un serveur envoie 103 Early Hints, le client interprète les en-têtes Link et précharge les ressources indiquées. C’est particulièrement utile lorsque le serveur a besoin de temps pour traiter la requête avant d’assembler la réponse finale. Pendant que le serveur travaille, le client met ce temps à profit pour charger les feuilles de style, les images ou les scripts dont la page finale a besoin.
Remarque
Plusieurs réponses 103 Early Hints sont envoyées en amont de la réponse HTTP finale.
Les indications ne sont pas des garanties
Dans tout système reposant sur la prédiction, la précision varie. Lorsqu’un serveur renvoie 103 Early Hints en suggérant au client de récupérer certaines ressources, cette suggestion repose sur une hypothèse raisonnable. Seule la réponse HTTP finale fournit des en-têtes Link faisant autorité.
L’écart entre les indications et les en-têtes finaux se manifeste de deux façons : la réponse finale exige des ressources supplémentaires non mentionnées dans les indications, ou les ressources récupérées à la suite des indications précoces s’avèrent inutiles. Dans ce second cas, le client a effectué un travail supplémentaire sans bénéfice et la durée totale de la transaction augmente.
Les opérations effectuées à partir des indications précoces sont sûres. Par exemple, l’utilisation d’une méthode GET ne modifie pas l’état du serveur.
Impact SEO
103 Early Hints est une réponse informationnelle qui précède le code de statut final. Les robots d’exploration des moteurs de recherche traitent la réponse finale, et non les réponses informationnelles intermédiaires. Les gains de performance apportés par les indications précoces concernent les navigateurs, pas les robots. Ce code de statut s’utilise sans risque et n’interfère pas avec la façon dont Google traite la page.
Remplacement du server push
Le mécanisme 103 Early Hints est destiné à remplacer le mécanisme de server push, dans le cadre du framework de resource hints reposant sur rel=preload, dans les navigateurs modernes. Contrairement au server push, 103 Early Hints ne dépend pas de la réponse finale pour que le navigateur commence à récupérer les ressources indiquées.
Remarque
Pour des raisons de sécurité, les navigateurs limitent l’usage de 103 Early Hints aux seules connexions HTTP/2 et HTTP/3.
Exemple
Le client demande un fichier index.html et le serveur renvoie trois indications sur les ressources probablement nécessaires. Le fichier demandé ne figure pas dans le corps du message parce que le serveur est encore en train de générer la réponse. Le client commence à charger les ressources indiquées par chaque directive Link.
Après un court délai, le serveur renvoie la réponse finale 200, accompagnée des directives Link officielles et de index.html dans le corps du message. Notez les différences entre les indications précoces et la liste finale des ressources.
Requête
GET /index.html HTTP/1.1
Host: example.com
Réponse
HTTP/1.1 103 Early Hints
Link: </style.css>; rel=preload; as=style
Link: </images/logo.svg>; rel=preload; as=image
Link: </videos/instructions_simple.mp4>; rel=preload; as=video
<there is a short pause in the transmission>
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 100
Link: </style.css>; rel=preload; as=style
Link: </images/logo.svg>; rel=preload; as=image
Link: </images/pro_badge.svg>; rel=preload; as=image
Link: </videos/instructions_advanced.mp4>; rel=preload; as=video
<message body will follow>
La première ressource indiquée, style.css, est récupérée et traitée par le client, tout comme l’image du logo et la vidéo instructions_simple.mp4. La feuille de style et le logo sont utilisables en l’état. L’image pro_badge présente dans la réponse finale n’apparaît pas dans les indications : le client récupère donc cette ressource à la réception de la réponse finale.
La vidéo instructions_advanced.mp4 des en-têtes Link finaux diffère de l’indication précoce. Le serveur avait suggéré instructions_simple.mp4 via les indications précoces, mais cette récupération était inutile. La vidéo nouvellement indiquée doit encore être récupérée et traitée avant que index.html ne s’affiche entièrement, ce qui allonge probablement le temps de chargement puisque deux vidéos ont été récupérées au lieu d’une.
Références de code
.NET
HttpStatusCode.EarlyHints
Rust
http::StatusCode::EARLY_HINTS
Rails
:early_hints
Go
http.StatusEarlyHints
Symfony
Response::HTTP_EARLY_HINTS
Python3.9+
http.HTTPStatus.EARLY_HINTS
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_EARLY_HINTS
Angular
@angular/common/http/HttpStatusCode.EarlyHints