The majority of HTTP frameworks I’ve used store headers in a dictionary, because the common denominator between all headers is that they are string keys and string values.
To clarify: you might think that some headers are lists of strings, but that’s not actually true - the user can send any string to you. You really open yourself up to parsing problems if somebody transmits a header in a format that cannot be represented by your data structure.
Oftentimes what a framework will do is store the headers in the dictionary, and then provide getters and setters to access “friendly” parsed versions of commonly used data (but only if it parses correctly).
So for example in “requests”, a popular http framework in Python, there’s a class for the Response object. On that object you can access the special header dictionary at response.headers. Check the docs here under the section Response Headers
Basically they make a special dictionary that allows headers to be case-insensitive, and combining headers that are provided twice.
But they also provide a special property response.encoding which derives from the Content-Type header, just for convenience.