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 <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
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
00120 return reply;
00121 }
00122
00123
00124 KIO::MetaData AccessManager::AccessManagerPrivate::metaDataForRequest(QNetworkRequest request)
00125 {
00126 KIO::MetaData metaData;
00127
00128
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
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"