Transposition des Headers HTTP et IMAP vers des objets. Bibliothèque parsing headers.
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:
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:
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:
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:
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 :
Citation:
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 :)