using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; using NLog; using Sonarr.Http.Extensions; using Sonarr.Http.Frontend.Mappers; namespace Sonarr.Http.Frontend { [Authorize(Policy="UI")] [ApiController] public class StaticResourceController : Controller { private readonly IEnumerable _requestMappers; private readonly Logger _logger; public StaticResourceController(IEnumerable requestMappers, Logger logger) { _requestMappers = requestMappers; _logger = logger; } [AllowAnonymous] [HttpGet("login")] public async Task LoginPage() { return await MapResource("login"); } [EnableCors("AllowGet")] [AllowAnonymous] [HttpGet("/content/{**path:regex(^(?!api/).*)}")] public async Task IndexContent([FromRoute] string path) { return await MapResource("Content/" + path); } [HttpGet("")] [HttpGet("/{**path:regex(^(?!(api|feed)/).*)}")] public async Task Index([FromRoute] string path) { return await MapResource(path); } private async Task MapResource(string path) { path = "/" + (path ?? ""); var mapper = _requestMappers.SingleOrDefault(m => m.CanHandle(path)); if (mapper != null) { var result = await mapper.GetResponse(path); if (result != null) { if ((result as FileResult)?.ContentType == "text/html") { Response.Headers.DisableCache(); } return result; } return NotFound(); } _logger.Warn("Couldn't find handler for {0}", path); return NotFound(); } } }