22// A full license can be found at .\LICENSE
33
44import 'dart:async' ;
5- import 'dart:io' ;
65import 'dart:ui' ;
76
87import 'package:flutter/foundation.dart' ;
@@ -29,12 +28,6 @@ class FMTCImageProvider extends ImageProvider<FMTCImageProvider> {
2928 /// The coordinates of the tile to be fetched
3029 final Coords <num > coords;
3130
32- /// A HTTP client used to send requests
33- final HttpClient httpClient;
34-
35- /// Custom headers to send with each request
36- final Map <String , String > headers;
37-
3831 /// Used internally to safely and efficiently enforce the `settings.maxStoreLength`
3932 static final Queue removeOldestQueue =
4033 Queue (timeout: const Duration (seconds: 1 ));
@@ -55,8 +48,6 @@ class FMTCImageProvider extends ImageProvider<FMTCImageProvider> {
5548 required this .provider,
5649 required this .options,
5750 required this .coords,
58- required this .httpClient,
59- required this .headers,
6051 }) : settings = provider.settings,
6152 _db = FMTCRegistry .instance (provider.storeDirectory.storeName);
6253
@@ -112,11 +103,8 @@ class FMTCImageProvider extends ImageProvider<FMTCImageProvider> {
112103 try {
113104 throw FMTCBrowsingError (throwError, throwErrorType! );
114105 } on FMTCBrowsingError catch (e) {
115- if (settings.errorHandler != null ) {
116- settings.errorHandler !(e);
117- } else {
118- rethrow ;
119- }
106+ settings.errorHandler? .call (e);
107+ rethrow ;
120108 }
121109 }
122110
@@ -125,12 +113,27 @@ class FMTCImageProvider extends ImageProvider<FMTCImageProvider> {
125113 }
126114
127115 throw ArgumentError (
128- '`finish` was called with an invalid combination of arguments' ,
116+ '`finish` was called with an invalid combination of arguments, or a fall-through situation occurred. ' ,
129117 );
130118 }
131119
132- final String url = provider.getTileUrl (coords, options);
133- final DbTile ? existingTile = await _db.tiles.get (DatabaseTools .hash (url));
120+ final String networkUrl = provider.getTileUrl (coords, options);
121+ final String matcherUrl;
122+
123+ if (networkUrl.contains ('?' ) &&
124+ provider.settings.obscuredQueryParams.isNotEmpty) {
125+ String secondPartUrl = networkUrl.split ('?' )[1 ];
126+ for (final r in provider.settings.obscuredQueryParams) {
127+ secondPartUrl = secondPartUrl.replaceAll (r, '' );
128+ }
129+
130+ matcherUrl = '${networkUrl .split ('?' )[0 ]}?$secondPartUrl ' ;
131+ } else {
132+ matcherUrl = networkUrl;
133+ }
134+
135+ final DbTile ? existingTile =
136+ await _db.tiles.get (DatabaseTools .hash (matcherUrl));
134137
135138 // Logic to check whether the tile needs creating or updating
136139 final bool needsCreating = existingTile == null ;
@@ -142,6 +145,15 @@ class FMTCImageProvider extends ImageProvider<FMTCImageProvider> {
142145 existingTile.lastModified.millisecondsSinceEpoch >
143146 settings.cachedValidDuration.inMilliseconds);
144147
148+ /* DEBUG ONLY
149+ print('---------');
150+ print(networkUrl);
151+ print(matcherUrl);
152+ print(' Existing ID: ' + (existingTile?.id ?? 'None').toString());
153+ print(' Needs Creating: ' + needsCreating.toString());
154+ print(' Needs Updating: ' + needsUpdating.toString());
155+ */
156+
145157 // Get any existing bytes from the tile, if it exists
146158 Uint8List ? bytes;
147159 if (! needsCreating) bytes = Uint8List .fromList (existingTile.bytes);
@@ -162,9 +174,10 @@ class FMTCImageProvider extends ImageProvider<FMTCImageProvider> {
162174
163175 // Try to get a response from a server, throwing an error if not possible & the tile does not exist
164176 try {
165- final HttpClientRequest request =
166- await httpClient.getUrl (Uri .parse (url));
167- headers.forEach ((k, v) => request.headers.add (k, v));
177+ final request = await provider.httpClient.getUrl (Uri .parse (networkUrl));
178+ provider.headers.forEach (
179+ (k, v) => request.headers.add (k, v, preserveHeaderCase: true ),
180+ );
168181 response = await request.close ();
169182 } catch (err) {
170183 return finish (
@@ -204,7 +217,9 @@ class FMTCImageProvider extends ImageProvider<FMTCImageProvider> {
204217
205218 // Cache the tile asynchronously
206219 unawaited (
207- _db.writeTxn (() => _db.tiles.put (DbTile (url: url, bytes: bytes! ))),
220+ _db.writeTxn (
221+ () => _db.tiles.put (DbTile (url: matcherUrl, bytes: bytes! )),
222+ ),
208223 );
209224
210225 // If an new tile was created over the tile limit, delete the oldest tile
0 commit comments