fix issues with subdomain routing in log UI (#358)
This commit is contained in:
parent
ad5bb5b49a
commit
3f43ebcc0e
|
@ -4,6 +4,7 @@ using Microsoft.Extensions.Options;
|
|||
using StardewModdingAPI.Web.Framework;
|
||||
using StardewModdingAPI.Web.Framework.ConfigModels;
|
||||
using StardewModdingAPI.Web.Framework.LogParser;
|
||||
using StardewModdingAPI.Web.ViewModels;
|
||||
|
||||
namespace StardewModdingAPI.Web.Controllers
|
||||
{
|
||||
|
@ -13,6 +14,9 @@ namespace StardewModdingAPI.Web.Controllers
|
|||
/*********
|
||||
** Properties
|
||||
*********/
|
||||
/// <summary>The log parser config settings.</summary>
|
||||
private readonly LogParserConfig Config;
|
||||
|
||||
/// <summary>The underlying Pastebin client.</summary>
|
||||
private readonly PastebinClient PastebinClient;
|
||||
|
||||
|
@ -28,10 +32,10 @@ namespace StardewModdingAPI.Web.Controllers
|
|||
public LogParserController(IOptions<LogParserConfig> configProvider)
|
||||
{
|
||||
// init Pastebin client
|
||||
LogParserConfig config = configProvider.Value;
|
||||
this.Config = configProvider.Value;
|
||||
string version = this.GetType().Assembly.GetName().Version.ToString(3);
|
||||
string userAgent = string.Format(config.PastebinUserAgent, version);
|
||||
this.PastebinClient = new PastebinClient(config.PastebinBaseUrl, userAgent, config.PastebinDevKey);
|
||||
string userAgent = string.Format(this.Config.PastebinUserAgent, version);
|
||||
this.PastebinClient = new PastebinClient(this.Config.PastebinBaseUrl, userAgent, this.Config.PastebinDevKey);
|
||||
}
|
||||
|
||||
/***
|
||||
|
@ -42,7 +46,7 @@ namespace StardewModdingAPI.Web.Controllers
|
|||
[Route("log")]
|
||||
public ViewResult Index()
|
||||
{
|
||||
return this.View("Index");
|
||||
return this.View("Index", new LogParserModel(this.Config.SectionUrl));
|
||||
}
|
||||
|
||||
/***
|
||||
|
|
|
@ -6,6 +6,9 @@ namespace StardewModdingAPI.Web.Framework.ConfigModels
|
|||
/*********
|
||||
** Accessors
|
||||
*********/
|
||||
/// <summary>The root URL for the log parser controller.</summary>
|
||||
public string SectionUrl { get; set; }
|
||||
|
||||
/// <summary>The base URL for the Pastebin API.</summary>
|
||||
public string PastebinBaseUrl { get; set; }
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Rewrite;
|
||||
|
||||
namespace StardewModdingAPI.Web.Framework
|
||||
|
@ -7,14 +10,29 @@ namespace StardewModdingAPI.Web.Framework
|
|||
/// <remarks>Derived from <a href="https://stackoverflow.com/a/44526747/262123" />.</remarks>
|
||||
internal class RewriteSubdomainRule : IRule
|
||||
{
|
||||
/*********
|
||||
** Accessors
|
||||
*********/
|
||||
/// <summary>The paths (excluding the hostname portion) to not rewrite.</summary>
|
||||
public Regex[] ExceptPaths { get; set; }
|
||||
|
||||
|
||||
/*********
|
||||
** Public methods
|
||||
*********/
|
||||
/// <summary>Applies the rule. Implementations of ApplyRule should set the value for <see cref="RewriteContext.Result" /> (defaults to RuleResult.ContinueRules).</summary>
|
||||
/// <param name="context">The rewrite context.</param>
|
||||
public void ApplyRule(RewriteContext context)
|
||||
{
|
||||
context.Result = RuleResult.ContinueRules;
|
||||
HttpRequest request = context.HttpContext.Request;
|
||||
|
||||
// check ignores
|
||||
if (this.ExceptPaths?.Any(pattern => pattern.IsMatch(request.Path)) == true)
|
||||
return;
|
||||
|
||||
// get host parts
|
||||
string host = context.HttpContext.Request.Host.Host;
|
||||
string host = request.Host.Host;
|
||||
string[] parts = host.Split('.');
|
||||
|
||||
// validate
|
||||
|
@ -24,7 +42,7 @@ namespace StardewModdingAPI.Web.Framework
|
|||
return;
|
||||
|
||||
// prepend to path
|
||||
context.HttpContext.Request.Path = $"/{parts[0]}{context.HttpContext.Request.Path}";
|
||||
request.Path = $"/{parts[0]}{request.Path}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
using System.Text.RegularExpressions;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Rewrite;
|
||||
|
@ -64,7 +65,13 @@ namespace StardewModdingAPI.Web
|
|||
loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
|
||||
loggerFactory.AddDebug();
|
||||
app
|
||||
.UseRewriter(new RewriteOptions().Add(new RewriteSubdomainRule())) // convert subdomain.smapi.io => smapi.io/subdomain for routing
|
||||
.UseRewriter(
|
||||
new RewriteOptions()
|
||||
.Add(new RewriteSubdomainRule
|
||||
{
|
||||
ExceptPaths = new[] { new Regex("^/Content", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase) }
|
||||
})
|
||||
) // convert subdomain.smapi.io => smapi.io/subdomain for routing
|
||||
.UseStaticFiles() // wwwroot folder
|
||||
.UseMvc();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
namespace StardewModdingAPI.Web.ViewModels
|
||||
{
|
||||
/// <summary>The view model for the log parser page.</summary>
|
||||
public class LogParserModel
|
||||
{
|
||||
/*********
|
||||
** Accessors
|
||||
*********/
|
||||
/// <summary>The root URL for the log parser controller.</summary>
|
||||
public string SectionUrl { get; set; }
|
||||
|
||||
|
||||
/*********
|
||||
** Public methods
|
||||
*********/
|
||||
/// <summary>Construct an instance.</summary>
|
||||
public LogParserModel() { }
|
||||
|
||||
/// <summary>Construct an instance.</summary>
|
||||
/// <param name="sectionUrl">The root URL for the log parser controller.</param>
|
||||
public LogParserModel(string sectionUrl)
|
||||
{
|
||||
this.SectionUrl = sectionUrl;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,12 +1,18 @@
|
|||
@{
|
||||
ViewData["Title"] = "SMAPI log parser";
|
||||
}
|
||||
@model StardewModdingAPI.Web.ViewModels.LogParserModel
|
||||
@section Head {
|
||||
<link rel="stylesheet" href="~/Content/css/log-parser.css" />
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/lz-string/1.4.4/lz-string.min.js" crossorigin="anonymous"></script>
|
||||
<script src="~/Content/js/log-parser.js"></script>
|
||||
<style type="text/css" id="modflags"></style>
|
||||
<script>
|
||||
$(function() {
|
||||
smapi.logParser('@Model.SectionUrl');
|
||||
});
|
||||
</script>
|
||||
}
|
||||
|
||||
@*********
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
{
|
||||
{
|
||||
"Logging": {
|
||||
"IncludeScopes": false,
|
||||
"LogLevel": {
|
||||
|
@ -6,5 +6,8 @@
|
|||
"System": "Information",
|
||||
"Microsoft": "Information"
|
||||
}
|
||||
},
|
||||
"LogParser": {
|
||||
"SectionUrl": "http://localhost:59482/log/"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
"NexusModUrlFormat": "mods/{0}"
|
||||
},
|
||||
"LogParser": {
|
||||
"SectionUrl": "https://log.smapi.io/",
|
||||
"PastebinBaseUrl": "https://pastebin.com/",
|
||||
"PastebinUserAgent": "SMAPI/{0} (+https://github.com/Pathoschild/SMAPI)",
|
||||
"PastebinDevKey": "b8219d942109d1e60ebb14fbb45f06f9"
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* globals $, LZString */
|
||||
|
||||
$(function() {
|
||||
var smapi = smapi || {};
|
||||
smapi.logParser = function(sectionUrl) {
|
||||
/*********
|
||||
** Initialisation
|
||||
*********/
|
||||
|
@ -75,7 +76,7 @@ $(function() {
|
|||
$
|
||||
.ajax({
|
||||
type: "POST",
|
||||
url: "/log/save",
|
||||
url: sectionUrl + "/save",
|
||||
data: JSON.stringify(paste),
|
||||
contentType: "application/json" // sent to API
|
||||
})
|
||||
|
@ -273,7 +274,7 @@ $(function() {
|
|||
function getData() {
|
||||
$("#uploader").attr("data-text", "Loading...");
|
||||
$("#uploader").fadeIn();
|
||||
$.get("/log/fetch/" + location.search.substring(1), function(data) {
|
||||
$.get(sectionUrl + "/fetch/" + location.search.substring(1), function(data) {
|
||||
if (data.success) {
|
||||
$("#input").val(LZString.decompressFromUTF16(data.content) || data.content);
|
||||
loadData();
|
||||
|
@ -284,4 +285,4 @@ $(function() {
|
|||
$("#uploader").fadeOut();
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue