32 #include <QNetworkReply>
33 #include <QNetworkDiskCache>
41 virtual QList<QNetworkProxy>
queryProxy(
const QNetworkProxyQuery & query = QNetworkProxyQuery() )
48 QList<QNetworkProxy> systemproxies = f->systemProxyForQuery( query );
49 if ( systemproxies.size() > 0 )
52 QList<QNetworkProxy> proxies = f->queryProxy( query );
53 if ( proxies.size() > 0 )
58 if ( query.queryType() != QNetworkProxyQuery::UrlRequest )
61 QString url = query.url().toString();
65 if ( url.startsWith( exclude ) )
67 QgsDebugMsg( QString(
"using default proxy for %1 [exclude %2]" ).arg( url ).arg( exclude ) );
68 return QList<QNetworkProxy>() << QNetworkProxy();
74 QgsDebugMsg( QString(
"requesting system proxy for query %1" ).arg( url ) );
75 QList<QNetworkProxy> proxies = QNetworkProxyFactory::systemProxyForQuery( query );
76 if ( !proxies.isEmpty() )
78 QgsDebugMsg( QString(
"using system proxy %1:%2 for query" )
79 .arg( proxies.first().hostName() ).arg( proxies.first().port() ) );
84 QgsDebugMsg( QString(
"using fallback proxy for %1" ).arg( url ) );
96 : QNetworkAccessManager( parent )
97 , mUseSystemProxy( false )
133 QgsDebugMsg( QString(
"proxy settings: (type:%1 host: %2:%3, user:%4, password:%5" )
134 .arg( proxy.type() == QNetworkProxy::DefaultProxy ?
"DefaultProxy" :
135 proxy.type() == QNetworkProxy::Socks5Proxy ?
"Socks5Proxy" :
136 proxy.type() == QNetworkProxy::NoProxy ?
"NoProxy" :
137 proxy.type() == QNetworkProxy::HttpProxy ?
"HttpProxy" :
138 proxy.type() == QNetworkProxy::HttpCachingProxy ?
"HttpCachingProxy" :
139 proxy.type() == QNetworkProxy::FtpCachingProxy ?
"FtpCachingProxy" :
141 .arg( proxy.hostName() )
144 .arg( proxy.password().isEmpty() ?
"not set" :
"set" ) );
154 QNetworkRequest *pReq(( QNetworkRequest * ) &req );
156 QString userAgent = s.value(
"/qgis/networkAndProxy/userAgent",
"Mozilla/5.0" ).toString();
157 if ( !userAgent.isEmpty() )
160 pReq->setRawHeader(
"User-Agent", userAgent.toUtf8() );
163 QNetworkReply *reply = QNetworkAccessManager::createRequest( op, req, outgoingData );
168 QTimer *timer =
new QTimer( reply );
169 connect( timer, SIGNAL( timeout() ),
this, SLOT(
abortRequest() ) );
170 timer->setSingleShot(
true );
171 timer->start( s.value(
"/qgis/networkAndProxy/networkTimeout",
"20000" ).toInt() );
173 connect( reply, SIGNAL( downloadProgress( qint64, qint64 ) ), timer, SLOT( start() ) );
174 connect( reply, SIGNAL( uploadProgress( qint64, qint64 ) ), timer, SLOT( start() ) );
181 QTimer *timer = qobject_cast<QTimer *>( sender() );
184 QNetworkReply *reply = qobject_cast<QNetworkReply *>( timer->parent() );
189 if ( reply->isRunning() )
197 switch ( theControl )
199 case QNetworkRequest::AlwaysNetwork:
200 return "AlwaysNetwork";
202 case QNetworkRequest::PreferNetwork:
203 return "PreferNetwork";
205 case QNetworkRequest::PreferCache:
206 return "PreferCache";
208 case QNetworkRequest::AlwaysCache:
209 return "AlwaysCache";
214 return "PreferNetwork";
219 if ( theName ==
"AlwaysNetwork" )
221 return QNetworkRequest::AlwaysNetwork;
223 else if ( theName ==
"PreferNetwork" )
225 return QNetworkRequest::PreferNetwork;
227 else if ( theName ==
"PreferCache" )
229 return QNetworkRequest::PreferCache;
231 else if ( theName ==
"AlwaysCache" )
233 return QNetworkRequest::AlwaysCache;
235 return QNetworkRequest::PreferNetwork;
241 QStringList excludes;
249 Qt::ConnectionType connectionType = thread() ==
instance()->thread() ? Qt::AutoConnection : Qt::BlockingQueuedConnection;
251 connect(
this, SIGNAL( authenticationRequired( QNetworkReply *, QAuthenticator * ) ),
252 instance(), SIGNAL( authenticationRequired( QNetworkReply *, QAuthenticator * ) ),
255 connect(
this, SIGNAL( proxyAuthenticationRequired(
const QNetworkProxy &, QAuthenticator * ) ),
256 instance(), SIGNAL( proxyAuthenticationRequired(
const QNetworkProxy &, QAuthenticator * ) ),
262 #ifndef QT_NO_OPENSSL
263 connect(
this, SIGNAL( sslErrors( QNetworkReply *,
const QList<QSslError> & ) ),
264 instance(), SIGNAL( sslErrors( QNetworkReply *,
const QList<QSslError> & ) ),
270 bool proxyEnabled = settings.value(
"proxy/proxyEnabled",
false ).toBool();
273 excludes = settings.value(
"proxy/proxyExcludedUrls",
"" ).toString().split(
"|", QString::SkipEmptyParts );
276 QString proxyHost = settings.value(
"proxy/proxyHost",
"" ).toString();
277 int proxyPort = settings.value(
"proxy/proxyPort",
"" ).toString().toInt();
278 QString proxyUser = settings.value(
"proxy/proxyUser",
"" ).toString();
279 QString proxyPassword = settings.value(
"proxy/proxyPassword",
"" ).toString();
281 QString proxyTypeString = settings.value(
"proxy/proxyType",
"" ).toString();
283 if ( proxyTypeString ==
"DefaultProxy" )
286 QNetworkProxyFactory::setUseSystemConfiguration(
true );
287 QList<QNetworkProxy> proxies = QNetworkProxyFactory::systemProxyForQuery();
288 if ( !proxies.isEmpty() )
290 proxy = proxies.first();
296 QNetworkProxy::ProxyType proxyType = QNetworkProxy::DefaultProxy;
297 if ( proxyTypeString ==
"Socks5Proxy" )
299 proxyType = QNetworkProxy::Socks5Proxy;
301 else if ( proxyTypeString ==
"HttpProxy" )
303 proxyType = QNetworkProxy::HttpProxy;
305 else if ( proxyTypeString ==
"HttpCachingProxy" )
307 proxyType = QNetworkProxy::HttpCachingProxy;
309 else if ( proxyTypeString ==
"FtpCachingProxy" )
311 proxyType = QNetworkProxy::FtpCachingProxy;
313 QgsDebugMsg( QString(
"setting proxy %1 %2:%3 %4/%5" )
315 .arg( proxyHost ).arg( proxyPort )
316 .arg( proxyUser ).arg( proxyPassword )
318 proxy = QNetworkProxy( proxyType, proxyHost, proxyPort, proxyUser, proxyPassword );
322 #if QT_VERSION >= 0x40500
325 QNetworkDiskCache *newcache = qobject_cast<QNetworkDiskCache*>( cache() );
327 newcache =
new QNetworkDiskCache(
this );
330 qint64 cacheSize = settings.value(
"cache/size", 50 * 1024 * 1024 ).toULongLong();
331 QgsDebugMsg( QString(
"setCacheDirectory: %1" ).arg( cacheDirectory ) );
332 QgsDebugMsg( QString(
"setMaximumCacheSize: %1" ).arg( cacheSize ) );
333 newcache->setCacheDirectory( cacheDirectory );
334 newcache->setMaximumCacheSize( cacheSize );
335 QgsDebugMsg( QString(
"cacheDirectory: %1" ).arg( newcache->cacheDirectory() ) );
336 QgsDebugMsg( QString(
"maximumCacheSize: %1" ).arg( newcache->maximumCacheSize() ) );
338 if ( cache() != newcache )
339 setCache( newcache );
static const char * QGIS_VERSION
const QStringList & excludeList() const
retrieve exclude list (urls shouldn't use the fallback proxy)
void requestCreated(QNetworkReply *)
virtual ~QgsNetworkProxyFactory()
static QString cacheLoadControlName(QNetworkRequest::CacheLoadControl theControl)
Get name for QNetworkRequest::CacheLoadControl.
QgsNetworkAccessManager(QObject *parent=0)
static QNetworkRequest::CacheLoadControl cacheLoadControlFromName(const QString &theName)
Get QNetworkRequest::CacheLoadControl from name.
const QNetworkProxy & fallbackProxy() const
retrieve fall back proxy (for urls that no factory returned proxies for)
void setupDefaultProxyAndCache()
Setup the NAM according to the user's settings.
static const QString qgisSettingsDirPath()
Returns the path to the settings directory in user's home dir.
const QList< QNetworkProxyFactory * > proxyFactories() const
retrieve proxy factory list
static void logMessage(QString message, QString tag=QString::null, MessageLevel level=WARNING)
add a message to the instance (and create it if necessary)
QStringList mExcludedURLs
~QgsNetworkAccessManager()
destructor
void requestTimedOut(QNetworkReply *)
virtual QNetworkReply * createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData=0)
void removeProxyFactory(QNetworkProxyFactory *factory)
remove a factory from the proxy factories list
QList< QNetworkProxyFactory * > mProxyFactories
void insertProxyFactory(QNetworkProxyFactory *factory)
insert a factory into the proxy factories list
static QgsNetworkAccessManager * instance()
returns a pointer to the single instance
QNetworkProxy mFallbackProxy
virtual QList< QNetworkProxy > queryProxy(const QNetworkProxyQuery &query=QNetworkProxyQuery())
void requestAboutToBeCreated(QNetworkAccessManager::Operation, const QNetworkRequest &, QIODevice *)
void setFallbackProxyAndExcludes(const QNetworkProxy &proxy, const QStringList &excludes)
set fallback proxy and URL that shouldn't use it.