summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web/Framework/UserAgentParsing
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI.Web/Framework/UserAgentParsing')
-rw-r--r--src/SMAPI.Web/Framework/UserAgentParsing/ClientPlatformMiddleware.cs52
-rw-r--r--src/SMAPI.Web/Framework/UserAgentParsing/ClientPlatformMiddlewareExtensions.cs16
-rw-r--r--src/SMAPI.Web/Framework/UserAgentParsing/Platform.cs18
3 files changed, 86 insertions, 0 deletions
diff --git a/src/SMAPI.Web/Framework/UserAgentParsing/ClientPlatformMiddleware.cs b/src/SMAPI.Web/Framework/UserAgentParsing/ClientPlatformMiddleware.cs
new file mode 100644
index 00000000..d056d85c
--- /dev/null
+++ b/src/SMAPI.Web/Framework/UserAgentParsing/ClientPlatformMiddleware.cs
@@ -0,0 +1,52 @@
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http;
+
+namespace StardewModdingAPI.Web.Framework.UserAgentParsing
+{
+ /// <summary>Middleware that detects the client's platform.</summary>
+ public class ClientPlatformMiddleware
+ {
+ /// <summary>The key used to retrieve the client's platform from <see cref="HttpContext.Items"/>.</summary>
+ public const string ClientPlatformKey = "ClientPlatformKey";
+
+ /// <summary>The next delegate in the middleware pipeline.</summary>
+ private readonly RequestDelegate Next;
+
+ /// <summary>Construct an instance.</summary>
+ /// <param name="next">The next delegate in the middleware pipeline.</param>
+ public ClientPlatformMiddleware(RequestDelegate next)
+ {
+ this.Next = next;
+ }
+
+ /// <summary>Invoke the middleware.</summary>
+ /// <param name="context">The HTTP request context.</param>
+ public async Task InvokeAsync(HttpContext context)
+ {
+ context.Items[ClientPlatformMiddleware.ClientPlatformKey] = this.DetectClientPlatform(context.Request.Headers["User-Agent"]);
+
+ await this.Next(context);
+ }
+
+ /// <summary>Detect the platform that the client is on.</summary>
+ /// <param name="userAgent">The client's user agent.</param>
+ /// <returns>The client's platform, or null if no platforms could be detected.</returns>
+ private Platform? DetectClientPlatform(string userAgent)
+ {
+ switch (userAgent)
+ {
+ case string ua when ua.Contains("Windows"):
+ return Platform.Windows;
+ // check for Android before Linux because Android user agents also contain Linux
+ case string ua when ua.Contains("Android"):
+ return Platform.Android;
+ case string ua when ua.Contains("Linux"):
+ return Platform.Linux;
+ case string ua when ua.Contains("Mac"):
+ return Platform.Mac;
+ default:
+ return null;
+ }
+ }
+ }
+}
diff --git a/src/SMAPI.Web/Framework/UserAgentParsing/ClientPlatformMiddlewareExtensions.cs b/src/SMAPI.Web/Framework/UserAgentParsing/ClientPlatformMiddlewareExtensions.cs
new file mode 100644
index 00000000..4ac2ebfa
--- /dev/null
+++ b/src/SMAPI.Web/Framework/UserAgentParsing/ClientPlatformMiddlewareExtensions.cs
@@ -0,0 +1,16 @@
+using Microsoft.AspNetCore.Builder;
+
+namespace StardewModdingAPI.Web.Framework.UserAgentParsing
+{
+ /// <summary>Extension methods for the client platform middleware.</summary>
+ internal static class ClientPlatformMiddlewareExtensions
+ {
+ /// <summary>Adds client platform detection to the request pipeline.</summary>
+ /// <param name="builder">The application builder.</param>
+ /// <returns>The application builder with the client platform middleware enabled.</returns>
+ public static IApplicationBuilder UseClientPlatform(this IApplicationBuilder builder)
+ {
+ return builder.UseMiddleware<ClientPlatformMiddleware>();
+ }
+ }
+}
diff --git a/src/SMAPI.Web/Framework/UserAgentParsing/Platform.cs b/src/SMAPI.Web/Framework/UserAgentParsing/Platform.cs
new file mode 100644
index 00000000..07a247cb
--- /dev/null
+++ b/src/SMAPI.Web/Framework/UserAgentParsing/Platform.cs
@@ -0,0 +1,18 @@
+namespace StardewModdingAPI.Web.Framework.UserAgentParsing
+{
+ /// <summary>A software platform.</summary>
+ public enum Platform
+ {
+ /// <summary>The Android platform.</summary>
+ Android,
+
+ /// <summary>The Linux platform.</summary>
+ Linux,
+
+ /// <summary>The Mac platform.</summary>
+ Mac,
+
+ /// <summary>The Windows platform.</summary>
+ Windows
+ }
+}