@@ -80,7 +80,6 @@ static QString WMS_DESCRIPTION = "OGC Web Map Service version 1.3 data provider"
80
80
81
81
static QString DEFAULT_LATLON_CRS = " CRS:84" ;
82
82
83
-
84
83
QgsWmsProvider::QgsWmsProvider ( QString const &uri )
85
84
: QgsRasterDataProvider( uri )
86
85
, mHttpUri( uri )
@@ -844,6 +843,7 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
844
843
}
845
844
846
845
int i = 0 ;
846
+ int retry = 0 ;
847
847
for ( int row = row0; row <= row1; row++ )
848
848
{
849
849
for ( int col = col0; col <= col1; col++ )
@@ -865,6 +865,7 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
865
865
request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ), i );
866
866
request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ),
867
867
QRectF ( tm->topLeft .x () + col * twMap, tm->topLeft .y () - ( row + 1 ) * thMap, twMap, thMap ) );
868
+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), retry );
868
869
869
870
QgsDebugMsg ( QString ( " gettile: %1" ).arg ( turl ) );
870
871
QNetworkReply *reply = QgsNetworkAccessManager::instance ()->get ( request );
@@ -901,6 +902,7 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
901
902
url.removeQueryItem ( " TILECOL" );
902
903
903
904
int i = 0 ;
905
+ int retry = 0 ;
904
906
for ( int row = row0; row <= row1; row++ )
905
907
{
906
908
for ( int col = col0; col <= col1; col++ )
@@ -918,6 +920,7 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
918
920
request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ), i );
919
921
request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ),
920
922
QRectF ( tm->topLeft .x () + col * twMap, tm->topLeft .y () - ( row + 1 ) * thMap, twMap, thMap ) );
923
+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), retry );
921
924
922
925
QgsDebugMsg ( QString ( " gettile: %1" ).arg ( turl ) );
923
926
QNetworkReply *reply = QgsNetworkAccessManager::instance ()->get ( request );
@@ -941,6 +944,7 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
941
944
}
942
945
943
946
int i = 0 ;
947
+ int retry = 0 ;
944
948
for ( int row = row0; row <= row1; row++ )
945
949
{
946
950
for ( int col = col0; col <= col1; col++ )
@@ -958,6 +962,7 @@ QImage *QgsWmsProvider::draw( QgsRectangle const &viewExtent, int pixelWidth, i
958
962
request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ), i );
959
963
request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ),
960
964
QRectF ( tm->topLeft .x () + col * twMap, tm->topLeft .y () - ( row + 1 ) * thMap, twMap, thMap ) );
965
+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), retry );
961
966
962
967
QgsDebugMsg ( QString ( " gettile: %1" ).arg ( turl ) );
963
968
QNetworkReply *reply = QgsNetworkAccessManager::instance ()->get ( request );
@@ -1034,6 +1039,47 @@ void QgsWmsProvider::readBlock( int bandNo, QgsRectangle const & viewExtent, in
1034
1039
// delete image;
1035
1040
}
1036
1041
1042
+ void QgsWmsProvider::repeatTileRequest ( QNetworkRequest const &oldRequest )
1043
+ {
1044
+ if ( mErrors == 100 )
1045
+ {
1046
+ QgsMessageLog::logMessage ( tr ( " Not logging more than 100 request errors." ), tr ( " WMS" ) );
1047
+ }
1048
+
1049
+ QNetworkRequest request ( oldRequest );
1050
+
1051
+ QString url = request.url ().toString ();
1052
+ int tileReqNo = request.attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 0 ) ).toInt ();
1053
+ int tileNo = request.attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ) ).toInt ();
1054
+ int retry = request.attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ) ).toInt ();
1055
+ retry++;
1056
+
1057
+ QSettings s;
1058
+ int maxRetry = s.value ( " /qgis/defaultTileMaxRetry" , " 3" ).toInt ();
1059
+ if ( retry > maxRetry )
1060
+ {
1061
+ if ( mErrors < 100 )
1062
+ {
1063
+ QgsMessageLog::logMessage ( tr ( " Tile request max retry error. Failed %1 requests for tile %2 of tileRequest %3 (url: %4)" )
1064
+ .arg ( maxRetry ).arg ( tileNo ).arg ( tileReqNo ).arg ( url ), tr ( " WMS" ) );
1065
+ }
1066
+ return ;
1067
+ }
1068
+
1069
+ setAuthorization ( request );
1070
+ if ( mErrors < 100 )
1071
+ {
1072
+ QgsMessageLog::logMessage ( tr ( " repeat tileRequest %1 tile %2(retry %3)" )
1073
+ .arg ( tileReqNo ).arg ( tileNo ).arg ( retry ), tr ( " WMS" ), QgsMessageLog::INFO );
1074
+ }
1075
+ QgsDebugMsg ( QString ( " repeat tileRequest %1 %2(retry %3) for url: %4" ).arg ( tileReqNo ).arg ( tileNo ).arg ( retry ).arg ( url ) );
1076
+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), retry );
1077
+
1078
+ QNetworkReply *reply = QgsNetworkAccessManager::instance ()->get ( request );
1079
+ mTileReplies << reply;
1080
+ connect ( reply, SIGNAL ( finished () ), this , SLOT ( tileReplyFinished () ) );
1081
+ }
1082
+
1037
1083
void QgsWmsProvider::tileReplyFinished ()
1038
1084
{
1039
1085
QNetworkReply *reply = qobject_cast<QNetworkReply*>( sender () );
@@ -1080,18 +1126,19 @@ void QgsWmsProvider::tileReplyFinished()
1080
1126
int tileReqNo = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 0 ) ).toInt ();
1081
1127
int tileNo = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ) ).toInt ();
1082
1128
QRectF r = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ) ).toRectF ();
1129
+ int retry = reply->request ().attribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ) ).toInt ();
1083
1130
1084
1131
#if QT_VERSION >= 0x40500
1085
- QgsDebugMsg ( QString ( " tile reply %1 (%2) tile:%3 rect:%4,%5 %6,%7 ) fromcache:%8 error:%9 url:%10 " )
1086
- .arg ( tileReqNo ).arg ( mTileReqNo ).arg ( tileNo )
1132
+ QgsDebugMsg ( QString ( " tile reply %1 (%2) tile:%3(retry %4) rect:%5,%6 %7,%8 ) fromcache:%9 error:%10 url:%11 " )
1133
+ .arg ( tileReqNo ).arg ( mTileReqNo ).arg ( tileNo ). arg ( retry )
1087
1134
.arg ( r.left (), 0 , ' f' ).arg ( r.bottom (), 0 , ' f' ).arg ( r.right (), 0 , ' f' ).arg ( r.top (), 0 , ' f' )
1088
1135
.arg ( fromCache )
1089
1136
.arg ( reply->errorString () )
1090
1137
.arg ( reply->url ().toString () )
1091
1138
);
1092
1139
#else
1093
- QgsDebugMsg ( QString ( " tile reply %1 (%2) tile:%3 rect:%4,%5 %6,%7 ) error:%8 url:%9 " )
1094
- .arg ( tileReqNo ).arg ( mTileReqNo ).arg ( tileNo )
1140
+ QgsDebugMsg ( QString ( " tile reply %1 (%2) tile:%3(retry %4) rect:%5,%6 %7,%8 ) error:%9 url:%10 " )
1141
+ .arg ( tileReqNo ).arg ( mTileReqNo ).arg ( tileNo ). arg ( retry )
1095
1142
.arg ( r.left (), 0 , ' f' ).arg ( r.bottom (), 0 , ' f' ).arg ( r.right (), 0 , ' f' ).arg ( r.top (), 0 , ' f' )
1096
1143
.arg ( reply->errorString () )
1097
1144
.arg ( reply->url ().toString () )
@@ -1110,6 +1157,7 @@ void QgsWmsProvider::tileReplyFinished()
1110
1157
request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 0 ), tileReqNo );
1111
1158
request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 1 ), tileNo );
1112
1159
request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 2 ), r );
1160
+ request.setAttribute ( static_cast <QNetworkRequest::Attribute>( QNetworkRequest::User + 3 ), retry );
1113
1161
1114
1162
mTileReplies .removeOne ( reply );
1115
1163
reply->deleteLater ();
@@ -1205,6 +1253,8 @@ void QgsWmsProvider::tileReplyFinished()
1205
1253
{
1206
1254
QgsMessageLog::logMessage ( tr ( " Returned image is flawed [Content-Type:%1; URL: %2]" )
1207
1255
.arg ( contentType ).arg ( reply->url ().toString () ), tr ( " WMS" ) );
1256
+
1257
+ repeatTileRequest ( reply->request () );
1208
1258
}
1209
1259
}
1210
1260
else
@@ -1224,14 +1274,8 @@ void QgsWmsProvider::tileReplyFinished()
1224
1274
else
1225
1275
{
1226
1276
mErrors ++;
1227
- if ( mErrors < 100 )
1228
- {
1229
- QgsMessageLog::logMessage ( tr ( " Tile request failed [error:%1 url:%2]" ).arg ( reply->errorString () ).arg ( reply->url ().toString () ), tr ( " WMS" ) );
1230
- }
1231
- else if ( mErrors == 100 )
1232
- {
1233
- QgsMessageLog::logMessage ( tr ( " Not logging more than 100 request errors." ), tr ( " WMS" ) );
1234
- }
1277
+
1278
+ repeatTileRequest ( reply->request () );
1235
1279
1236
1280
mTileReplies .removeOne ( reply );
1237
1281
reply->deleteLater ();
0 commit comments