Seite 1 von 1

HttpClient() und HttpRequest()

Verfasst: So, 17. Apr 2022 14:51
von georg
Hallo,


aktuell versuche ich, von wget auf die Http...()-Klassen umzustellen.

Allerdings scheitere ich schon an der ersten Hürde. Es geht darum, eine automatisierte Anmeldung in einem Forum durchzuführen.

Hier mal die relevanten Code-Ausschnitte:

Code: Alles auswählen

   // Seite lesen und Cookies erfragen
   cDomain := "https://mein-ganz-tolles-forum.de"
   oHTTP := HttpClient():new(cDomain)
   oHTTPReq := HTTPRequestMessage():new(cDomain)
   oResponse := oHTTP:send(oHTTPReq)
   aCookies := oResponse:getCookies()
   cContent := oResponse:getContent()
Das funktioniert, und ich bekomme auch die Einstiegscookies sowie einige Werte, die im Login-Formular eingebettet sind und bei der Anmeldung als POST-Daten übergeben werden müssen.

Im nächsten Schritt versuche ich, mich anzumelden:

Code: Alles auswählen

   cReqPage := cDomain + "/login.php?do=login"
   oHTTP := HttpClient():new(cReqPage)
   oHTTPReq := HTTPRequestMessage():new(cReqPage)
   nLen := Len(aCookies)
   FOR nI := 1 TO nLen
      oHTTPReq:setCookie(aCookies[nI])
   NEXT
Dazu wird die URL angepasst (ich habe die Anmeldung in Firefox durchgeführt und mittels F12 und "Network" protokolliert, was genau ausgetauscht wird), die Cookies aus dem ersten Schritt im HttpRequest()-Objekt hinterlegt. Dann folgen die Anmeldeparameter, ebenfalls aus dem Network-Trace "abgekupfert":

Code: Alles auswählen

   oHTTPReq:setParameter("vb_login_username",        "username")
   oHTTPReq:setParameter("vb_login_password",        "geheimespasswort")
   oHTTPReq:setParameter("cookieuser",               1)
   oHTTPReq:setParameter("s",                        "---")  // aus cContent ausgelesen
   oHTTPReq:setParameter("securitytoken",            cSecToken)    // dito.
   oHTTPReq:setParameter("do",                       "login")
   oHTTPReq:setParameter("vb_login_md5password",     "---")    // dito
   oHTTPReq:setParameter("vb_login_md5password_utf", "---")    // dito
   oHTTPReq:setMethod("POST")
   oHTTP:setMethod("POST")
   oResponse := oHTTP:send(oHTTPReq)
Beim Ausführen der :send()-Methode hängt sich das Programm dann auf. Strg-C hilft, aber das bringt mich im automatisierten Anmeldeprozess nicht weiter.

Da ja etliche hier schon damit arbeiten, habt Ihr (hoffentlich) einen Hinweis, was ich falsch mache, oder wie ich es besser gestalten kann?

Re: HttpClient() und HttpRequest()

Verfasst: Mo, 18. Apr 2022 11:33
von Dominik Krebs
Hallo Georg,
Was bedeutet denn, hängt sich auf?
Gibt es eine Fehlermeldung?

Der Code sieht gut aus, ich spreche die Response aber immer direkt an.

Code: Alles auswählen

oHTTPClient:httpRequest:setCookie(...)
Denn mir dem erzeugen des HTTPClienten hast du bereits eine neue HTTPRequest Instanz im Objekt enthalten, und musst es in der :send() Methode auch nicht übergeben.

Re: HttpClient() und HttpRequest()

Verfasst: Mo, 18. Apr 2022 13:15
von georg
Hallo, Dominik -


"hängt sich auf" heisst genau das. Im Debugger führe ich den Schritt :send() aus, und dann tut sich im Programm nichts mehr. Es hängt. Selbst nach einer halben Stunde tut sich nichts.

Einzige Option: abbrechen.

Re: HttpClient() und HttpRequest()

Verfasst: Mo, 18. Apr 2022 14:03
von Jan
Hallo Georg,

nach meinen bisherigen Erfahrungen sagt daß, das Dein HTTPClient auf die Antwort wartet, die aber nicht kommt. Und der angesprochene Server sendet auch kein Timeout. Also wartet Dein HTTPClient bis der Strom mal irgend wann ausfällt.

Ich setze voraus das der Server korrekt arbeitet. Dann sprichst Du also wohl den Server so falsch an, so das der gar nicht merkt das Du was von ihm willst - sonst würde der Dir ja irgend eine Meldung zurück geben, und wenn es nur eine Fehlermeldung wäre.

Jan

Re: HttpClient() und HttpRequest()

Verfasst: Mo, 18. Apr 2022 14:35
von georg
Hallo, Jan -


ja, davon gehe ich auch aus. Und weil die Dokumentation solche Dinge wie POST etc. noch nicht abbildet, habe ich halt hier gefragt.

Aber ich habe jetzt schon mal ein paar Ansatzpunkte, wo ich testen kann.

Re: HttpClient() und HttpRequest()

Verfasst: Mo, 18. Apr 2022 18:49
von ramses
Hallo Georg

schau doch mal in der Doku ob du ein Timeout für :send() einstellen kannst.

Jedenfalls bei xb2.net lassen sich verschiedene Timeout einstellen die genau dazu da sind "hängende" Operationen zu beenden bevor der Strom ausgeht.....

Re: HttpClient() und HttpRequest()

Verfasst: Mo, 18. Apr 2022 18:51
von Dominik Krebs

Code: Alles auswählen


:setTimeout( [<nResolveTimeout>], [<nConnectTimeout>], [<nSendTimeout>], [<nReceiveTimeout>] ) --> self