httpsfv : un parser de champ HTTP structuré et un sérialiseur pour le langage de programmation Go

Découvrez la version originale de cet article.

Structured Field Values for HTTP est une RFC à venir qui définit un ensemble de types de données à utiliser dans les en-têtes et les trailers HTTP. Ce nouveau format améliorera l'interopérabilité et la sécurité du protocole HTTP en permettant de créer des parsers génériques et des sérialiseurs adaptés à tous les en-têtes HTTP (actuellement, la plupart des en-têtes ont besoin d’un parser personnalisé) et pourrait également permettre d'améliorer les performances du web. Mark Nottingham, l'un des auteurs de cette RFC, a publié un intéressant article qui explique ces aspects en profondeur.

Les headers et trailers utilisant les champs structurés ressemblent à ceci :

Example-Item: token; param1=?0; param2="a-string"
Example-List: token, "string", ?1; parameter, (42, 42.0)
Example-Dict: foo1=bar, foo2="baz"; param, foo3=(?1 10.1)

Les en-têtes HTTP personnalisés (et les trailers) peuvent commencer à utiliser des valeurs structurées dès à présent et la plupart des standards du web, y compris les nouveaux en-têtes de sécurité proposés par l'équipe Chrome, sont en train de les adopter.

La prochaine version de Vulcain (une proposition de spécification publiée par Les-Tilleuls.coop s'appuyant sur le Server Push HTTP/2 (et HTTP/3) pour permettre la création d'API web rapides et idiomatiques orientées client) permettra d'exploiter les valeurs de champs structurés !

fields-header

Le souci : l'implémentation de référence de Vulcain est écrite en Go... mais jusqu'à présent, Go n'avait pas de parser pour les valeurs de champs structurés. Nous avons retroussé nos manches, et en avons écrit un !

Voici donc httpsfv, un parser de valeurs de champs structurés et un sérialiseur pour le langage de programmation Go ! La bibliothèque implémente entièrement la dernière version de l'Internet-Draft (19), est entièrement documentée, testée avec la suite de tests officiels, rapide (avec un benchmark inclus dans le dépôt). Cette bibliothèque est libre (BSD-3-Clause License) et gratuite !

Étant donné que la spécification des valeurs de champs structurés va bientôt devenir une RFC et qu'il est prévu de l'utiliser pour la plupart des nouveaux en-têtes HTTP, nous avons également ouvert une PR sur le dépôt de Go pour inclure ce parser (et le serialiseur) directement dans la bibliothèque standard du langage. Si cette PR est mergée, il sera possible de traiter les valeurs de champs structurés sans avoir besoin d'un paquet tiers.

Cette PR fournit également une aide pour analyser et sérialiser les en-têtes structurées directement à partir des instances header :

h := http.Header{}

// Parsing
i := h.GetItem("Foo-Item")
l := h.GetList("Foo-List")
d := h.GetDictionary("Foo-Dictionary")

// Serializing
d := sfv.NewDictionary()
d.Add("b", sfv.NewItem(false))

bar := sfv.NewItem(sfv.Token("bar"))
bar.Params.Add("baz", 42)
d.Add("a", bar)

h.SetStructured("My-Header", d)

Des exemples et la documentation sont disponibles sur GitHub. N’hésitez pas à l’essayer et à y mettre une petite étoile :)