• Skip to content
  • Skip to link menu
KDE 4.3 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • Contact Us
 

KIO

accessmanager.cpp

Go to the documentation of this file.
00001 /*
00002  * This file is part of the KDE project.
00003  *
00004  * Copyright (C) 2008 - 2009 Urs Wolfer <uwolfer @ kde.org>
00005  * Copyright (C) 2007 Trolltech ASA
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Library General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Library General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Library General Public License
00018  * along with this library; see the file COPYING.LIB.  If not, write to
00019  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00020  * Boston, MA 02110-1301, USA.
00021  *
00022  */
00023 
00024 #include "accessmanager.h"
00025 
00026 #include "accessmanagerreply_p.h"
00027 
00028 #include <QtNetwork/QNetworkRequest>
00029 #include <QtNetwork/QNetworkReply>
00030 
00031 #include <kdebug.h>
00032 #include <kio/job.h>
00033 #include <kio/scheduler.h>
00034 
00035 namespace KIO {
00036 
00037 class AccessManager::AccessManagerPrivate
00038 {
00039 public:
00040     AccessManagerPrivate():externalContentAllowed(true) {}
00041     bool externalContentAllowed;
00042     static KIO::MetaData metaDataForRequest(QNetworkRequest request);
00043 };
00044 
00045 }
00046 
00047 using namespace KIO;
00048 
00049 AccessManager::AccessManager(QObject *parent)
00050     : QNetworkAccessManager(parent), d(new AccessManager::AccessManagerPrivate())
00051 {
00052 }
00053 
00054 AccessManager::~AccessManager()
00055 {
00056     delete d;
00057 }
00058 
00059 void AccessManager::setExternalContentAllowed(bool allowed)
00060 {
00061     d->externalContentAllowed = allowed;
00062 }
00063 
00064 bool AccessManager::isExternalContentAllowed() const
00065 {
00066     return d->externalContentAllowed;
00067 }
00068 
00069 QNetworkReply *AccessManager::createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData)
00070 {
00071     KIO::SimpleJob *kioJob = 0;
00072 
00073     if ( !d->externalContentAllowed && req.url().scheme() != "file" && !req.url().scheme().isEmpty() ) {
00074         kDebug() << "Blocked: " << req.url().scheme() <<  req.url();
00075         /* if kioJob equals zero, the AccessManagerReply will block the request */
00076         return new KDEPrivate::AccessManagerReply(op, req, kioJob, this);
00077     }
00078 
00079     switch (op) {
00080         case HeadOperation: {
00081             kDebug() << "HeadOperation:" << req.url();
00082             kioJob = KIO::mimetype(req.url(), KIO::HideProgressInfo);
00083             break;
00084         }
00085         case GetOperation: {
00086             kDebug() << "GetOperation:" << req.url();
00087             kioJob = KIO::get(req.url(), KIO::NoReload, KIO::HideProgressInfo);
00088             break;
00089         }
00090         case PutOperation: {
00091             kDebug() << "PutOperation:" << req.url();
00092             kioJob = KIO::put(req.url(), -1, KIO::HideProgressInfo);
00093             break;
00094         }
00095         case PostOperation: {
00096             kDebug() << "PostOperation:" << req.url();
00097             kioJob = KIO::http_post(req.url(), outgoingData->readAll(), KIO::HideProgressInfo);
00098             break;
00099         }
00100         default:
00101             kDebug() << "Unknown operation";
00102             return 0;
00103     }
00104 
00105     KIO::Scheduler::scheduleJob(kioJob);
00106     KDEPrivate::AccessManagerReply *reply = new KDEPrivate::AccessManagerReply(op, req, kioJob, this);
00107 
00108     kioJob->addMetaData(d->metaDataForRequest(req));
00109 
00110     if ( op == PostOperation && !kioJob->metaData().contains("content-type"))  {
00111         QVariant header = req.header(QNetworkRequest::ContentTypeHeader);
00112         if (header.isValid())
00113           kioJob->addMetaData("content-type",
00114                               QString::fromLatin1("Content-Type: %1").arg(header.toString()));
00115         else
00116           kioJob->addMetaData("content-type", "Content-Type: application/x-www-form-urlencoded");
00117     }
00118 
00119     //kDebug () << "Job '" << kioJob << "' started...";
00120     return reply;
00121 }
00122 
00123 
00124 KIO::MetaData AccessManager::AccessManagerPrivate::metaDataForRequest(QNetworkRequest request)
00125 {
00126     KIO::MetaData metaData;
00127 
00128     // Add the user-specified meta data first...
00129     QVariant userMetaData = request.attribute (static_cast<QNetworkRequest::Attribute>(MetaData));
00130     if (userMetaData.isValid() && userMetaData.type() == QVariant::Map) {
00131       metaData += userMetaData.toMap();
00132     }
00133 
00134     metaData.insert("PropagateHttpHeader", "true");
00135 
00136     metaData.insert("UserAgent", request.rawHeader("User-Agent"));
00137     request.setRawHeader("User-Agent", QByteArray());
00138 
00139     metaData.insert("accept", request.rawHeader("Accept"));
00140     request.setRawHeader("Accept", QByteArray());
00141 
00142     request.setRawHeader("content-length", QByteArray());
00143     request.setRawHeader("Connection", QByteArray());
00144 
00145     QString additionHeaders;
00146     Q_FOREACH(const QByteArray &headerKey, request.rawHeaderList()) {
00147         const QByteArray value = request.rawHeader(headerKey);
00148         if (value.isNull())
00149             continue;
00150 
00151         // createRequest() checks later for existence "content-type" metadata
00152         if (headerKey=="Content-Type") {
00153             metaData.insert("content-type", value);
00154             continue;
00155         }
00156 
00157         if (additionHeaders.length() > 0) {
00158             additionHeaders += "\r\n";
00159         }
00160         additionHeaders += headerKey + ": " + value;
00161     }
00162     metaData.insert("customHTTPHeader", additionHeaders);
00163 
00164     return metaData;
00165 }
00166 
00167 #include "accessmanager.moc"

KIO

Skip menu "KIO"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.6.1
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal