KIO
accessmanager.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "accessmanager.h"
00025
00026 #include "accessmanagerreply_p.h"
00027
00028 #include <kdebug.h>
00029 #include <kio/job.h>
00030 #include <kio/scheduler.h>
00031
00032 #include <QtNetwork/QNetworkRequest>
00033 #include <QtNetwork/QNetworkReply>
00034
00035
00036 namespace KIO {
00037
00038 class AccessManager::AccessManagerPrivate
00039 {
00040 public:
00041 AccessManagerPrivate():externalContentAllowed(true) {}
00042 bool externalContentAllowed;
00043 static KIO::MetaData metaDataForRequest(QNetworkRequest request);
00044 };
00045
00046 }
00047
00048 using namespace KIO;
00049
00050 AccessManager::AccessManager(QObject *parent)
00051 : QNetworkAccessManager(parent), d(new AccessManager::AccessManagerPrivate())
00052 {
00053 }
00054
00055 AccessManager::~AccessManager()
00056 {
00057 delete d;
00058 }
00059
00060 void AccessManager::setExternalContentAllowed(bool allowed)
00061 {
00062 d->externalContentAllowed = allowed;
00063 }
00064
00065 bool AccessManager::isExternalContentAllowed() const
00066 {
00067 return d->externalContentAllowed;
00068 }
00069
00070 QNetworkReply *AccessManager::createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData)
00071 {
00072 KIO::SimpleJob *kioJob = 0;
00073
00074 if ( !d->externalContentAllowed && req.url().scheme() != "file" && !req.url().scheme().isEmpty() ) {
00075 kDebug() << "Blocked: " << req.url().scheme() << req.url();
00076
00077 return new KDEPrivate::AccessManagerReply(op, req, kioJob, this);
00078 }
00079
00080 switch (op) {
00081 case HeadOperation: {
00082 kDebug() << "HeadOperation:" << req.url();
00083 kioJob = KIO::mimetype(req.url(), KIO::HideProgressInfo);
00084 break;
00085 }
00086 case GetOperation: {
00087 kDebug() << "GetOperation:" << req.url();
00088 kioJob = KIO::get(req.url(), KIO::NoReload, KIO::HideProgressInfo);
00089 break;
00090 }
00091 case PutOperation: {
00092 kDebug() << "PutOperation:" << req.url();
00093 kioJob = KIO::put(req.url(), -1, KIO::HideProgressInfo);
00094 break;
00095 }
00096 case PostOperation: {
00097 kDebug() << "PostOperation:" << req.url();
00098 kioJob = KIO::http_post(req.url(), outgoingData->readAll(), KIO::HideProgressInfo);
00099 break;
00100 }
00101 default:
00102 kDebug() << "Unknown operation";
00103 return 0;
00104 }
00105
00106 KIO::Scheduler::scheduleJob(kioJob);
00107 KDEPrivate::AccessManagerReply *reply = new KDEPrivate::AccessManagerReply(op, req, kioJob, this);
00108
00109 kioJob->addMetaData(d->metaDataForRequest(req));
00110
00111 if ( op == PostOperation && !kioJob->metaData().contains("content-type")) {
00112 QString contentType (QLatin1String("Content-Type: "));
00113 QVariant header = req.header(QNetworkRequest::ContentTypeHeader);
00114
00115 if (header.isValid())
00116 contentType += header.toString();
00117 else
00118 contentType += QLatin1String("application/x-www-form-urlencoded");
00119
00120 kioJob->addMetaData("content-type", contentType);
00121 }
00122
00123
00124 return reply;
00125 }
00126
00127
00128 KIO::MetaData AccessManager::AccessManagerPrivate::metaDataForRequest(QNetworkRequest request)
00129 {
00130 KIO::MetaData metaData;
00131
00132
00133 QVariant userMetaData = request.attribute (static_cast<QNetworkRequest::Attribute>(MetaData));
00134 if (userMetaData.isValid() && userMetaData.type() == QVariant::Map) {
00135 metaData += userMetaData.toMap();
00136 }
00137
00138 metaData.insert("PropagateHttpHeader", "true");
00139
00140 metaData.insert("UserAgent", request.rawHeader("User-Agent"));
00141 request.setRawHeader("User-Agent", QByteArray());
00142
00143 metaData.insert("accept", request.rawHeader("Accept"));
00144 request.setRawHeader("Accept", QByteArray());
00145
00146 request.setRawHeader("content-length", QByteArray());
00147 request.setRawHeader("Connection", QByteArray());
00148
00149 QString additionHeaders;
00150 QListIterator<QByteArray> headersIt (request.rawHeaderList());
00151
00152 while (headersIt.hasNext()) {
00153 const QByteArray key = headersIt.next();
00154 const QByteArray value = request.rawHeader(key);
00155
00156 if (value.isNull())
00157 continue;
00158
00159
00160 if (QString::compare(key, QLatin1String("Content-Type"), Qt::CaseInsensitive) == 0) {
00161 metaData.insert("content-type", value);
00162 continue;
00163 }
00164
00165 if (additionHeaders.length() > 0) {
00166 additionHeaders += QLatin1String("\r\n");
00167 }
00168
00169 additionHeaders += key;
00170 additionHeaders += QLatin1String(": ");
00171 additionHeaders += value;
00172 }
00173
00174 metaData.insert("customHTTPHeader", additionHeaders);
00175 return metaData;
00176 }
00177
00178 #include "accessmanager.moc"