5. Le champ d'en-tête Link
Le champ d'en-tête d'entité Link fournit un moyen de sérialiser un ou plusieurs liens dans les en-têtes HTTP. Il est sémantiquement équivalent à l'élément en HTML, ainsi qu'à l'élément atom:link au niveau du flux dans Atom [RFC4287].
Link = "Link" ":" #link-value
link-value = "<" URI-Reference ">" *( ";" link-param )
link-param = ( ( "rel" "=" relation-types )
| ( "anchor" "=" <"> URI-Reference <"> )
| ( "rev" "=" relation-types )
| ( "hreflang" "=" Language-Tag )
| ( "media" "=" ( MediaDesc | ( <"> MediaDesc <"> ) ) )
| ( "title" "=" quoted-string )
| ( "title*" "=" ext-value )
| ( "type" "=" ( media-type | quoted-mt ) )
| ( link-extension ) )
link-extension = ( parmname [ "=" ( ptoken | quoted-string ) ] )
| ( ext-name-star "=" ext-value )
ext-name-star = parmname "*" ; reserved for RFC2231-profiled
; extensions. Whitespace NOT
; allowed in between.
ptoken = 1*ptokenchar
ptokenchar = "!" | "#" | "$" | "%" | "&" | "'" | "("
| ")" | "*" | "+" | "-" | "." | "/" | DIGIT
| ":" | "<" | "=" | ">" | "?" | "@" | ALPHA
| "[" | "]" | "^" | "_" | "`" | "{" | "|"
| "}" | "~"
media-type = type-name "/" subtype-name
quoted-mt = <"> media-type <">
relation-types = relation-type
| <"> relation-type *( 1*SP relation-type ) <">
relation-type = reg-rel-type | ext-rel-type
reg-rel-type = LOALPHA *( LOALPHA | DIGIT | "." | "-" )
ext-rel-type = URI
5.1. IRI cible
Chaque link-value transporte un IRI cible sous la forme d'un URI-Reference (après conversion en celui-ci, si nécessaire ; voir [RFC3987], section 3.1) entre chevrons ("<>"). Si l'URI-Reference est relatif, les analyseurs doivent (MUST) le résoudre conformément à [RFC3986], section 5. Notez qu'aucun IRI de base issu du contenu du message n'est appliqué.
5.2. IRI de contexte
Par défaut, le contexte d'un lien transporté dans le champ d'en-tête Link est l'IRI de la ressource demandée.
Lorsqu'il est présent, le paramètre anchor remplace celui-ci par un autre URI, tel qu'un fragment de cette ressource, ou une troisième ressource (c'est-à-dire lorsque la valeur de anchor est un URI absolu). Si la valeur du paramètre anchor est un URI relatif, les analyseurs doivent (MUST) le résoudre conformément à [RFC3986], section 5. Notez qu'aucun URI de base issu du contenu du corps n'est appliqué.
Les implémentations consommatrices peuvent choisir d'ignorer les liens comportant un paramètre anchor. Par exemple, l'application utilisée peut ne pas permettre d'assigner l'IRI de contexte à une autre ressource. Dans de tels cas, l'intégralité du lien doit être ignorée ; les implémentations consommatrices ne doivent pas (MUST NOT) traiter le lien sans appliquer anchor.
Notez que, selon le code de statut HTTP et les en-têtes de réponse, l'IRI de contexte peut être "anonyme" (c'est-à-dire qu'aucun IRI de contexte n'est disponible). Par exemple, c'est le cas pour une réponse 404 à une requête GET.
5.3. Type de relation
Le type de relation d'un lien est transporté dans la valeur du paramètre "rel". Le paramètre "rel" ne doit pas (MUST NOT) apparaître plus d'une fois dans un link-value donné ; les occurrences après la première doivent (MUST) être ignorées par les analyseurs.
Le paramètre "rev" a été utilisé par le passé pour indiquer que la sémantique de la relation est dans le sens inverse. C'est-à-dire qu'un lien de A vers B avec REL="X" exprime la même relation qu'un lien de B vers A avec REV="X". "rev" est déprécié par cette spécification parce qu'il prête souvent à confusion pour les auteurs et les lecteurs ; dans la plupart des cas, l'utilisation d'un type de relation distinct est préférable.
Notez que les types de relation d'extension sont REQUIS pour être des URI absolus dans les en-têtes Link, et doivent (MUST) être entre guillemets s'ils contiennent un point-virgule (";") ou une virgule (",") (car ces caractères sont utilisés comme délimiteurs dans l'en-tête lui-même).
5.4. Attributs de cible
Les paramètres "hreflang", "media", "title", "title*", "type", ainsi que tout paramètre de lien link-extension, sont considérés comme des attributs de cible pour le lien.
Le paramètre "hreflang", lorsqu'il est présent, est une indication de la langue que devrait avoir le résultat du déréférencement du lien. Notez qu'il ne s'agit que d'une indication ; par exemple, il ne remplace pas l'en-tête Content-Language d'une réponse HTTP obtenue en suivant réellement le lien. Plusieurs paramètres "hreflang" sur un même link-value indiquent que plusieurs langues sont disponibles depuis la ressource indiquée. Le paramètre "media", lorsqu'il est présent, sert à indiquer le support ou le média de destination prévu pour les informations de style (voir [W3C.REC-html401-19991224], section 6.13). Notez que cela peut être mis à jour par [W3C.CR-css3-mediaqueries-20090915]). Sa valeur doit (MUST) être mise entre guillemets si elle contient un point-virgule (";") ou une virgule (","), et il ne doit pas (MUST NOT) y avoir plus d'un paramètre "media" dans un link-value.
Le paramètre "title", lorsqu'il est présent, sert à étiqueter la destination d'un lien de manière à pouvoir l'utiliser comme identifiant lisible par un humain (par exemple, une entrée de menu) dans la langue indiquée par l'en-tête Content-Language (s'il est présent). Le paramètre "title" ne doit pas (MUST NOT) apparaître plus d'une fois dans un link-value donné ; les occurrences après la première doivent (MUST) être ignorées par les analyseurs.
Le paramètre "title*" peut être utilisé pour encoder cette étiquette dans un jeu de caractères différent, et/ou contenir des informations de langue conformément à [RFC5987]. Le paramètre "title*" ne doit pas (MUST NOT) apparaître plus d'une fois dans un link-value donné ; les occurrences après la première doivent (MUST) être ignorées par les analyseurs. Si le paramètre ne contient pas d'informations de langue, sa langue est indiquée par l'en-tête Content-Language (lorsqu'il est présent).
Si les paramètres "title" et "title*" apparaissent tous les deux dans un link-value, les processeurs devraient (SHOULD) utiliser la valeur du paramètre "title*".
Le paramètre "type", lorsqu'il est présent, est une indication du type de média que devrait avoir le résultat du déréférencement du lien. Notez qu'il ne s'agit que d'une indication ; par exemple, il ne remplace pas l'en-tête Content-Type d'une réponse HTTP obtenue en suivant réellement le lien. Il ne doit pas (MUST NOT) y avoir plus d'un paramètre type dans un link-value.
5.5. Exemples
Par exemple :
Link: <http://example.com/TheBook/chapter2>; rel="previous";
title="previous chapter"
indique que "chapter2" est précédent à cette ressource dans un chemin de navigation logique.
De même,
Link: </>; rel="http://example.net/foo"
indique que la ressource racine ("/") est liée à cette ressource par le type de relation d'extension "http://example.net/foo". L'exemple ci-dessous montre une instance de l'en-tête Link encodant plusieurs liens, ainsi que l'utilisation de l'encodage RFC 2231 pour encoder à la fois des caractères non ASCII et des informations de langue.
Link: </TheBook/chapter2>;
rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
</TheBook/chapter4>;
rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel
Ici, les deux liens ont des titres encodés en UTF-8, utilisent la langue allemande ("de"), et le second lien contient le point de code Unicode U+00E4 ("LATIN SMALL LETTER A WITH DIAERESIS").
Notez que les link-values peuvent transporter plusieurs liens entre les mêmes IRI cible et de contexte ; par exemple :
Link: <http://example.org/>;
rel="start http://example.net/relation/other"
Ici, le lien vers "http://example.org/" a le type de relation enregistré "start" et le type de relation d'extension "http://example.net/relation/other".