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?

  • Pennomi@lemmy.world
    link
    fedilink
    English
    arrow-up
    5
    ·
    edit-2
    4 months ago

    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@lemmy.worldOP
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      4 months ago

      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@lemmy.world
        link
        fedilink
        English
        arrow-up
        2
        ·
        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.

  • best_username_ever@sh.itjust.works
    link
    fedilink
    arrow-up
    2
    ·
    edit-2
    4 months ago

    Not what you’re looking for but: use Conan and a third party library. Your problem is not properly defined and my first reaction is “WHY do you want to store headers?” Why? You have a solution in search of a problem. Why? What do you really want to do? What are you trying to achieve? Go further in your investigations because “storing headers” is not your purpose in life, think bigger, higher level!

    • drem@lemmy.worldOP
      link
      fedilink
      arrow-up
      2
      ·
      4 months ago

      I would like to make a http server to see how the web works. I would like to get a job too.

      • best_username_ever@sh.itjust.works
        link
        fedilink
        arrow-up
        2
        ·
        edit-2
        4 months ago

        Do it in Python. It’s a PITA in C++ if you don’t know that language. Read A Tour of C++ instead.

        Python for the web, C++ for everything else. C++ is still popular, especially the modern version and you’ll get a good salary. But you should learn HTTP with other tools like Python.

        With both Python and C++ skills, you’ll get jobs everywhere. Python for tools and CI, C++ for applications.

        • drem@lemmy.worldOP
          link
          fedilink
          arrow-up
          1
          ·
          4 months ago

          Thank you for your advice, I’ve experimented with python, but I couldn’ really read and understand how more complex examples work. I tried to implement backpropagation shown in a python example and couldn’t, because it wasn’t clear what type each variable was. I like C++ mutch more and I think I’m not a beginner at this point. Would you mind answering how important do you think are these coding projects for getting a job?

          • best_username_ever@sh.itjust.works
            link
            fedilink
            arrow-up
            2
            ·
            4 months ago

            Every personal project is good as long as you try to make it professional. It doesn’t need to be perfect but you can show that you made an effort to clean your stuff. I’m biased because I’ve been doing C++ for a long time, but every language is worth it. Also what I’m saying may be specific to my location and kind of job, but I tend to think it’s kind of universal. To get a job, you need to show that you have a broad view of the software ecosystem.

            For example for C++, you can do:

            • C++ code, maybe built with CMake or SLN because those are universal tools
            • linter and formatting (clang format, cppcheck, SonarLint, etc.)
            • good commits and branching strategy
            • some comments in your code
            • some documentation
            • unit-tests
            • maybe some scripts in Python for the CI
            • use a package manager like Conan or VCPKG because any company will pick random libraries all over the internet, you can’t do everything from scratch

            I think it applies to every language, just change C++ to any other language but the other bullet points don’t change. And if you have some code to review, post it here and we’ll read it like a real “merge request,” it can be interesting.

            • drem@lemmy.worldOP
              link
              fedilink
              arrow-up
              1
              ·
              4 months ago

              Thank you for this useful advice, I will make sure my project follows your suggestions!