Ejemplo n.º 1
0
        /// <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);
 }