Python package for headers, object oriented, http or imap.
Project description
Welcome to Headers for Humans 👋
Object oriented headers, parser and builder.
❓ Why
No matter if you are currently building software using HTTP or IMAP, you should not worry about easily accessing header and associated attributes, adjectives or values.
I have seen so many chunks of code trying to deal with these headers; often I saw this implementation :
charset = headers['Content-Type'].split(';')[-1].split('=')[-1].replace('"', '')
No more of that !
🔪 Features
kiss-headers
is a basic library that allow you to handle headers as objects.
- A backwards-compatible syntax using bracket style.
- Capability to alter headers using simple, human-readable operator notation
+
and-
. - Flexibility if headers are from IMAP4 or HTTP, use as you need with one library.
- Ability to parse any object and extract recognized headers from it.
- Fully type-annotated.
- Provide great auto-completion in Python interpreter or any capable IDE.
- Absolutely no dependencies.
- 90% test coverage.
Plus all the features that you would expect from handling headers...
- Properties syntax for headers and attribute in header.
- Supports headers and attributes OneToOne, OneToMany and ManySquashedIntoOne.
- Capable of parsing
bytes
,fp
,str
,dict
,email.Message
,requests.Response
andhttpx._models.Response
. - Automatically unquote value of an attribute when retrieving it.
- Case insensitive with header name and attribute key.
- Character
-
equal_
in addition of above feature. - Any syntax you like, we like.
✨ Installation
Whatever you like, use pipenv
or pip
, it simply works. Requires Python 3.6+ installed.
pip install kiss-headers --upgrade
🍰 Usage
parse_it()
method takes bytes
, str
, fp
, dict
, email.Message
or even a requests.Response
or httpx._models.Response
itself and returns a Headers
object.
from requests import get
from kiss_headers import parse_it
response = get('https://www.google.fr')
headers = parse_it(response)
headers.content_type.charset # output: ISO-8859-1
# Its the same as
headers["content-type"]["charset"] # output: ISO-8859-1
Do not forget that headers are not OneToOne. One header can be repeated multiple times and attributes can have multiple values within the same header.
from kiss_headers import parse_it
my_cookies = """set-cookie: 1P_JAR=2020-03-16-21; expires=Wed, 15-Apr-2020 21:27:31 GMT; path=/; domain=.google.fr; Secure; SameSite=none
set-cookie: CONSENT=WP.284b10; expires=Fri, 01-Jan-2038 00:00:00 GMT; path=/; domain=.google.fr"""
headers = parse_it(my_cookies)
type(headers.set_cookie) # output: list
headers.set_cookie[0].expires # output Wed, 15-Apr-2020 21:27:31 GMT
If this behaviour does bother you, you can lock output to always be a list. Just call lock_output_type()
method.
Just a note: Accessing a header that has the same name as a reserved keyword must be done this way :
headers = parse_it('From: Ousret; origin=www.github.com\nIS: 1\nWhile: Not-True')
# this flavour
headers.from_ # to access From, just add a single underscore to it
# or.. just using :
headers['from']
🛠️ The builder
Introduced in the version 2.0, kiss-headers now allow you to create headers with more than 40+ ready-to-use, fully documented, header objects.
1st example usage
from kiss_headers import Headers, Authorization
from requests import get
response = get("https://httpbin.org/bearer", headers=Headers(Authorization("Bearer", "qwerty")))
print(response.status_code) # 200
2nd example usage
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
now retain the following :
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"
See the complete list of available header class in the full documentation.
Also, you can create your own custom header object using the class kiss_headers.CustomHeader
.
📜 Documentation
See the full documentation for advanced usages : www.kiss-headers.tech
👤 Contributing
Contributions, issues and feature requests are very much welcome.
Feel free to check issues page if you want to contribute.
Do not forget to run pip install pytest pytest-cov codecov isort black requests mypy
before you start working on your fork.
Also check .travis.yml
file to see what command is expected to return OK.
📝 License
Copyright © 2020 Ahmed TAHRI @Ousret.
This project is MIT licensed.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for kiss_headers-2.0.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 00a26b3caa04f622fce7912d521dfeba8cf4887c536d9d72648a78c87b8c0440 |
|
MD5 | 4f60beb70be8faed4f1b7f9f4e822433 |
|
BLAKE2b-256 | bfbc957d223d3ac21733152f0692b5fc395097a8c4522eac5d940403c5a01f63 |