3. Le champ d'en-tête HTTP Alt-Svc
Un serveur d'origine HTTP(S) peut annoncer la disponibilité de services alternatifs aux clients en ajoutant un champ d'en-tête Alt-Svc aux réponses.
Alt-Svc = clear / 1#alt-value
clear = %s"clear"; "clear", sensible à la casse
alt-value = alternative *( OWS ";" OWS parameter )
alternative = protocol-id "=" alt-authority
protocol-id = token ; nom de protocole ALPN encodé en pourcentage
alt-authority = quoted-string ; contenant [ uri-host ] ":" port
parameter = token "=" ( token / quoted-string )
La valeur du champ consiste soit en une liste de valeurs, dont chacune indique un service alternatif, soit en le mot-clé "clear".
Une valeur de champ contenant la valeur spéciale "clear" indique que l'origine demande que toutes les alternatives pour cette origine soient invalidées (y compris celles spécifiées dans la même réponse, en cas de réponse invalide contenant à la fois "clear" et des services alternatifs).
Les noms de protocole ALPN sont des séquences d'octets sans contraintes supplémentaires sur le format. Les octets non autorisés dans les jetons ([RFC7230], Section 3.2.6) DOIVENT être encodés en pourcentage conformément à la Section 2.1 de [RFC3986]. Par conséquent, l'octet représentant le caractère pourcentage "%" (hex 25) DOIT également être encodé en pourcentage.
Afin d'avoir précisément une seule façon de représenter tout nom de protocole ALPN, les contraintes supplémentaires suivantes s'appliquent :
- Les octets dans le nom de protocole ALPN NE DOIVENT PAS être encodés en pourcentage s'ils sont des caractères de jeton valides, à l'exception de "%", et
- Lors de l'utilisation de l'encodage en pourcentage, des chiffres hexadécimaux majuscules DOIVENT être utilisés.
Avec ces contraintes, les destinataires peuvent appliquer une simple comparaison de chaînes pour faire correspondre les identifiants de protocole.
Le composant "alt-authority" consiste en un uri-host OPTIONNEL ("host" dans la Section 3.2.2 de [RFC3986]), deux points (":"), et un numéro de port.
Par exemple :
Alt-Svc: h2=":8000"
Ceci indique le protocole "h2" ([RFC7540]) sur le même hôte utilisant le port indiqué 8000.
Un exemple impliquant un changement d'hôte :
Alt-Svc: h2="new.example.org:80"
Ceci indique le protocole "h2" sur l'hôte "new.example.org", fonctionnant sur le port 80. Notez que la syntaxe "quoted-string" doit être utilisée car ":" n'est pas un caractère autorisé dans "token".
Exemples d'échappement de nom de protocole :
| Nom de protocole ALPN | protocol-id | Note |
|---|---|---|
| h2 | h2 | Pas d'échappement nécessaire |
| w=x:y#z | w%3Dx%3Ay#z | "=" et ":" échappés |
| x%y | x%25y | "%" nécessite un échappement |
Alt-Svc PEUT apparaître dans tout message de réponse HTTP, quel que soit le code d'état. Notez que les destinataires d'Alt-Svc peuvent ignorer le champ d'en-tête (et sont tenus de le faire dans certaines situations ; voir les sections 2.1 et 6).
La valeur du champ Alt-Svc peut avoir plusieurs valeurs :
Alt-Svc: h2="alt.example.com:8000", h2=":443"
Lorsque plusieurs valeurs sont présentes, l'ordre des valeurs reflète la préférence du serveur (la première valeur étant l'alternative la plus préférée).
La/les valeur(s) annoncée(s) par Alt-Svc peuvent être utilisées par les clients pour ouvrir une nouvelle connexion vers un service alternatif. Les demandes ultérieures peuvent commencer à utiliser cette nouvelle connexion immédiatement ou peuvent continuer à utiliser la connexion existante pendant que la nouvelle connexion est créée.
Lors de l'utilisation de HTTP/2 ([RFC7540]), les serveurs DEVRAIENT plutôt envoyer une trame ALTSVC (Section 4). Une seule trame ALTSVC peut être envoyée pour une connexion ; une nouvelle trame n'est pas nécessaire pour chaque demande. Notez que, malgré cette recommandation, les champs d'en-tête Alt-Svc restent valides dans les réponses livrées via HTTP/2.
Chaque "alt-value" est suivie d'une liste OPTIONNELLE de paramètres supplémentaires séparés par des points-virgules, chaque "paramètre" comprenant un nom et une valeur.
Cette spécification définit deux paramètres : "ma" et "persist", définis dans la Section 3.1. Les paramètres inconnus DOIVENT être ignorés. C'est-à-dire que les valeurs (alt-value) dans lesquelles ils apparaissent DOIVENT être traitées comme si le paramètre inconnu n'était pas présent.
De nouveaux paramètres peuvent être définis dans des spécifications d'extension (voir la Section 7.3 pour les détails d'enregistrement).
Notez que tous les éléments de champ qui autorisent la syntaxe "quoted-string" DOIVENT être traités conformément à la Section 3.2.6 de [RFC7230].
3.1. Mise en cache des valeurs du champ d'en-tête Alt-Svc
Lorsqu'un service alternatif est annoncé à l'aide d'Alt-Svc, il est considéré comme frais pendant 24 heures à partir de la génération du message. Cela peut être modifié avec le paramètre "ma" (max-age).
Syntaxe :
ma = delta-seconds; voir [RFC7234], Section 1.2.1
La valeur delta-seconds indique le nombre de secondes depuis la génération de la réponse pendant lesquelles le service alternatif est considéré comme frais.
Alt-Svc: h2=":443"; ma=3600
Voir la Section 4.2.3 de [RFC7234] pour plus de détails sur la détermination de l'âge de la réponse.
Par exemple, une réponse :
HTTP/1.1 200 OK
Content-Type: text/html
Cache-Control: max-age=600
Age: 30
Alt-Svc: h2=":8000"; ma=60
indique qu'un service alternatif est disponible et utilisable pendant les 60 prochaines secondes. Cependant, la réponse a déjà été mise en cache pendant 30 secondes (selon la valeur du champ d'en-tête Age) ; par conséquent, le service alternatif n'est frais que pendant les 30 secondes suivant la réception de cette réponse, moins le temps de transit estimé.
Notez que la durée de fraîcheur pour la mise en cache HTTP (ici, 600 secondes) n'affecte pas la mise en cache des valeurs Alt-Svc.
Lorsqu'un champ d'en-tête de réponse Alt-Svc est reçu d'une origine, sa valeur invalide et remplace tous les services alternatifs mis en cache pour cette origine.
Par défaut, les services alternatifs mis en cache seront effacés lorsque le client détecte un changement de réseau. Les services alternatifs qui sont destinés à avoir une durée de vie plus longue (tels que ceux qui ne sont pas spécifiques au réseau d'accès du client) peuvent porter le paramètre "persist" avec une valeur "1" comme indice que le service est potentiellement utile au-delà d'un changement de configuration réseau.
Syntaxe :
persist = "1"
Par exemple :
Alt-Svc: h2=":443"; ma=2592000; persist=1
Cette spécification ne définit qu'une seule valeur pour "persist". Les clients DOIVENT ignorer les paramètres "persist" avec des valeurs autres que "1".
Voir la Section 2.2 pour les exigences générales sur la mise en cache des services alternatifs.