Bonjour à tous,

Je partage avec vous une bibliothèque permettant de vous simplifier la vie lorsque vous manipulez des headers HTTP ou IMAP. Peu-importe le type contenant les headers.
Manipuler des headers, le ba.-ba me diriez-vous ? Détrompez-vous, sachez que peu de support 'ready-to-use' existe pour pouvoir exploiter les headers sans faire d'erreur.

Prenez le cas suivant : "Je souhaite connaître le charset déclaré dans l'header Content-Type de ma réponse lorsque je sollicite www.python.org"

Je remarque souvent des portions de code similaires à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
from requests import get
 
response = get("https://www.python.org")
 
charset = response.headers['Content-Type'].split(';')[-1].split('=')[-1].replace('"', '')
print("www.python.org déclare utiliser", charset, "comme encodage du corps")
Ce code est évidemment très illisible et n'est certainement pas générique. On se retrouve souvent à écrire de petite fonction comme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
parse_charset_headers()
dans nos utilitaires.

En utilisant la bibliothèque kiss-headers, vous abandonnez la syntaxe lourde et diminuez le risque inhérent.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
from requests import get
from kiss_headers import parse_it
 
response = get("https://www.python.org")
headers = parse_it(response)
 
if not headers.content_type.has("charset"):
    print("www.python.org ne déclare pas de charset pour le corps")
    exit(1)
 
print("www.python.org déclare utiliser", headers.content_type.charset, "comme encodage du corps")
A l'aide de la fonction parse_it, vous transformez vos headers en objets. Tout le parsing est déjà réalisé en amont.
En plus de ça, la bibliothèque :

  • Gère les entrées multiples pour un seul header
  • Gère les entrées fusionnées dans un seul header
  • Gère les attributs multiples dans les headers
  • Et bien plus encore


Cette bibliothèque vous permet aussi de réaliser l'inverse, c'est à dire, créer vos headers en utilisant des objets prêt à l'usage.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
from kiss_headers import *
 
headers = (
    Host("developer.mozilla.org")
    + UserAgent(
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0"
    )
    + Accept("text/html")
    + Accept("application/xhtml+xml")
    + Accept("application/xml", qualifier=0.9)
    + Accept(qualifier=0.8)
    + AcceptLanguage("en-US")
    + AcceptLanguage("en", qualifier=0.5)
    + AcceptEncoding("gzip")
    + AcceptEncoding("deflate")
    + AcceptEncoding("br")
    + Referer("https://developer.mozilla.org/testpage.html")
    + Connection(should_keep_alive=True)
    + UpgradeInsecureRequests()
    + IfModifiedSince("Mon, 18 Jul 2016 02:36:04 GMT")
    + IfNoneMatch("c561c68d0ba92bbeb8b0fff2a9199f722e3a621a")
    + CacheControl(max_age=0)
)
 
raw_headers = str(headers)
raw_headers contient :

Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html, application/xhtml+xml, application/xml; q="0.9", */*; q="0.8"
Accept-Language: en-US, en; q="0.5"
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age="0"
Pour connaître les cas plus avancées, je vous laisse les liens ci-dessous.

Lien PyPi : https://pypi.org/project/kiss-headers/
Lien GitHub : https://github.com/Ousret/kiss-headers

Happy coding