Hop-by-hop !

Posté par Anthony Baillard Il y a 4 années, 9 mois

HopsLes en-têtes HTTP hop-by-hop ou "comment on découvre des informations techniques insoupçonnées et essentielles".

Contrairement à ce que suggère l'illustration de cet article, les en-têtes HTTP hop-by-hop n'ont aucun lien avec le houblon (hop en anglais). C'est plutôt dans le sens de "saut" qu'il faut comprendre hop. Mais le houblon, c'est beau et puis ça sert à faire la bière !

 

La découverte (par l'erreur)

Alors,comment découvre-t-on les en-têtes point-à-point (pour utiliser la traduction correcte) ? Pour ma part, par hasard, en écrivant un proxy en Python vers un de nos services HTTP générant des pdf.

Le code suivant :

response = HttpResponse(document.read())

for (key, value) in document.headers.dict.items():
response[key] = value

return response

provoquait systématiquement une exception :

Traceback (most recent call last):

  File "/home/ab/work/django/venv-django/local/lib/python3.7/site-packages/django/core/servers/basehttp.py", line 283, in run
    self.result = application(self.environ, self.start_response)

  File "/home/ab/work/django/venv-django/local/lib/python3.7/site-packages/django/contrib/staticfiles/handlers.py", line 68, in __call__
    return self.application(environ, start_response)

  File "/home/ab/work/django/venv-django/local/lib/python3.7/site-packages/django/core/handlers/wsgi.py", line 285, in __call__
    start_response(status, response_headers)

  File "/home/ab/work/django/venv-django/local/lib/python3.7/site-packages/django/core/servers/basehttp.py", line 373, in start_response
    assert not is_hop_by_hop(name),"Hop-by-hop headers not allowed"

AssertionError: Hop-by-hop headers not allowed  


La compréhension (et la résolution)

Ces en-têtes, peu nombreux, s'opposent à la grande majorité des en-têtes HTTP 'end-to-end', i.e., bout-à-bout. Leur but est somme toute assez simple : éviter de transmettre sur tout la chaîne de communication Internet entre le client et le serveur des informations qui ne sont utiles que pour une connexion entre deux nœuds de la chaîne. Economiser quelques kilo octets sur chaque paquet HTTP, ça n'a l'air de rien, mais grâce à ce genre de détails qu'Internet fonctionne aussi bien à grande échelle. Les ingénieurs qui ont pensé cette architecture, ses standards et ses protocoles ont vraiment fait du bon travail, rien n'est négligé, à aucun niveau.

Schéma de transfert des en-têtes HTTPLes en-têtes de type end-to-end sont mis en cache et transférés par les proxy.
Les éventuels en-têtes de type hop-by-hop ne sont pas mis en cache et ne sont pas transférés.
De nouveaux en-têtes
hop-by-hop peuvent être créés par le proxy.

 

Après un peu de lecture sur le sujet, le message d'erreur devient très clair, mon proxy ne doit pas transférer les en-têtes point-à-point :

response = HttpResponse(document.read())

for (key, value) in document.headers.dict.items():
if not is_hop_by_hop(key):
response[key] = value

return response

 

En savoir plus

Lien : Connected Internet Encyclopedia article (anglais)