Skip to content

Commit aad7010

Browse files
committed
Added HTTPHeaders
1 parent 11ae0bc commit aad7010

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

adafruit_httpserver/headers.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2022 Dan Halbert for Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: MIT
4+
"""
5+
`adafruit_httpserver.headers.HTTPHeaders`
6+
====================================================
7+
* Author(s): Michał Pokusa
8+
"""
9+
10+
try:
11+
from typing import Dict, Tuple
12+
except ImportError:
13+
pass
14+
15+
16+
class HTTPHeaders:
17+
"""
18+
A dict-like object for storing HTTP headers.
19+
20+
Allows access to headers using **case insensitive** names.
21+
22+
Does **not** implement all dict methods.
23+
24+
Examples::
25+
26+
headers = HTTPHeaders({"Content-Type": "text/html", "Content-Length": "1024"})
27+
28+
len(headers)
29+
# 2
30+
31+
headers.setdefault("Access-Control-Allow-Origin", "*")
32+
headers["Access-Control-Allow-Origin"]
33+
# '*'
34+
35+
headers["Content-Length"]
36+
# '1024'
37+
38+
headers["content-type"]
39+
# 'text/html'
40+
41+
"CONTENT-TYPE" in headers
42+
# True
43+
"""
44+
45+
_storage: Dict[str, Tuple[str, str]]
46+
47+
def __init__(self, headers: Dict[str, str] = None) -> None:
48+
49+
headers = headers or {}
50+
51+
self._storage = {key.lower(): [key, value] for key, value in headers.items()}
52+
53+
def get(self, name: str, default: str = None):
54+
"""Returns the value for the given header name, or default if not found."""
55+
return self._storage.get(name.lower(), [None, default])[1]
56+
57+
def setdefault(self, name: str, default: str = None):
58+
"""Sets the value for the given header name if it does not exist."""
59+
return self._storage.setdefault(name.lower(), [name, default])[1]
60+
61+
def items(self):
62+
"""Returns a list of (name, value) tuples."""
63+
return dict(self._storage.values()).items()
64+
65+
def keys(self):
66+
"""Returns a list of header names."""
67+
return dict(self._storage.values()).keys()
68+
69+
def values(self):
70+
"""Returns a list of header values."""
71+
return dict(self._storage.values()).values()
72+
73+
def update(self, headers: Dict[str, str]):
74+
"""Updates the headers with the given dict."""
75+
return self._storage.update({key.lower(): [key, value] for key, value in headers.items()})
76+
77+
def copy(self):
78+
"""Returns a copy of the headers."""
79+
return HTTPHeaders(dict(self._storage.values()))
80+
81+
def __getitem__(self, name: str):
82+
return self._storage[name.lower()][1]
83+
84+
def __setitem__(self, name: str, value: str):
85+
self._storage[name.lower()] = [name, value]
86+
87+
def __delitem__(self, name: str):
88+
del self._storage[name.lower()]
89+
90+
def __iter__(self):
91+
return iter(dict(self._storage.values()))
92+
93+
def __len__(self):
94+
return len(self._storage)
95+
96+
def __contains__(self, key: str):
97+
return key.lower() in self._storage.keys()
98+
99+
def __repr__(self):
100+
return f'{self.__class__.__name__}({dict(self._storage.values())})'

0 commit comments

Comments
 (0)