/// <summary> /// Handles the request for a cached tile. /// </summary> /// <param name="options"></param> /// <param name="pathParts">The path parts from the request.</param> /// <param name="fileName">The filename from the request.</param> /// <param name="clientEndpoint"></param> /// <param name="headers">The request headers.</param> /// <returns></returns> public WebRequestOutcome ProcessRequest(Options options, IEnumerable <string> pathParts, string fileName, IPAddress clientEndpoint, RequestHeadersDictionary headers) { var result = new WebRequestOutcome(); var displayOutcome = new RequestOutcome() { ID = Interlocked.Increment(ref _NextID), ReceivedUtc = DateTime.UtcNow, }; RecentRequestOutcomes.Add(displayOutcome); try { var urlValues = _TileServerUrlTranslator.ExtractEncodedValuesFromUrlParts(pathParts, fileName); displayOutcome.CopyUrlValues(urlValues); if (urlValues != null) { var cachedContent = TileCache.GetCachedTile(urlValues); if (cachedContent != null) { result.ImageBytes = cachedContent.Content; displayOutcome.ServedFromCache = true; Interlocked.Increment(ref _CountServedFromCache); Plugin.Singleton?.RefreshStatusDescription(); } else { if (options.IsOfflineModeEnabled) { displayOutcome.MissingFromCache = true; result.StatusCode = HttpStatusCode.NotFound; } else { FetchTileServerImage(options, urlValues, clientEndpoint, headers, result, displayOutcome); if (result.ImageBytes?.Length > 0) { TileCache.SaveTile(urlValues, result.ImageBytes); } } } if (result.ImageBytes != null) { result.StatusCode = HttpStatusCode.OK; result.ImageExtension = urlValues.TileImageExtension; } } } catch (ThreadAbortException) { displayOutcome.Abandoned = true; ; // .NET will rethrow this automatically } catch { displayOutcome.ExceptionEncountered = true; throw; } finally { try { displayOutcome.CompletedUtc = DateTime.UtcNow; } catch { ; // Don't want to confuse the issue with exceptions when trying to update the outcome display } } return(result); }
public void TestInitialise() { _UnderlyingDictionary = new Dictionary <string, string[]>(StringComparer.OrdinalIgnoreCase); _RequestHeaders = new RequestHeadersDictionary(_UnderlyingDictionary); }