18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2d0825bca7fe65beaee391d30da42e937db621564Steve Block    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    modify it under the terms of the GNU Library General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Library General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    You should have received a copy of the GNU Library General Public License
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    along with this library; see the file COPYING.LIB.  If not, write to
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Boston, MA 02110-1301, USA.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceRequest.h"
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <qglobal.h>
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QNetworkRequest>
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QUrl>
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30d0825bca7fe65beaee391d30da42e937db621564Steve Block// Currently Qt allows three connections per host on symbian and six
31d0825bca7fe65beaee391d30da42e937db621564Steve Block// for everyone else. The limit can be found in qhttpnetworkconnection.cpp.
32d0825bca7fe65beaee391d30da42e937db621564Steve Block// To achieve the best result we want WebKit to schedule the jobs so we
33d0825bca7fe65beaee391d30da42e937db621564Steve Block// are using the limit as found in Qt. To allow Qt to fill its queue
34d0825bca7fe65beaee391d30da42e937db621564Steve Block// and prepare jobs we will schedule two more downloads.
3521939df44de1705786c545cd1bf519d47250322dBen Murdoch// Per TCP connection there is 1 current processed, 3 possibly pipelined
3621939df44de1705786c545cd1bf519d47250322dBen Murdoch// and 2 ready to re-fill the pipeline.
37d0825bca7fe65beaee391d30da42e937db621564Steve Blockunsigned initializeMaximumHTTPConnectionCountPerHost()
38d0825bca7fe65beaee391d30da42e937db621564Steve Block{
39d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifdef Q_OS_SYMBIAN
4021939df44de1705786c545cd1bf519d47250322dBen Murdoch    return 3 * (1 + 3 + 2);
41d0825bca7fe65beaee391d30da42e937db621564Steve Block#else
4221939df44de1705786c545cd1bf519d47250322dBen Murdoch    return 6 * (1 + 3 + 2);
43d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
44d0825bca7fe65beaee391d30da42e937db621564Steve Block}
45d0825bca7fe65beaee391d30da42e937db621564Steve Block
46643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockQNetworkRequest ResourceRequest::toNetworkRequest(QObject* originatingFrame) const
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QNetworkRequest request;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    request.setUrl(url());
50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    request.setOriginatingObject(originatingFrame);
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const HTTPHeaderMap &headers = httpHeaderFields();
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (HTTPHeaderMap::const_iterator it = headers.begin(), end = headers.end();
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         it != end; ++it) {
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QByteArray name = QString(it->first).toAscii();
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QByteArray value = QString(it->second).toAscii();
57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // QNetworkRequest::setRawHeader() would remove the header if the value is null
58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Make sure to set an empty header instead of null header.
59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!value.isNull())
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            request.setRawHeader(name, value);
61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else
62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            request.setRawHeader(name, "");
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // Make sure we always have an Accept header; some sites require this to
665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // serve subresources
675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (!request.hasRawHeader("Accept"))
685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        request.setRawHeader("Accept", "*/*");
695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    switch (cachePolicy()) {
715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case ReloadIgnoringCacheData:
725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork);
735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        break;
745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case ReturnCacheDataElseLoad:
755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache);
765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        break;
775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case ReturnCacheDataDontLoad:
785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache);
795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        break;
805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    case UseProtocolCachePolicy:
815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        // QNetworkRequest::PreferNetwork
825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    default:
835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        break;
845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
86e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (!allowCookies()) {
87e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        request.setAttribute(QNetworkRequest::CookieLoadControlAttribute, QNetworkRequest::Manual);
88e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        request.setAttribute(QNetworkRequest::CookieSaveControlAttribute, QNetworkRequest::Manual);
89e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        request.setAttribute(QNetworkRequest::AuthenticationReuseAttribute, QNetworkRequest::Manual);
90e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
91e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return request;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
97