From 653796ce5d0b5ae9bfd9ecf4073ea1cd010f295e Mon Sep 17 00:00:00 2001 From: Ahmed ElSayed Date: Mon, 8 May 2017 11:07:38 -0700 Subject: [PATCH] Allow specifying http port and cors settings in local.settings.json. Closes #79 Closes #133 --- .../Actions/HostActions/StartHostAction.cs | 13 +++++++++++-- src/Azure.Functions.Cli/Azure.Functions.Cli.csproj | 1 + src/Azure.Functions.Cli/Common/HostStartSettings.cs | 13 +++++++++++++ src/Azure.Functions.Cli/Common/SecretsManager.cs | 10 ++++++++++ .../Interfaces/ISecretsManager.cs | 2 ++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/Azure.Functions.Cli/Common/HostStartSettings.cs diff --git a/src/Azure.Functions.Cli/Actions/HostActions/StartHostAction.cs b/src/Azure.Functions.Cli/Actions/HostActions/StartHostAction.cs index 06c6118fb..04a30bc56 100644 --- a/src/Azure.Functions.Cli/Actions/HostActions/StartHostAction.cs +++ b/src/Azure.Functions.Cli/Actions/HostActions/StartHostAction.cs @@ -25,6 +25,7 @@ using Microsoft.Azure.WebJobs.Host; using Microsoft.Azure.WebJobs.Host.Config; using Microsoft.Azure.WebJobs.Extensions.Http; +using Azure.Functions.Cli.Interfaces; namespace Azure.Functions.Cli.Actions.HostActions { @@ -35,6 +36,7 @@ internal class StartHostAction : BaseAction, IDisposable const int DefaultPort = 7071; const TraceLevel DefaultDebugLevel = TraceLevel.Info; const int DefaultTimeout = 20; + private readonly ISecretsManager _secretsManager; public int Port { get; set; } @@ -50,12 +52,19 @@ internal class StartHostAction : BaseAction, IDisposable public DebuggerType Debugger { get; set; } + public StartHostAction(ISecretsManager secretsManager) + { + this._secretsManager = secretsManager; + } + public override ICommandLineParserResult ParseArgs(string[] args) { + var hostSettings = _secretsManager.GetHostStartSettings(); + Parser .Setup('p', "port") .WithDescription($"Local port to listen on. Default: {DefaultPort}") - .SetDefault(DefaultPort) + .SetDefault(hostSettings.LocalHttpPort == default(int) ? DefaultPort : hostSettings.LocalHttpPort) .Callback(p => Port = p); Parser @@ -73,7 +82,7 @@ public override ICommandLineParserResult ParseArgs(string[] args) Parser .Setup("cors") .WithDescription($"A comma separated list of CORS origins with no spaces. Example: https://functions.azure.com,https://functions-staging.azure.com") - .SetDefault(string.Empty) + .SetDefault(hostSettings.Cors ?? string.Empty) .Callback(c => CorsOrigins = c); Parser diff --git a/src/Azure.Functions.Cli/Azure.Functions.Cli.csproj b/src/Azure.Functions.Cli/Azure.Functions.Cli.csproj index 329711432..89c738967 100644 --- a/src/Azure.Functions.Cli/Azure.Functions.Cli.csproj +++ b/src/Azure.Functions.Cli/Azure.Functions.Cli.csproj @@ -607,6 +607,7 @@ + diff --git a/src/Azure.Functions.Cli/Common/HostStartSettings.cs b/src/Azure.Functions.Cli/Common/HostStartSettings.cs new file mode 100644 index 000000000..e02fe95d7 --- /dev/null +++ b/src/Azure.Functions.Cli/Common/HostStartSettings.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; + +namespace Azure.Functions.Cli.Common +{ + internal class HostStartSettings + { + [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] + public int LocalHttpPort { get; set; } + + [JsonProperty("CORS", DefaultValueHandling = DefaultValueHandling.Ignore)] + public string Cors { get; set; } + } +} diff --git a/src/Azure.Functions.Cli/Common/SecretsManager.cs b/src/Azure.Functions.Cli/Common/SecretsManager.cs index be2e9fa63..2209d499e 100644 --- a/src/Azure.Functions.Cli/Common/SecretsManager.cs +++ b/src/Azure.Functions.Cli/Common/SecretsManager.cs @@ -140,6 +140,12 @@ public void DeleteSecret(string name) settingsFile.Commit(); } + public HostStartSettings GetHostStartSettings() + { + var settingsFile = new AppSettingsFile(AppSettingsFilePath); + return settingsFile.Host ?? new HostStartSettings(); + } + public void DeleteConnectionString(string name) { var settingsFile = new AppSettingsFile(AppSettingsFilePath); @@ -161,6 +167,7 @@ public AppSettingsFile(string filePath) IsEncrypted = appSettings.IsEncrypted; Values = appSettings.Values; ConnectionStrings = appSettings.ConnectionStrings; + Host = appSettings.Host; } catch { @@ -174,6 +181,9 @@ public AppSettingsFile(string filePath) public Dictionary Values { get; set; } = new Dictionary(); public Dictionary ConnectionStrings { get; set; } = new Dictionary(); + [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] + public HostStartSettings Host { get; set; } + public void SetSecret(string name, string value) { if (IsEncrypted) diff --git a/src/Azure.Functions.Cli/Interfaces/ISecretsManager.cs b/src/Azure.Functions.Cli/Interfaces/ISecretsManager.cs index 440aee74c..3a0a6d726 100644 --- a/src/Azure.Functions.Cli/Interfaces/ISecretsManager.cs +++ b/src/Azure.Functions.Cli/Interfaces/ISecretsManager.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Azure.Functions.Cli.Common; namespace Azure.Functions.Cli.Interfaces { @@ -12,5 +13,6 @@ internal interface ISecretsManager void EncryptSettings(); void DeleteSecret(string name); void DeleteConnectionString(string name); + HostStartSettings GetHostStartSettings(); } }