Skip to content

Commit cf1cf0f

Browse files
committed
Fix empty strings in proxy exclude list results in proxy being skipped for ALL hosts
Fixes #20213
1 parent cfdc8c2 commit cf1cf0f

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

src/app/qgsoptions.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,9 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
360360
const QStringList excludedUrlPathList = mSettings->value( QStringLiteral( "proxy/proxyExcludedUrls" ) ).toStringList();
361361
for ( const QString &path : excludedUrlPathList )
362362
{
363+
if ( path.trimmed().isEmpty() )
364+
continue;
365+
363366
QListWidgetItem *newItem = new QListWidgetItem( mExcludeUrlListWidget );
364367
newItem->setText( path );
365368
newItem->setFlags( Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable );
@@ -1386,9 +1389,12 @@ void QgsOptions::saveOptions()
13861389

13871390
//url to exclude from proxys
13881391
QStringList excludedUrls;
1392+
excludedUrls.reserve( mExcludeUrlListWidget->count() );
13891393
for ( int i = 0; i < mExcludeUrlListWidget->count(); ++i )
13901394
{
1391-
excludedUrls << mExcludeUrlListWidget->item( i )->text();
1395+
const QString host = mExcludeUrlListWidget->item( i )->text();
1396+
if ( !host.trimmed().isEmpty() )
1397+
excludedUrls << host;
13921398
}
13931399
mSettings->setValue( QStringLiteral( "proxy/proxyExcludedUrls" ), excludedUrls );
13941400

src/core/qgsnetworkaccessmanager.cpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class QgsNetworkProxyFactory : public QNetworkProxyFactory
7676

7777
Q_FOREACH ( const QString &exclude, nam->excludeList() )
7878
{
79-
if ( url.startsWith( exclude ) )
79+
if ( !exclude.trimmed().isEmpty() && url.startsWith( exclude ) )
8080
{
8181
QgsDebugMsgLevel( QStringLiteral( "using default proxy for %1 [exclude %2]" ).arg( url, exclude ), 4 );
8282
return QList<QNetworkProxy>() << QNetworkProxy();
@@ -172,6 +172,13 @@ void QgsNetworkAccessManager::setFallbackProxyAndExcludes( const QNetworkProxy &
172172

173173
mFallbackProxy = proxy;
174174
mExcludedURLs = excludes;
175+
// remove empty records from excludes list -- these would otherwise match ANY url, so the proxy would always be skipped!
176+
mExcludedURLs.erase( std::remove_if( mExcludedURLs.begin(), mExcludedURLs.end(), // clazy:exclude=detaching-member
177+
[]( const QString & url )
178+
{
179+
return url.trimmed().isEmpty();
180+
} ), mExcludedURLs.end() ); // clazy:exclude=detaching-member
181+
175182
}
176183

177184
QNetworkReply *QgsNetworkAccessManager::createRequest( QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData )
@@ -448,7 +455,7 @@ void QgsNetworkAccessManager::setupDefaultProxyAndCache( Qt::ConnectionType conn
448455
bool proxyEnabled = settings.value( QStringLiteral( "proxy/proxyEnabled" ), false ).toBool();
449456
if ( proxyEnabled )
450457
{
451-
excludes = settings.value( QStringLiteral( "proxy/proxyExcludedUrls" ), "" ).toStringList();
458+
excludes = settings.value( QStringLiteral( "proxy/proxyExcludedUrls" ), QStringList() ).toStringList();
452459

453460
//read type, host, port, user, passw from settings
454461
QString proxyHost = settings.value( QStringLiteral( "proxy/proxyHost" ), "" ).toString();

tests/src/core/testqgsnetworkaccessmanager.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class TestQgsNetworkAccessManager : public QObject
8282
void cleanupTestCase();// will be called after the last testfunction was executed.
8383
void init();// will be called before each testfunction is executed.
8484
void cleanup();// will be called after every testfunction.
85+
void testProxyExcludeList();
8586
void fetchEmptyUrl(); //test fetching blank url
8687
void fetchBadUrl(); //test fetching bad url
8788
void fetchEncodedContent(); //test fetching url content encoded as utf-8
@@ -118,6 +119,20 @@ void TestQgsNetworkAccessManager::cleanup()
118119
{
119120
}
120121

122+
void TestQgsNetworkAccessManager::testProxyExcludeList()
123+
{
124+
QgsNetworkAccessManager manager;
125+
QNetworkProxy fallback( QNetworkProxy::HttpProxy, QStringLiteral( "babies_first_proxy" ) );
126+
manager.setFallbackProxyAndExcludes( fallback, QStringList() << QStringLiteral( "intranet" ) << QStringLiteral( "something_else" ) );
127+
QCOMPARE( manager.fallbackProxy().hostName(), QStringLiteral( "babies_first_proxy" ) );
128+
QCOMPARE( manager.excludeList(), QStringList() << QStringLiteral( "intranet" ) << QStringLiteral( "something_else" ) );
129+
130+
QgsNetworkAccessManager manager2;
131+
manager2.setFallbackProxyAndExcludes( fallback, QStringList() << QStringLiteral( "intranet" ) << "" );
132+
// empty strings MUST be filtered from this list - otherwise they match all hosts!
133+
QCOMPARE( manager2.excludeList(), QStringList() << QStringLiteral( "intranet" ) );
134+
}
135+
121136
void TestQgsNetworkAccessManager::fetchEmptyUrl()
122137
{
123138
QObject context;

0 commit comments

Comments
 (0)