[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/KDE/4.3/kdelibs/kio/kio
From: Dawit Alemayehu <adawit () kde ! org>
Date: 2010-01-16 17:08:24
Message-ID: 1263661704.053016.4997.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 1075749 by adawit:
Backported the send correct redirection code up the chain fix
M +23 -12 accessmanager.cpp
M +42 -27 accessmanagerreply_p.cpp
M +3 -1 accessmanagerreply_p.h
--- branches/KDE/4.3/kdelibs/kio/kio/accessmanager.cpp #1075748:1075749
@@ -25,13 +25,14 @@
#include "accessmanagerreply_p.h"
-#include <QtNetwork/QNetworkRequest>
-#include <QtNetwork/QNetworkReply>
-
#include <kdebug.h>
#include <kio/job.h>
#include <kio/scheduler.h>
+#include <QtNetwork/QNetworkRequest>
+#include <QtNetwork/QNetworkReply>
+
+
namespace KIO {
class AccessManager::AccessManagerPrivate
@@ -108,12 +109,15 @@
kioJob->addMetaData(d->metaDataForRequest(req));
if ( op == PostOperation && !kioJob->metaData().contains("content-type")) {
+ QString contentType (QLatin1String("Content-Type: "));
QVariant header = req.header(QNetworkRequest::ContentTypeHeader);
+
if (header.isValid())
- kioJob->addMetaData("content-type",
- QString::fromLatin1("Content-Type: \
%1").arg(header.toString())); + contentType += header.toString();
else
- kioJob->addMetaData("content-type", "Content-Type: \
application/x-www-form-urlencoded"); + contentType += \
QLatin1String("application/x-www-form-urlencoded"); +
+ kioJob->addMetaData("content-type", contentType);
}
//kDebug () << "Job '" << kioJob << "' started...";
@@ -143,24 +147,31 @@
request.setRawHeader("Connection", QByteArray());
QString additionHeaders;
- Q_FOREACH(const QByteArray &headerKey, request.rawHeaderList()) {
- const QByteArray value = request.rawHeader(headerKey);
+ QListIterator<QByteArray> headersIt (request.rawHeaderList());
+
+ while (headersIt.hasNext()) {
+ const QByteArray key = headersIt.next();
+ const QByteArray value = request.rawHeader(key);
+
if (value.isNull())
continue;
// createRequest() checks later for existence "content-type" metadata
- if (headerKey=="Content-Type") {
+ if (QString::compare(key, QLatin1String("Content-Type"), \
Qt::CaseInsensitive) == 0) { metaData.insert("content-type", value);
continue;
}
if (additionHeaders.length() > 0) {
- additionHeaders += "\r\n";
+ additionHeaders += QLatin1String("\r\n");
}
- additionHeaders += headerKey + ": " + value;
+
+ additionHeaders += key;
+ additionHeaders += QLatin1String(": ");
+ additionHeaders += value;
}
+
metaData.insert("customHTTPHeader", additionHeaders);
-
return metaData;
}
--- branches/KDE/4.3/kdelibs/kio/kio/accessmanagerreply_p.cpp #1075748:1075749
@@ -28,9 +28,9 @@
#include <kdebug.h>
#include <klocale.h>
-#include <QSslConfiguration>
-#include <QTimer>
-#include <QPointer>
+#include <QtNetwork/QSslConfiguration>
+#include <QtCore/QTimer>
+#include <QtCore/QPointer>
namespace KDEPrivate {
@@ -46,12 +46,12 @@
AccessManagerReply *q;
- QPointer<KIO::Job> m_kioJob;
+ QPointer<KIO::SimpleJob> m_kioJob;
QByteArray m_data;
bool m_metaDataRead;
};
-AccessManagerReply::AccessManagerReply(const QNetworkAccessManager::Operation &op, \
const QNetworkRequest &request, KIO::Job *kioJob, QObject *parent) \
+AccessManagerReply::AccessManagerReply(const QNetworkAccessManager::Operation &op, \
const QNetworkRequest &request, KIO::SimpleJob *kioJob, QObject \
*parent)
:QNetworkReply(parent), d(new \
AccessManagerReply::AccessManagerReplyPrivate(this))
{
@@ -89,13 +89,15 @@
{
if (d->m_kioJob) {
d->m_kioJob->kill();
- d->m_kioJob->deleteLater();
}
+
+ d->m_data.clear();
+ d->m_metaDataRead = false;
}
qint64 AccessManagerReply::bytesAvailable() const
{
- return QNetworkReply::bytesAvailable() + d->m_data.length();
+ return (QNetworkReply::bytesAvailable() + d->m_data.size());
}
qint64 AccessManagerReply::readData(char *data, qint64 maxSize)
@@ -109,29 +111,41 @@
return length;
}
-void AccessManagerReply::appendData(KIO::Job *kioJob, const QByteArray &data)
+void AccessManagerReply::readHttpResponseHeaders(KIO::Job *job)
{
if (!d->m_metaDataRead) {
- const QString responseCode = kioJob->queryMetaData("responsecode");
- if (!responseCode.isEmpty())
+ // Set the HTTP status code...
+ const QString responseCode = job->queryMetaData("responsecode");
+ if (!responseCode.isEmpty())
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, \
responseCode.toInt());
- const QString headers = kioJob->queryMetaData("HTTP-Headers");
+ // Set the encrypted attribute...
+ if (QString::compare(job->queryMetaData("ssl_in_use"), \
QLatin1String("true"), Qt::CaseInsensitive) == 0) + \
setAttribute(QNetworkRequest::ConnectionEncryptedAttribute, true); +
+ // Set the raw header information...
+ const QString headers = job->queryMetaData("HTTP-Headers");
if (!headers.isEmpty()) {
QStringListIterator it (headers.split('\n'));
while (it.hasNext()) {
const QStringList headerPair = it.next().split(QLatin1String(":"));
- if (headerPair.size() == 2) {
+ if (headerPair.size() == 2 &&
+ !headerPair.at(0).contains("set-cookie", Qt::CaseInsensitive)) {
setRawHeader(headerPair.at(0).trimmed().toUtf8(), \
headerPair.at(1).trimmed().toUtf8()); }
}
}
+ // Set the returned meta data as attribute...
setAttribute(static_cast<QNetworkRequest::Attribute>(KIO::AccessManager::MetaData),
- kioJob->metaData().toVariant());
+ job->metaData().toVariant());
d->m_metaDataRead = true;
}
+}
+void AccessManagerReply::appendData(KIO::Job *kioJob, const QByteArray &data)
+{
+ readHttpResponseHeaders(kioJob);
d->m_data += data;
emit readyRead();
}
@@ -144,12 +158,12 @@
void AccessManagerReply::jobDone(KJob *kJob)
{
- const int errcode = kJob->error();
+ int errcode = kJob->error();
switch (errcode)
{
case 0:
setError(QNetworkReply::NoError, kJob->errorText());
- kDebug() << "0 -> QNetworkReply::NoError";
+ //kDebug() << "0 -> QNetworkReply::NoError";
break;
case KIO::ERR_COULD_NOT_CONNECT:
setError(QNetworkReply::ConnectionRefusedError, kJob->errorText());
@@ -165,9 +179,18 @@
break;
case KIO::ERR_USER_CANCELED:
case KIO::ERR_ABORTED:
- setError(QNetworkReply::OperationCanceledError, kJob->errorText());
- kDebug() << "KIO::ERR_ABORTED -> QNetworkReply::OperationCanceledError";
+ {
+ QUrl redirectUrl = \
attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); + if \
(redirectUrl.isValid()) { + errcode = 0;
+ readHttpResponseHeaders(d->m_kioJob);
+ kDebug() << "Redirecting to" << redirectUrl;
+ } else {
+ setError(QNetworkReply::OperationCanceledError, kJob->errorText());
+ kDebug() << "KIO::ERR_ABORTED -> \
QNetworkReply::OperationCanceledError"; + }
break;
+ }
case KIO::ERR_UNKNOWN_PROXY_HOST:
setError(QNetworkReply::ProxyNotFoundError, kJob->errorText());
kDebug() << "KIO::UNKNOWN_PROXY_HOST -> \
QNetworkReply::ProxyNotFoundError"; @@ -196,7 +219,7 @@
break;
case KIO::ERR_UNSUPPORTED_ACTION:
setError(QNetworkReply::ProtocolInvalidOperationError, \
kJob->errorText());
- kDebug() << kJob->error();
+ kDebug() << errcode;
break;
default:
setError(QNetworkReply::UnknownNetworkError, errorString());
@@ -209,16 +232,8 @@
void AccessManagerReply::AccessManagerReplyPrivate::_k_redirection(KIO::Job* job, \
const KUrl& url) {
- job->kill();
- m_kioJob = 0;
-
- // unfortunately we don't get HTTP response code for redirection, so for
- // temporary one assume code 302 which is most often used
- if (q->attribute(QNetworkRequest::HttpStatusCodeAttribute).isNull())
- q->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 302);
-
q->setAttribute(QNetworkRequest::RedirectionTargetAttribute, QUrl(url));
- emit q->finished();
+ job->kill(KJob::EmitResult);
}
void AccessManagerReply::AccessManagerReplyPrivate::_k_percent(KJob *job, unsigned \
long percent)
--- branches/KDE/4.3/kdelibs/kio/kio/accessmanagerreply_p.h #1075748:1075749
@@ -28,6 +28,7 @@
namespace KIO
{
class Job;
+ class SimpleJob;
}
class KJob;
class KUrl;
@@ -43,7 +44,7 @@
{
Q_OBJECT
public:
- AccessManagerReply(const QNetworkAccessManager::Operation &op, const \
QNetworkRequest &request, KIO::Job *kioJob, QObject *parent); + \
AccessManagerReply(const QNetworkAccessManager::Operation &op, const QNetworkRequest \
&request, KIO::SimpleJob *kioJob, QObject *parent); virtual ~AccessManagerReply();
virtual qint64 bytesAvailable() const;
virtual void abort();
@@ -55,6 +56,7 @@
protected:
virtual qint64 readData(char *data, qint64 maxSize);
+ void readHttpResponseHeaders(KIO::Job *);
private:
class AccessManagerReplyPrivate;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic