{
Q_OBJECT
public:
int getStatusCode(){return statusCode;}
QString getLocation
(){return location;
} bool isRequestAborted(){return httpRequestAborted;}
bool isRedirecting(){return needRedirect;}
void download();
private slots:
void httpRequestFinished(int requestId, bool error);
signals:
void requestFinished();
private:
bool httpRequestAborted;
int httpGetId;
int statusCode;
};
InternetJob
::InternetJob(const QString &u
) : url(u)
{
connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(httpRequestFinished(int, bool)));
download();
}
void InternetJob::download()
{
for(int i = 0; i < url.queryItems().size(); ) {
query += url.queryItems().at(i).first + "=" + url.queryItems().at(i).second;
if(++i < url.queryItems().size())
query += "&";
}
if(url.queryItems().size() > 0)
header.
setRequest("GET", url.
path() + "?" + QUrl::toPercentEncoding(query,
"&="));
else
header.setRequest("GET", url.path());
header.setValue("Host", url.host());
httpRequestAborted = false;
http->setHost(url.host());
httpGetId = http->request(header);
qDebug() << "job id = " << httpGetId;
}
{
statusCode = responseHeader.statusCode();
switch(statusCode) {
case 200:
case 301:
case 303:
case 307:
break;
case 302:
location = responseHeader.value("Location");
// Remove trailing "?"
location.remove(rx.indexIn(location), 1);
httpRequestAborted = true;
http->abort();
break;
default:
qDebug
() <<
QString(trUtf8
("Download failed: %1.").
arg(responseHeader.
reasonPhrase()));
httpRequestAborted = true;
http->abort();
}
}
void InternetJob::httpRequestFinished(int requestId, bool error)
{
if (requestId != httpGetId)
return;
qDebug() << "job finished = " << requestId;
if (httpRequestAborted) {
qDebug() << "Request Aborted. Status Code: " << statusCode;
if(statusCode == 302) {
url.setUrl(location);
download();
return;
}
else {
emit requestFinished();
return;
}
}
if(error)
qDebug
() <<
QString(trUtf8
("Download failed: %1.").
arg(http
->errorString
()));
else
data = http->readAll();
emit requestFinished();
}
class InternetJob: public QObject
{
Q_OBJECT
public:
InternetJob(const QString &u);
QByteArray getData(){return data;}
int getStatusCode(){return statusCode;}
QString getLocation(){return location;}
bool isRequestAborted(){return httpRequestAborted;}
bool isRedirecting(){return needRedirect;}
void download();
private slots:
void httpRequestFinished(int requestId, bool error);
void readResponseHeader(const QHttpResponseHeader &responseHeader);
signals:
void requestFinished();
private:
QHttp *http;
QUrl url;
bool httpRequestAborted;
int httpGetId;
QByteArray data;
int statusCode;
QString location;
};
InternetJob::InternetJob(const QString &u)
: url(u)
{
http = new QHttp;
connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)), this, SLOT(readResponseHeader(const QHttpResponseHeader &)));
connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(httpRequestFinished(int, bool)));
download();
}
void InternetJob::download()
{
QString query;
for(int i = 0; i < url.queryItems().size(); ) {
query += url.queryItems().at(i).first + "=" + url.queryItems().at(i).second;
if(++i < url.queryItems().size())
query += "&";
}
QHttpRequestHeader header;
if(url.queryItems().size() > 0)
header.setRequest("GET", url.path() + "?" + QUrl::toPercentEncoding(query,"&="));
else
header.setRequest("GET", url.path());
header.setValue("Host", url.host());
httpRequestAborted = false;
http->setHost(url.host());
httpGetId = http->request(header);
qDebug() << "job id = " << httpGetId;
}
void InternetJob::readResponseHeader(const QHttpResponseHeader &responseHeader)
{
statusCode = responseHeader.statusCode();
QRegExp rx("\?$");
switch(statusCode) {
case 200:
case 301:
case 303:
case 307:
break;
case 302:
location = responseHeader.value("Location");
// Remove trailing "?"
location.remove(rx.indexIn(location), 1);
httpRequestAborted = true;
http->abort();
break;
default:
qDebug() << QString(trUtf8("Download failed: %1.").arg(responseHeader.reasonPhrase()));
httpRequestAborted = true;
http->abort();
}
}
void InternetJob::httpRequestFinished(int requestId, bool error)
{
if (requestId != httpGetId)
return;
qDebug() << "job finished = " << requestId;
if (httpRequestAborted) {
qDebug() << "Request Aborted. Status Code: " << statusCode;
if(statusCode == 302) {
url.setUrl(location);
download();
return;
}
else {
emit requestFinished();
return;
}
}
if(error)
qDebug() << QString(trUtf8("Download failed: %1.").arg(http->errorString()));
else
data = http->readAll();
emit requestFinished();
}
To copy to clipboard, switch view to plain text mode
Bookmarks