2. Aperçu du processus de compression (Compression Process Overview)
Cette spécification ne décrit pas d'algorithme spécifique pour un encodeur. Au lieu de cela, elle définit précisément comment un décodeur est censé fonctionner, permettant aux encodeurs de produire tout encodage que cette définition permet.
2.1. Ordre de la liste d'en-têtes (Header List Ordering)
HPACK préserve l'ordre des champs d'en-tête dans la liste d'en-têtes. Un encodeur DOIT (MUST) ordonner les représentations de champs d'en-tête dans le bloc d'en-têtes selon leur ordre dans la liste d'en-têtes d'origine. Un décodeur DOIT (MUST) ordonner les champs d'en-tête dans la liste d'en-têtes décodée selon leur ordre dans le bloc d'en-têtes.
2.2. Contextes d'encodage et de décodage (Encoding and Decoding Contexts)
Pour décompresser les blocs d'en-têtes, un décodeur n'a besoin de maintenir qu'une table dynamique (voir section 2.3.2) comme contexte de décodage. Aucun autre état dynamique n'est nécessaire.
Lorsqu'il est utilisé pour une communication bidirectionnelle, comme dans HTTP, les tables dynamiques d'encodage et de décodage maintenues par un point de terminaison sont complètement indépendantes, c'est-à-dire que les tables dynamiques de requête et de réponse sont séparées.
2.3. Tables d'indexation (Indexing Tables)
HPACK utilise deux tables pour associer des champs d'en-tête à des index. La table statique (voir section 2.3.1) est prédéfinie et contient des champs d'en-tête communs (la plupart d'entre eux avec une valeur vide). La table dynamique (voir section 2.3.2) est dynamique et peut être utilisée par l'encodeur pour indexer des champs d'en-tête répétés dans les listes d'en-têtes encodées.
Ces deux tables sont combinées en un seul espace d'adressage pour définir les valeurs d'index (voir section 2.3.3).
2.3.1. Table statique (Static Table)
La table statique se compose d'une liste statique prédéfinie de champs d'en-tête. Ses entrées sont définies dans l'annexe A.
2.3.2. Table dynamique (Dynamic Table)
La table dynamique se compose d'une liste de champs d'en-tête maintenue dans l'ordre premier entré, premier sorti. La première et la plus récente entrée dans une table dynamique est à l'index le plus bas, et l'entrée la plus ancienne d'une table dynamique est à l'index le plus élevé.
La table dynamique est initialement vide. Les entrées sont ajoutées au fur et à mesure que chaque bloc d'en-têtes est décompressé.
La table dynamique peut contenir des entrées en double (c'est-à-dire des entrées avec le même nom et la même valeur). Par conséquent, les entrées en double NE DOIVENT PAS (MUST NOT) être traitées comme une erreur par un décodeur.
L'encodeur décide de la manière de mettre à jour la table dynamique et peut ainsi contrôler la quantité de mémoire utilisée par la table dynamique. Pour limiter les besoins en mémoire du décodeur, la taille de la table dynamique est strictement limitée (voir section 4.2).
Le décodeur met à jour la table dynamique pendant le traitement d'une liste de représentations de champs d'en-tête (voir section 3.2).
2.3.3. Espace d'adressage d'index (Index Address Space)
La table statique et la table dynamique sont combinées en un seul espace d'adressage d'index.
Les index compris entre 1 et la longueur de la table statique (inclus) font référence aux éléments de la table statique (voir section 2.3.1).
Les index strictement supérieurs à la longueur de la table statique font référence aux éléments de la table dynamique (voir section 2.3.2). La longueur de la table statique est soustraite pour trouver l'index dans la table dynamique.
Les index strictement supérieurs à la somme des longueurs des deux tables DOIVENT (MUST) être traités comme une erreur de décodage.
Pour une taille de table statique de s et une taille de table dynamique de k, le diagramme suivant montre l'espace d'adressage d'index valide complet.
<---------- Index Address Space ---------->
<-- Static Table --> <-- Dynamic Table -->
+---+-----------+---+ +---+-----------+---+
| 1 | ... | s | |s+1| ... |s+k|
+---+-----------+---+ +---+-----------+---+
^ |
| V
Insertion Point Dropping Point
Figure 1 : Espace d'adressage d'index
2.4. Représentation de champ d'en-tête (Header Field Representation)
Un champ d'en-tête encodé peut être représenté soit sous forme d'index, soit sous forme de littéral.
Une représentation indexée (Indexed Representation) définit un champ d'en-tête comme une référence à une entrée dans la table statique ou la table dynamique (voir section 6.1).
Une représentation littérale (Literal Representation) définit un champ d'en-tête en spécifiant son nom et sa valeur. Le nom du champ d'en-tête peut être représenté littéralement ou sous forme de référence à une entrée dans la table statique ou la table dynamique. La valeur du champ d'en-tête est représentée littéralement.
Trois représentations littérales différentes sont définies :
-
Une représentation littérale qui ajoute le champ d'en-tête comme nouvelle entrée au début de la table dynamique (voir section 6.2.1).
-
Une représentation littérale qui n'ajoute pas le champ d'en-tête à la table dynamique (voir section 6.2.2).
-
Une représentation littérale qui n'ajoute pas le champ d'en-tête à la table dynamique, avec la stipulation supplémentaire que ce champ d'en-tête utilise toujours une représentation littérale, en particulier lorsqu'il est ré-encodé par un intermédiaire (voir section 6.2.3). Cette représentation est destinée à protéger les valeurs de champs d'en-tête qui ne doivent pas être mises en danger en les compressant (voir section 7.1.3 pour plus de détails).
Le choix de l'une de ces représentations littérales peut être guidé par des considérations de sécurité, afin de protéger les valeurs de champs d'en-tête sensibles (voir section 7.1).