this post was submitted on 21 Jul 2024
19 points (100.0% liked)

Learn Programming

1625 readers
2 users here now

Posting Etiquette

  1. Ask the main part of your question in the title. This should be concise but informative.

  2. Provide everything up front. Don't make people fish for more details in the comments. Provide background information and examples.

  3. Be present for follow up questions. Don't ask for help and run away. Stick around to answer questions and provide more details.

  4. Ask about the problem you're trying to solve. Don't focus too much on debugging your exact solution, as you may be going down the wrong path. Include as much information as you can about what you ultimately are trying to achieve. See more on this here: https://xyproblem.info/

Icon base by Delapouite under CC BY 3.0 with modifications to add a gradient

founded 1 year ago
MODERATORS
 

Hello, I would like to store these http headers in classes:

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

As you can see, many have unique data (numbers, strings, list of strings). I would like to:

  • store a header name
  • store list of possible options for that header (or store if it's a number)
  • read an input header and store and return the found option / list of options / number
  • make adding new types of headers as easy as possible

Is making hard coded classes for every type of header viable? How would this be done in the cleanest way possible?

you are viewing a single comment's thread
view the rest of the comments
[–] pennomi 5 points 4 months ago* (last edited 4 months ago) (1 children)

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).

[–] drem 1 points 4 months ago* (last edited 4 months ago) (1 children)

to access “friendly” parsed versions of commonly used data

What do you mean by this? And where is the header processing done? And btw thanks for your answer, I knew I was doing something wrong.

Edit: Are the possible options for headers stored in for example a header class, or are they just checked when clients are processed?

[–] pennomi 2 points 4 months ago

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.

Hopefully that all makes sense.