diff --git a/src/Tgstation.Server.Api/ApiHeaders.cs b/src/Tgstation.Server.Api/ApiHeaders.cs index 2f2fabbb89..f62173962a 100644 --- a/src/Tgstation.Server.Api/ApiHeaders.cs +++ b/src/Tgstation.Server.Api/ApiHeaders.cs @@ -61,9 +61,14 @@ namespace Tgstation.Server.Api public long? InstanceId { get; set; } /// - /// The client's user agent + /// The client's user agent as a if valid /// - public ProductHeaderValue UserAgent { get; } + public ProductHeaderValue UserAgent => ProductInfoHeaderValue.TryParse(RawUserAgent, out var userAgent) ? userAgent.Product : null; + + /// + /// The client's raw user agent + /// + public string RawUserAgent { get; } /// /// The client's API version @@ -136,13 +141,9 @@ namespace Tgstation.Server.Api if (!requestHeaders.Accept.Any(x => x.MediaType == jsonAccept.MediaType)) throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Client does not accept {0}!", ApplicationJson)); - if (!requestHeaders.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgentValues) || !ProductInfoHeaderValue.TryParse(userAgentValues.FirstOrDefault(), out var clientUserAgent)) + if (!requestHeaders.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgentValues) || userAgentValues.Count == 0) throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} headers!", HeaderNames.UserAgent)); - // assure the client user agent has a name and version - if (String.IsNullOrWhiteSpace(clientUserAgent.Product.Name) || !Version.TryParse(clientUserAgent.Product.Version, out var clientVersion)) - throw new InvalidOperationException("Malformed client user agent!"); - // make sure the api header matches ours if (!requestHeaders.Headers.TryGetValue(ApiVersionHeader, out var apiUserAgentHeaderValues) || !ProductInfoHeaderValue.TryParse(apiUserAgentHeaderValues.FirstOrDefault(), out var apiUserAgent) || apiUserAgent.Product.Name != AssemblyName.Name) throw new InvalidOperationException("Missing API version!"); @@ -151,7 +152,7 @@ namespace Tgstation.Server.Api throw new InvalidOperationException("Malformed API version!"); ApiVersion = apiVersion; - UserAgent = clientUserAgent.Product; + RawUserAgent = userAgentValues.First(); if (!requestHeaders.Headers.TryGetValue(HeaderNames.Authorization, out StringValues authorization)) throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Missing {0} header!", HeaderNames.Authorization)); @@ -204,7 +205,7 @@ namespace Tgstation.Server.Api /// The value of ApiHeaders(ProductHeaderValue userAgent, string token, string username, string password) { - UserAgent = userAgent; + RawUserAgent = userAgent.ToString(); Token = token; Username = username; Password = password; diff --git a/src/Tgstation.Server.Host/Controllers/ApiController.cs b/src/Tgstation.Server.Host/Controllers/ApiController.cs index 194901e380..f937018e41 100644 --- a/src/Tgstation.Server.Host/Controllers/ApiController.cs +++ b/src/Tgstation.Server.Host/Controllers/ApiController.cs @@ -152,7 +152,7 @@ namespace Tgstation.Server.Host.Controllers } if (ApiHeaders != null) - Logger.LogDebug("Request made by User ID {0}. Api version: {1}. User-Agent: {2}. Type: {3}. Route {4}{5} to Instance {6}", AuthenticationContext?.User.Id.ToString(CultureInfo.InvariantCulture), ApiHeaders.ApiVersion, ApiHeaders.UserAgent, Request.Method, Request.Path, Request.QueryString, ApiHeaders.InstanceId); + Logger.LogDebug("Request made by User ID {0}. Api version: {1}. User-Agent: {2}. Type: {3}. Route {4}{5} to Instance {6}", AuthenticationContext?.User.Id.ToString(CultureInfo.InvariantCulture), ApiHeaders.ApiVersion, ApiHeaders.RawUserAgent, Request.Method, Request.Path, Request.QueryString, ApiHeaders.InstanceId); try {