View Full Version : QT HTTP Post issue when server requires cookies

22nd December 2010, 14:10
I have been trying this whole day with no success. Please help in solving the issue. On googling I found many users had this issue but nowhere I could find a solution.

I am trying to do HTTP post in QT C++ & I have already tried doing that in python (My question is not a python question, so Qt pros please help).. I know, I am somewhere wrong in handling cookies and all, so please help. Please provide probable solutions.

In python, code is clean and simple. I have stripped error handling and all extra things to make it simple.

url = 'http://www.example.com/'
data = 'username=abc&password=passwd'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(c j))
usock = opener.open(url, data)
#>>>>>> NOW, I have the cookiejar <<<<<<<<<

opener.addheaders = [('Referer','http://www.example.com/xyz.php'),('User-Agent','Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv: Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0')]
data_to_send = 'ABCDEFGH'
url_send = "http://www.example.com/xyz.php"
send = opener.open(url_send,data_to_send)

The Qt equivalent:-

void SmsSender::sendToMyCantos()
manager = new QNetworkAccessManager(this);
manager->setCookieJar(new QNetworkCookieJar(manager));
connect(manager,SIGNAL(finished(QNetworkReply*)),t his,SLOT(replyFinished(QNetworkReply*)));
//>>>>>> So, I feel that I have CookieJar now to make POST <<<<<<<

request.setRawHeader("User-Agent","Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv: Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0");



Now the issue is that I am not able to do the same in QT. Problems I am facing:

Handling cookies
Handling redirects (HTTP 302)
Retaining cookies to make future POST

All this is done automagically in python. Below, the code is not directly related, but I coded this to allow redirects in the POST.. The code is very similar to the link I used to make it.. (http://wiki.forum.nokia.com/index.php/CS001432_-_Handling_an_HTTP_redirect_with_QNetworkAccessMana ger)

QUrl SmsSender::redirectUrl(const QUrl& possibleRedirectUrl,
const QUrl& oldRedirectUrl) const {
//Checking infinite resursions
QUrl redirectUrl;
if(!possibleRedirectUrl.isEmpty() &&
possibleRedirectUrl != oldRedirectUrl) {
redirectUrl = possibleRedirectUrl;
return redirectUrl;

void SmsSender::replyFinished(QNetworkReply *reply)
QVariant possibleRedirectUrl =
reply->attribute(QNetworkRequest::RedirectionTargetAttrib ute);
QVariant data_size = reply->header(QNetworkRequest::ContentLengthHeader);

/* We'll deduct if the redirection is valid in the redirectUrl function */
_urlRedirectedTo = this->redirectUrl(possibleRedirectUrl.toUrl(),

/* If the URL is not empty, we're being redirected. */
if(!_urlRedirectedTo.isEmpty()) {
QString text = QString("SmsSender::replyFinished: Redirected to ")

// Do again in case we have more redirections

QString text = QString("SmsSender::replyFinished: Arrived to ")


QNetworkAccessManager* SmsSender::createQNAM() {
QNetworkAccessManager* qnam = new QNetworkAccessManager(this);
/* We'll handle the finished reply in replyFinished */
connect(qnam, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
return qnam;