HTTP POST Webseite steuern
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Welche Grundlagen?
C++ habe ich schon das wichtigste durch ein Buch gelesen. Zu HTTP habe ich noch wenig Erfahrungen deswegen bin ich ja auch auf der Suche nach einem Tutorial und einer entsprechenden Klasse.
-
Du könntest das ganze Prozedere mal händisch durchführen und den Netzverkehr mit z.B. Wireshark aufnehmen. Dann siehst du, was gesendet wird, liest dir noch den Wiki-Artikel zu HTTP durch und die Anwendung steht.
-
Also mit Wireshark habe ich das ganze bereits aufgezeichnet. Den Wiki Artikel werde ich mir noch durchlesen. Mir ging es ja vorrangig um die Implementierung in C++ und nicht darum, was gesendet werden muss.
-
-
Also hier mal der Wireshark Log:
POST /start.login HTTP/1.1\r\n [Expert Info (Chat/Sequence): POST /start.login HTTP/1.1\r\n] [Message: POST /start.login HTTP/1.1\r\n] [Severity level: Chat] [Group: Sequence] Request Method: POST Request URI: /start.login Request Version: HTTP/1.1 Host: IP\r\n User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n Accept-Encoding: gzip,deflate\r\n Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n Keep-Alive: 115\r\n Connection: keep-alive\r\n Referer: http://IP/hcti_start_passwort.htm\r\n Content-Type: application/x-www-form-urlencoded\r\n Content-Length: 11\r\n [Content length: 11] \r\n Line-based text data: application/x-www-form-urlencoded P1=PASSWORD
Da dürfte doch da von SFML passen, oder?
sf::Http::Request Request; Request.SetMethod(sf::Http::Request::Post); Request.SetURI("/start.login"); Request.SetBody(""); Request.SetHttpVersion(1, 1); Request.SetField("P1", "PASSWORD"); sf::Http Http; Http.SetHost("IP"); Http.SendRequest(Request);
-
Also es klappt in soweit, dass ich das Routerinterface danach nicht mehr öffnen kann ;-). Also irgend was mache ich falsch. Als Status bekomme ich übrigens ein:
InvalidResponse = 1000 beim ersten mal und ein:
ConnectionFailed = 1001 beim 2. mal.
-
Ich glaube, dass "P1=PASSWORD" eher der Body ist und nicht ein Header-Feld. Eventuell also so
sf::Http::Request Request; Request.SetMethod(sf::Http::Request::Post); Request.SetURI("/start.login"); Request.SetHttpVersion(1, 1); Request.SetBody("P1=PASSWORD"); Request.SetField( "Content-Type", "application/x-www-form-urlencoded" ); Request.SetField( "Content-Length", boost::lexical_cast<std::string>(Request.GetBody().size()) );
(boost::lexical_cast hier als einfaches itoa)
Ansonsten müsstest du wahrscheinlich auch mal den SFML-HTTP-Verkehr aufzeichnen und mit dem Browser-Verkehr vergleichen.
-
Geht leider immer noch nicht das Resultat ist das gleiche wie oben. Erst 1000 dann 1001 und der Server ist abgeschmiert. Aufzeichnen muss ich sehen, weil auf meinem Computer auf dem ich entwickle will das Wireshark nicht so recht.
Vlt hilft das. Das habe ich für meinen Router gefunden:
curl "192.168.2.1/start.login" -d "P1=DEIN PASSWORT" -c cookies.txt --cookie cookies.txt curl "192.168.2.1/pppctl.cmd?action=0" --cookie cookies.txt curl "192.168.2.1/pppctl.cmd?action=1" --cookie cookies.txt
-
Hm. Man könnte noch Accept-CharSet usw als Header-Felder mit einsetzen, aber ansonsten sieht der initiale Post-Request für mich OK aus.
Aus der Response (wenn sie mal klappt) musst du dann wohl den Cookie extrahieren und bei den nächsten (anscheinend GET-) Requests mitschicken.Du könntest auch mal Debuggen und in sf::Http::Response::FromString einen Breakpoint setzen. Dann siehst du ja die Antwort des Routers und kannst sehen, was da schief läuft. Vielleicht sendet er die Response einfach ein wenig off-Standard, so dass SFML die Daten nicht richtig extrahieren kann. In dem Fall könntest du den ganzen Krams direkt roh über Sockets schicken/empfangen (was aber aufwendig ist). Oder mal mit libcurl versuchen, per Commandline scheint's ja zu funktionieren.
-
Also ich kann mir nur noch nicht erklären, wieso der Server abschmiert. Wie funktioniert das Debugen, das habe ich noch nie gemacht. Also wo bekomme ich dann den Netzwerkverkehr zu sehen?
-
C++ Anwender schrieb:
Wie funktioniert das Debugen, das habe ich noch nie gemacht.
Das kommt auf deine IDE drauf an. Unter Windows mit dem Visual Studio zum Beispiel kannst du links neben eine Zeile klicken (in den grauen Rand), dann erscheint da ein dicker roter Punkt (alternativ Rechtsklick auf die Zeile und dann da irgendwo "Breakpoint" auswählen).
Ich würde den Breakpoint in die Zeile
sf::Http::Response Response = Http.SendRequest(Request);
setzen, dann mit "F5" (im VS) den Debug-Modus starten und mit F10/F11 kannst du dann über Anweisungen hinweg bzw in Funktionen rein springen. Wenn du mit der Maus über Variablen-Namen fährst, siehst du deren Wert. Natürlich musst du dein Programm im Debug-Modus (nicht Release) erstellt haben und gegen die Debug-Library von SFML gelinkt haben.