39 #include <QtCore/QUrl>
40 #include <QtCore/QPointer>
41 #include <QtGui/QWidget>
42 #include <QtDBus/QDBusInterface>
43 #include <QtDBus/QDBusConnection>
44 #include <QtDBus/QDBusReply>
45 #include <QtNetwork/QNetworkReply>
46 #include <QtNetwork/QNetworkRequest>
47 #include <QtNetwork/QSslCipher>
48 #include <QtNetwork/QSslCertificate>
49 #include <QtNetwork/QSslConfiguration>
51 #define QL1S(x) QLatin1String(x)
52 #define QL1C(x) QLatin1Char(x)
54 #if QT_VERSION >= 0x040800
56 #else // QtWebkit hack to use the internal attribute
65 const QVariant size = req.header(QNetworkRequest::ContentLengthHeader);
69 const qlonglong value = size.toLongLong(&ok);
70 return (ok ? value : -1);
75 class AccessManager::AccessManagerPrivate
78 AccessManagerPrivate()
79 : externalContentAllowed(true),
80 emitReadyReadOnMetaDataChange(false),
84 void setMetaDataForRequest(QNetworkRequest request,
KIO::MetaData& metaData);
86 bool externalContentAllowed;
87 bool emitReadyReadOnMetaDataChange;
93 namespace Integration {
95 class CookieJar::CookieJarPrivate
101 isStorageDisabled(
false)
106 bool isStorageDisabled;
129 d->externalContentAllowed = allowed;
134 return d->externalContentAllowed;
137 #ifndef KDE_NO_DEPRECATED
150 d->window = window->isWindow() ? window : window->window();
160 d->window = widget->isWindow() ? widget : widget->window();
172 #ifndef KDE_NO_DEPRECATED
190 return d->requestMetaData;
195 return d->sessionMetaData;
210 d->emitReadyReadOnMetaDataChange = enable;
215 const KUrl reqUrl (req.url());
217 if (!d->externalContentAllowed &&
219 reqUrl.scheme() !=
QL1S(
"data")) {
220 kDebug( 7044 ) <<
"Blocked: " << reqUrl;
225 const bool ignoreContentDisposition = req.hasRawHeader(
"x-kdewebkit-ignore-disposition");
229 d->setMetaDataForRequest(req, metaData);
234 case HeadOperation: {
241 if (!reqUrl.path().isEmpty() || reqUrl.host().isEmpty())
248 metaData.remove(
QL1S(
"content-type"));
259 case PostOperation: {
261 if (!metaData.contains(
QL1S(
"content-type"))) {
262 const QVariant header = req.header(QNetworkRequest::ContentTypeHeader);
263 if (header.isValid()) {
264 metaData.insert(
QL1S(
"content-type"),
265 (
QL1S(
"Content-Type: ") + header.toString()));
267 metaData.insert(
QL1S(
"content-type"),
268 QL1S(
"Content-Type: application/x-www-form-urlencoded"));
273 case DeleteOperation: {
278 case CustomOperation: {
279 const QByteArray& method = req.attribute(QNetworkRequest::CustomVerbAttribute).toByteArray();
282 if (method.isEmpty()) {
291 metaData.insert(
QL1S(
"CustomHTTPMethod"), method);
295 kWarning(7044) <<
"Unsupported KIO operation requested! Defering to QNetworkAccessManager...";
301 switch (req.priority()) {
302 case QNetworkRequest::HighPriority:
305 case QNetworkRequest::LowPriority:
332 kDebug(7044) <<
"Synchronous XHR:" << reply << reqUrl;
334 kWarning(7044) <<
"Failed to create a synchronous XHR for" << reqUrl;
347 switch (req.priority()) {
348 case QNetworkRequest::HighPriority:
351 case QNetworkRequest::LowPriority:
366 if (ignoreContentDisposition && reply) {
374 void AccessManager::AccessManagerPrivate::setMetaDataForRequest(QNetworkRequest request,
KIO::MetaData& metaData)
377 QVariant userMetaData = request.attribute (static_cast<QNetworkRequest::Attribute>(
MetaData));
378 if (userMetaData.isValid() && userMetaData.type() == QVariant::Map)
379 metaData += userMetaData.toMap();
381 metaData.insert(
QL1S(
"PropagateHttpHeader"),
QL1S(
"true"));
383 if (request.hasRawHeader(
"User-Agent")) {
384 metaData.insert(
QL1S(
"UserAgent"), request.rawHeader(
"User-Agent"));
385 request.setRawHeader(
"User-Agent", QByteArray());
388 if (request.hasRawHeader(
"Accept")) {
389 metaData.insert(
QL1S(
"accept"), request.rawHeader(
"Accept"));
390 request.setRawHeader(
"Accept", QByteArray());
393 if (request.hasRawHeader(
"Accept-Charset")) {
394 metaData.insert(
QL1S(
"Charsets"), request.rawHeader(
"Accept-Charset"));
395 request.setRawHeader(
"Accept-Charset", QByteArray());
398 if (request.hasRawHeader(
"Accept-Language")) {
399 metaData.insert(
QL1S(
"Languages"), request.rawHeader(
"Accept-Language"));
400 request.setRawHeader(
"Accept-Language", QByteArray());
403 if (request.hasRawHeader(
"Referer")) {
404 metaData.insert(
QL1S(
"referrer"), request.rawHeader(
"Referer"));
405 request.setRawHeader(
"Referer", QByteArray());
408 if (request.hasRawHeader(
"Content-Type")) {
409 metaData.insert(
QL1S(
"content-type"), request.rawHeader(
"Content-Type"));
410 request.setRawHeader(
"Content-Type", QByteArray());
413 if (request.attribute(QNetworkRequest::AuthenticationReuseAttribute) == QNetworkRequest::Manual) {
414 metaData.insert(
QL1S(
"no-preemptive-auth-reuse"),
QL1S(
"true"));
417 request.setRawHeader(
"Content-Length", QByteArray());
418 request.setRawHeader(
"Connection", QByteArray());
419 request.setRawHeader(
"If-None-Match", QByteArray());
420 request.setRawHeader(
"If-Modified-Since", QByteArray());
421 request.setRawHeader(
"x-kdewebkit-ignore-disposition", QByteArray());
424 Q_FOREACH(
const QByteArray &key, request.rawHeaderList()) {
425 const QByteArray value = request.rawHeader(key);
427 customHeaders << (key +
QL1S(
": ") + value);
430 if (!customHeaders.isEmpty()) {
431 metaData.insert(
QL1S(
"customHTTPHeader"), customHeaders.join(
"\r\n"));
435 if (!requestMetaData.isEmpty()) {
436 metaData += requestMetaData;
438 requestMetaData.clear();
442 if (!sessionMetaData.isEmpty()) {
443 metaData += sessionMetaData;
448 using namespace KIO::Integration;
452 if (str.compare(QLatin1String(
"SSLv3"), Qt::CaseInsensitive) == 0) {
456 if (str.compare(QLatin1String(
"SSLv2"), Qt::CaseInsensitive) == 0) {
460 if (str.compare(QLatin1String(
"TLSv1"), Qt::CaseInsensitive) == 0) {
464 return QSsl::AnyProtocol;
469 bool success =
false;
471 if (metadata.contains(
QL1S(
"ssl_in_use"))) {
473 QList<QSslCipher> cipherList;
474 cipherList << QSslCipher(metadata.value(
QL1S(
"ssl_cipher_name")), sslProto);
475 sslconfig.setCaCertificates(QSslCertificate::fromData(metadata.value(
QL1S(
"ssl_peer_chain")).toUtf8()));
476 sslconfig.setCiphers(cipherList);
477 sslconfig.setProtocol(sslProto);
478 success = sslconfig.isNull();
502 return d->isStorageDisabled;
507 QList<QNetworkCookie> cookieList;
512 QDBusInterface kcookiejar(
"org.kde.kded",
"/modules/kcookiejar",
"org.kde.KCookieServer");
513 QDBusReply<QString> reply = kcookiejar.call(
"findDOMCookies", url.toString(QUrl::RemoveUserInfo), (qlonglong)d->windowId);
515 if (!reply.isValid()) {
516 kWarning(7044) <<
"Unable to communicate with the cookiejar!";
520 const QString cookieStr = reply.value();
521 const QStringList cookies = cookieStr.split(
QL1S(
"; "), QString::SkipEmptyParts);
522 Q_FOREACH(
const QString& cookie, cookies) {
523 const int index = cookie.indexOf(
QL1C(
'='));
525 const QString value = cookie.right((cookie.length() - index - 1));
526 cookieList << QNetworkCookie(name.toUtf8(), value.toUtf8());
539 QDBusInterface kcookiejar(
"org.kde.kded",
"/modules/kcookiejar",
"org.kde.KCookieServer");
540 Q_FOREACH(
const QNetworkCookie &cookie, cookieList) {
541 QByteArray cookieHeader (
"Set-Cookie: ");
542 if (d->isStorageDisabled && !cookie.isSessionCookie()) {
543 QNetworkCookie sessionCookie(cookie);
544 sessionCookie.setExpirationDate(
QDateTime());
545 cookieHeader += sessionCookie.toRawForm();
547 cookieHeader += cookie.toRawForm();
549 kcookiejar.call(
"addCookies", url.toString(QUrl::RemoveUserInfo), cookieHeader, (qlonglong)d->windowId);
553 return !kcookiejar.lastError().isValid();
558 d->isStorageDisabled = disable;
569 d->isEnabled = cfg.
readEntry(
"Cookies",
true);
572 #include "accessmanager.moc"