HTTP Header, Content-Length auslesen ( String nach ABC und vor XYZ ausschneiden)



  • Hi,

    ich durchstöber grade die string referenzen auf der Suche nach einer Lösung für mein Problem 😉

    Ich möchte aus dem HTTP Header den Wert von Content-Length "herausschneiden".

    Da fiel mir natürlich zuerst "substr" auf. Jedoch kann ich hier nur den Anfang wegschneiden und nicht was nach Content-Length kommt.

    Beispiel:

    h_startpos = header.find("Content-Length:");
        con_len = header.substr(h_startpos +15);
    

    ergibt

    155bytes
    Connection: closed
    Content-Type: text/plain

    --HEADER ENDE--

    da ich ja nicht weiß wieviel bytes gesendet werden ob 10 100 oder 1000 kann ich mit dem zweiten parameter von substr natürlich nichts anfangen.

    Wer hat den Geistesblitz und eine Idee wie man das lösen könnte?
    Oder anders gefragt: Gibt es alternative Funktionen die mir noch nicht bekannt sind`?

    EDIT:

    Ich glaube den Geistesblitz habe ich gerade mit "erase" bekommen 😉



  • habs nun so gelöst...

    Trotzdem Danke 😉

    size_t h_startpos;
        size_t h_endpos;
        string con_len;
        unsigned int http_content_length;
    
        h_startpos = header.find("Content-Length:");
        header.erase(0, h_startpos + 15);
    
        h_endpos = header.find("Connection:");
        header.erase(h_endpos-2);
    
        //STR TO INT
        std::stringstream hct(header);
        hct >> http_content_length;
    
        //CHECK FOR SAME SIZE
        if(content.capacity() == http_content_length) {
            cout << "RECV DATA OK" << endl;
        }
    

  • Administrator

    Sag mal, wann hörst du auf mit dem rumprobieren und lernst C++? Du hast schon wieder etwas produziert, was nicht immer funktionieren könnte. Schon mal überprüft, was capacity wirklich zurückgibt?
    http://www.cplusplus.com/reference/string/string/capacity/

    Oder vielleicht anders gefragt, weisst du überhaupt wie std::string intern funktioniert?

    Grüssli



  • Und was machst du, wenn auf Content-Length nicht Connection folgt?
    Stattdessen einfach nach dem Zeilenende suchen und bis dorthin ausschneiden.
    Oder wenn du darauf vertrauen möchtest, dass die Einheit bytes ist, meinetwegen auch bis zum nächsten Leerzeichen.

    static const char* contentLengthString="Content-Length:";
    size_t startPos=header.find(contentLengthString);
    if (startPos!=header.end()) //Content-Length ist nicht verpflichtend
    {
      startPos+=strlen(contentLengthString);
      size_t endPos=startPos:
      while (endPos<header.length() && header[endPos]!='\r' && header[endPos]!='\n')endPos++;
      if (endPos<header.length())
      {
        string lenStr=header.substr(startPos,endPos-startPos);
        //...
      }
      else es_gab_kein_Zeilenende();
    }
    else es_gibt_kein_Content_Length();
    


  • nun ich hatte hier http://learningcppisfun.blogspot.com/2007/01/vectors-size-and-capacity.html einen vergleich gefunden was size und capacity angeht.. und.. ich sah capacity als passend an 😉

    also doch size? mhh.. wird zeit für ein buch oder ein englisch kurs 😉



  • Fairerweise muss man sagen, dass der Autor dieses Artikels es nicht gelernt hat, sich kurz zu fassen, was nur Verwirrung stiftet.
    size() gibt dir an, wie viele Zeichen der String tatsächlich hat, capacity() gibt an, für wie viele Zeichen bereits Platz reserviert worden ist. Erst wenn capacity() überschritten wird, muss mehr Speicherplatz angefordert werden und der String umkopiert werden.



  • Stattdessen einfach nach dem Zeilenende suchen und bis dorthin ausschneiden.

    die überlegung hatte ich auch schon, ist aber noch nicht implementiert 😉

    PS.: dein code sieht schön aus.. aber da brauch ich erstmal (morgen) 10min bis ich weiß was da vor sich geht 😉


Anmelden zum Antworten