public async Task ListDirectoryAsync(
            MappedResourceInfo info,
            string absoluteUrlPath,
            IEnumerable <MappedResourceInfo> entries,
            Stream stream,
            CancellationToken cancellationToken)
        {
            const int MaxEntryLength = 50;
            const int SizeIndent     = -20; // Negative for right alignment

            SelfCheck.Assert(info.IsDirectory, $"{nameof(HtmlDirectoryLister)}.{nameof(ListDirectoryAsync)} invoked with a file, not a directory.");

            var encodedPath = WebUtility.HtmlEncode(absoluteUrlPath);

            using (var text = new StreamWriter(stream, Encoding.UTF8))
            {
                text.Write("<html><head><title>Index of ");
                text.Write(encodedPath);
                text.Write("</title></head><body><h1>Index of ");
                text.Write(encodedPath);
                text.Write("</h1><hr/><pre>");

                if (encodedPath.Length > 1)
                {
                    text.Write("<a href='../'>../</a>\n");
                }

                entries = entries.ToArray();

                foreach (var directory in entries.Where(m => m.IsDirectory).OrderBy(e => e.Name))
                {
                    text.Write($"<a href=\"{Uri.EscapeDataString(directory.Name)}{Path.DirectorySeparatorChar}\">{WebUtility.HtmlEncode(directory.Name)}</a>");
                    text.Write(new string(' ', Math.Max(1, MaxEntryLength - directory.Name.Length + 1)));
                    text.Write(HttpDate.Format(directory.LastModifiedUtc));
                    text.Write('\n');
                    await Task.Yield();
                }

                foreach (var file in entries.Where(m => m.IsFile).OrderBy(e => e.Name))
                {
                    text.Write($"<a href=\"{Uri.EscapeDataString(file.Name)}{Path.DirectorySeparatorChar}\">{WebUtility.HtmlEncode(file.Name)}</a>");
                    text.Write(new string(' ', Math.Max(1, MaxEntryLength - file.Name.Length + 1)));
                    text.Write(HttpDate.Format(file.LastModifiedUtc));
                    text.Write($" {file.Length.ToString("#,###", CultureInfo.InvariantCulture),SizeIndent}\n");
                    await Task.Yield();
                }

                text.Write("</pre><hr/></body></html>");
            }
        }
        private TResolver GetResolver(string route)
        {
            var resolver = _resolvers.FirstOrDefault(r => r.Route == route);

            if (resolver == null)
            {
                resolver = CreateResolver(route);
                SelfCheck.Assert(resolver != null, $"{nameof(CreateResolver)} returned null.");

                _resolvers.Add(resolver);
            }

            return(resolver);
        }