using System; using System.Collections.Generic; using System.IO; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace StardewModdingAPI.Web.Framework { /// Reads configuration values from the AWS Beanstalk environment properties file (if present). /// This is a workaround for AWS Beanstalk injection not working with .NET Core apps. internal class BeanstalkEnvPropsConfigProvider : ConfigurationProvider, IConfigurationSource { /********* ** Fields *********/ /// The absolute path to the container configuration file on an Amazon EC2 instance. private const string ContainerConfigPath = @"C:\Program Files\Amazon\ElasticBeanstalk\config\containerconfiguration"; /********* ** Public methods *********/ /// Build the configuration provider for this source. /// The configuration builder. public IConfigurationProvider Build(IConfigurationBuilder builder) { return new BeanstalkEnvPropsConfigProvider(); } /// Load the environment properties. public override void Load() { this.Data = new Dictionary(StringComparer.OrdinalIgnoreCase); // get Beanstalk config file FileInfo file = new FileInfo(BeanstalkEnvPropsConfigProvider.ContainerConfigPath); if (!file.Exists) return; // parse JSON JObject jsonRoot = (JObject)JsonConvert.DeserializeObject(File.ReadAllText(file.FullName)); if (jsonRoot["iis"]?["env"] is JArray jsonProps) { foreach (string prop in jsonProps.Values()) { string[] parts = prop.Split('=', 2); // key=value if (parts.Length == 2) this.Data[parts[0]] = parts[1]; } } } } }