String cookies(const Document* document, const KURL& url) { NetworkingContext* context = networkingContext(document); if (!context) return String(); QNetworkCookieJar* jar = context->networkAccessManager()->cookieJar(); QUrl urlForCookies(url); QUrl firstPartyUrl(document->firstPartyForCookies()); if (!thirdPartyCookiePolicyPermits(context, urlForCookies, firstPartyUrl)) return String(); QList<QNetworkCookie> cookies = jar->cookiesForUrl(urlForCookies); if (cookies.isEmpty()) return String(); QStringList resultCookies; foreach (const QNetworkCookie& networkCookie, cookies) { if (networkCookie.isHttpOnly()) continue; resultCookies.append(QString::fromLatin1(networkCookie.toRawForm(QNetworkCookie::NameAndValueOnly).constData())); } return resultCookies.join(QLatin1String("; ")); }
bool thirdPartyCookiePolicyPermitsForFrame(QObject* originatingFrame, const QUrl& url, const QUrl& firstPartyUrl) { #if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0) QNetworkCookieJar* jar = cookieJar(originatingFrame); if (!jar) return true; return thirdPartyCookiePolicyPermits(jar, url, firstPartyUrl); #else return true; #endif }
QNetworkRequest ResourceRequest::toNetworkRequest(NetworkingContext *context) const { QNetworkRequest request; request.setUrl(url()); request.setOriginatingObject(context ? context->originatingObject() : 0); const HTTPHeaderMap &headers = httpHeaderFields(); for (HTTPHeaderMap::const_iterator it = headers.begin(), end = headers.end(); it != end; ++it) { QByteArray name = QString(it->first).toLatin1(); QByteArray value = QString(it->second).toLatin1(); // QNetworkRequest::setRawHeader() would remove the header if the value is null // Make sure to set an empty header instead of null header. if (!value.isNull()) request.setRawHeader(name, value); else request.setRawHeader(name, ""); } // Make sure we always have an Accept header; some sites require this to // serve subresources if (!request.hasRawHeader("Accept")) request.setRawHeader("Accept", "*/*"); switch (cachePolicy()) { case ReloadIgnoringCacheData: request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); break; case ReturnCacheDataElseLoad: request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); break; case ReturnCacheDataDontLoad: request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache); break; case UseProtocolCachePolicy: // QNetworkRequest::PreferNetwork default: break; } if (!allowCookies() || !thirdPartyCookiePolicyPermits(context, url(), firstPartyForCookies())) { request.setAttribute(QNetworkRequest::CookieSaveControlAttribute, QNetworkRequest::Manual); request.setAttribute(QNetworkRequest::CookieLoadControlAttribute, QNetworkRequest::Manual); } if (!allowCookies()) request.setAttribute(QNetworkRequest::AuthenticationReuseAttribute, QNetworkRequest::Manual); return request; }
String cookiesForDOM(const NetworkStorageSession& session, const KURL& firstParty, const KURL& url) { QNetworkCookieJar* jar = session.context() ? session.context()->networkAccessManager()->cookieJar() : SharedCookieJarQt::shared(); if (!jar) return String(); QUrl urlForCookies(url); QUrl firstPartyUrl(firstParty); if (!thirdPartyCookiePolicyPermits(session.context(), urlForCookies, firstPartyUrl)) return String(); QList<QNetworkCookie> cookies = jar->cookiesForUrl(urlForCookies); if (cookies.isEmpty()) return String(); QStringList resultCookies; foreach (const QNetworkCookie& networkCookie, cookies) { if (networkCookie.isHttpOnly()) continue; resultCookies.append(QString::fromLatin1(networkCookie.toRawForm(QNetworkCookie::NameAndValueOnly).constData())); } return resultCookies.join(QLatin1String("; ")); }