QHttp cookies

Alles rund um die Programmierung mit Qt
Antworten
XxM4ST3RxX
Beiträge: 39
Registriert: 14. Oktober 2008 19:50

QHttp cookies

Beitrag von XxM4ST3RxX »

hallo mein problem ist folgendes:

ich möchte mich auf einer webseite einloggen und eine datei über POST uploaden, aber ich schaffe nicht mal den login weil ich die cookies die ich erhalte noch mit senden muss. hat jemmand vielleicht ein beispiel code oder könnte mir auf die sprünge helfen.

mein code sieht bisher so aus :

Code: Alles auswählen

    QUrl url("http://www.uploaded.to/login");
    QByteArray data("email=***&password=***");

    http->setHost(url.host());
    http->post(url.path(), data);
im responseHeader erhalte ich

(QPair("Date","Sat, 18 Apr 2009 18:57:25 GMT") , QPair("Server","Apache/2.2.8 (Ubuntu) mod_python/3.3.1 Python/2.5.2") , QPair("Location","/login?coo=1") , QPair("Cache-Control","no-cache="set-cookie"") , QPair("Set-Cookie","lang=en; path=/; domain=.uploaded.to; expires=Tue, 17-Apr-2012 18:57:25 GMT") , QPair("Set-Cookie","auth=5082375f8598adace94b9151b0f781041792bd; path=/; domain=.uploaded.to; expires=Tue, 17-Apr-2012 18:57:25 GMT") , QPair("Connection","close") , QPair("Transfer-Encoding","chunked") , QPair("Content-Type","text/plain") )

und im http:

""<p>The document has moved <a href="/login?coo=1">here</a></p>"
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

Cookies werden automatisch angenommen und bei kommenden Anfragen mitversendet.

Ich denke bei deiner Anfrage fehlt der Content-Type-Header.

PS: Falls du gerade anfängst mit QHttp: Es wird empfohlen, stattdessen QNetworkAccessManager zu verwenden. Die Handhabung ist etwas komfortabler.

MfG,
FaS
XxM4ST3RxX
Beiträge: 39
Registriert: 14. Oktober 2008 19:50

Beitrag von XxM4ST3RxX »

ja ich habe erst mit QHttp angefangen, QNetworkAccessManager habe ich auch schon getestet und bin wieder zurück zu QHttp weil ich auch https brauche und das hat bei mir nicht so geklappt. Und das mit den Content-Type-Header könntest du mir vll ein kleines beispiel liefern, kenne mich nähmlich nicht so gut aus mit dem http protokol habe es mir nur mal flüchtig angeschaut.
XxM4ST3RxX
Beiträge: 39
Registriert: 14. Oktober 2008 19:50

Beitrag von XxM4ST3RxX »

habe es jetzt mit dem QNetworkAccessManager hinbekommen nur ist der code meiner meinung nach ein bissl komisch, hat jemmand vll ein besseren umsetzungs vorschlag ?

hier ist mein code für den login ...

Code: Alles auswählen

#include "upload.h"

Upload::Upload() :
        manager(new QNetworkAccessManager),
        cookieJar(new QNetworkCookieJar)
{
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(finished(QNetworkReply*)));

    manager->setCookieJar(cookieJar);
}

Upload::~Upload()
{
    delete manager;
    delete cookieJar;
}

void Upload::request()
{
    QNetworkReply *cookieReply = manager->post(QNetworkRequest(QUrl("http://www.uploaded.to/login")), "email=****&password=****");
    connect(cookieReply, SIGNAL(finished()),
            this, SLOT(haveCookie()));
}

void Upload::haveCookie()
{
    cookieJar->cookiesForUrl(QUrl("http://www.uploaded.to/login"));
    manager->get(QNetworkRequest(QUrl("http://www.uploaded.to/home")));
}

void Upload::finished(QNetworkReply *reply)
{
    qDebug() << reply->readAll();
}
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

Header
Naja Google meint man muss den Content-Type "application/x-www-form-urlencoded" im Header angeben, ist ja nun wirklich nicht schwer zu finden wenn man nach http post request oder sowas sucht. Außerdem solltest du dir anschauen, wie denn der Browser das macht, z.B. indem man den Traffic mit der Firefox-Erweiterung "Live HTTP headers" verfolgt.
Und in der Qt-Dokumentation findet man dann setHeader(...).

Cookies
Als ich sagte, Cookies werden automatisch übernommen, meinte ich das auch so. Wenn du nicht weißt, was man mit diesen cookieJar-Funktionen macht, lass sie besser alle komplett weg. Dein "cookieJar->cookiesForUrl(...)" beispielsweise hat nichtmal einen Effekt. Du scheinst die Doku nicht zu lesen.

QNetworkReply
Vielleicht solle man sich über die Lebensdauer dieses Objektes gedanken machen, ich bin mir da aber auch nicht sicher. Ich deleteLater es immer im reply-finished-Slot.

HTTPS
Das sollte mit QNetworkAccessManager genauso funktionieren wie mit QHttp. Aber ich bin daran gescheitert, HTTPS-Support überhaupt erstmal zu aktivieren. Man muss doch dafür Qt mit OpenSSL konfigurieren und kompilieren, hatte dabei (unter Win) merkwürdige Kompilierungsfehler.. Wenn du das hinbekommen hast, wäre ich dir für Ratschläge dankbar :-)

MfG,
FaS
XxM4ST3RxX
Beiträge: 39
Registriert: 14. Oktober 2008 19:50

Beitrag von XxM4ST3RxX »

das mit der cookieJar habe ich jetzt auch entfernt, danke noch dafür wegen dem QNetworkReply, ich weiss das ich den nicht deletet habe war nur ein testcode und wegen https, habe leider auch gemerkt das beim binary release nicht mitcompiled war, muss das auch noch mal versuchen ...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wenn es absolut nicht klappt mit den Cookies, ist es vllt. dieser bug hier:
http://code.google.com/p/arora/issues/detail?id=244

Lasset uns beten, dass QtSoftware diese Fixes aufnimmt :)
Antworten