[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