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; }
-
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
capacitywirklich zurückgibt?
http://www.cplusplus.com/reference/string/string/capacity/Oder vielleicht anders gefragt, weisst du überhaupt wie
std::stringintern 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
