PubSubHubbub

2014-09-25

Ce document était originellement un court article en anglais publié le 19 juin 2011 quand je m'intéressais à Status.net basé sur le protocole OStatus utilisant PubSubHubbub.

PubSubBubbub (Publishers and Subscribers Hubbub) est un protocole permettant aux abonnés (subscribers) d'un flux (RSS/Atom) d'être informé (le serveur effectue un push) d'une mise à jour immédiatement, plutôt que de ne la découvrir que lors de la prochaine consultation du flux (le client effectuant un pull).

Abonnement

Le flux doit contenir une information supplémentaire, à savoir l'adresse du hub :

<link rel="hub" href="HUB_URI" />

Par exemple, HUB_URI pourrait être https://www.example.org/hub.

Le client envoie une requête HTTP POST au hub. Comme pour d'autres requêtes de ce type, le contenu du corps de la requête est de la forme :

param1=value1&param2=value2…

Si le client veut être prévenu d'une mise à jour du flux, il utilise les paramètres suivants :

Client POST Hub
hub_mode         "subscribe"
hub_topic        l'URL du flux
hub_callback     l'URL à prévenir
hub_verify       "sync" (synchrone) or "async" (asynchrone)
hub_verify_token un jeton pour vérifier l'URL de l'abonné
hub_secret       un secret pour identifier le hub
hub_secret_mode  l'algorithme à utiliser

À son tour, le hub envoie une requête à hub_callback pour confirmer l'abonnement, avec les valeurs qui lui ont été fournies :

Hub GET Callback
hub_mode
hub_topic
hub_verify_token

Si c'est bien ce que l'abonné a demandé, il répond le code HTTP 202.

Mise à jour

Lors d'une mise à jour, le hub envoie un message à l'URL indiquée par le client. La requête POST a pour corps le bout de flux concerné et comporte un en-tête X-Hub-Signature permettant de vérifier l'origine de la mise à jour.

X-Hub-Signature: hub_secret_mode + "=" + hash

Le hash est le résultat de l'algorithme sélectionné sur le contenu et sur le secret. Par exemple :

$hash = hash_hmac($secret_mode, $content, $secret)

Désabonnement

La requête de désabonnement est similaire à celle d'abonnement :

Client POST Hub
hub_mode         "unsubscribe"
hub_topic        l'URL du flux
hub_callback     l'URL du client
hub_verify       "sync" (synchrone) or "async" (asynchrone)
hub_verify_token un nouveau jeton pour confirmer
hub_secret       le même secret que lors de l'abonnement

De même, le serveur transmet les valeurs à l'URL du client :

Hub GET Callback
hub_mode
hub_topic
hub_verify_token