Files
Umbraco-CMS/src/Umbraco.Core/Sync/ApplicationUrlHelper.cs
Shannon d272dbf611 Merge branch 'dev-v7' into temp8
# Conflicts:
#	build/NuSpecs/tools/Readme.txt
#	src/Umbraco.Core/Configuration/UmbracoSettings/HelpElement.cs
#	src/Umbraco.Core/Macros/MacroFieldEditorsResolver.cs
#	src/Umbraco.Core/Packaging/Models/PackageAction.cs
#	src/Umbraco.Core/PropertyEditors/PreValueField.cs
#	src/Umbraco.Core/PropertyEditors/ValueConverters/MultipleTextStringValueConverter.cs
#	src/Umbraco.Core/Sync/ApplicationUrlHelper.cs
#	src/Umbraco.Tests/Configurations/UmbracoSettings/umbracoSettings.minimal.config
#	src/Umbraco.Tests/Dependencies/NuGet.cs
#	src/Umbraco.Tests/Persistence/PetaPocoExtensionsTest.cs
#	src/Umbraco.Tests/Services/Importing/ImportResources.Designer.cs
#	src/Umbraco.Tests/Services/Importing/StandardMvc-Package.xml
#	src/Umbraco.Tests/Services/Importing/TemplateOnly-Package.xml
#	src/Umbraco.Tests/Services/Importing/TemplateOnly-Updated-Package.xml
#	src/Umbraco.Tests/Services/Importing/uBlogsy-Package.xml
#	src/Umbraco.Tests/Services/PerformanceTests.cs
#	src/Umbraco.Web.UI.Client/src/less/belle.less
#	src/Umbraco.Web.UI.Client/src/less/components/umb-tabs.less
#	src/Umbraco.Web.UI.Client/src/less/navs.less
#	src/Umbraco.Web.UI.Client/src/less/tree.less
#	src/Umbraco.Web.UI.Client/src/views/common/dialogs/help.html
#	src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html
#	src/Umbraco.Web.UI.Client/src/views/common/overlays/help/help.html
#	src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js
#	src/Umbraco.Web.UI.Client/src/views/dashboard/settings/settingsdashboardintro.html
#	src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js
#	src/Umbraco.Web.UI.Client/src/views/packager/views/repo.html
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.html
#	src/Umbraco.Web.UI/Properties/Settings.Designer.cs
#	src/Umbraco.Web.UI/Properties/Settings.settings
#	src/Umbraco.Web.UI/Umbraco/config/lang/nb.xml
#	src/Umbraco.Web.UI/Umbraco/config/lang/zh_tw.xml
#	src/Umbraco.Web.UI/config/feedProxy.Release.config
#	src/Umbraco.Web.UI/config/feedProxy.config
#	src/Umbraco.Web.UI/config/umbracoSettings.Release.config
#	src/Umbraco.Web.UI/umbraco/config/lang/da.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/de.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/en.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/es.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/fr.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/he.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/it.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/ja.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/ko.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/nl.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/pl.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/pt.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/ru.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/sv.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/zh.xml
#	src/Umbraco.Web.UI/umbraco/developer/Packages/editPackage.aspx
#	src/Umbraco.Web.UI/umbraco_client/Tree/jquery.tree.contextmenu.js
#	src/Umbraco.Web.UI/web.Template.config
#	src/Umbraco.Web/Install/InstallHelper.cs
#	src/Umbraco.Web/Install/InstallSteps/UpgradeStep.cs
#	src/Umbraco.Web/Media/ThumbnailProviders/ImageThumbnailProvider.cs
#	src/Umbraco.Web/Models/ContentEditing/PreValueFieldDisplay.cs
#	src/Umbraco.Web/Mvc/EnsurePublishedContentRequestAttribute.cs
#	src/Umbraco.Web/Properties/Settings.settings
#	src/Umbraco.Web/Properties/Settings1.Designer.cs
#	src/Umbraco.Web/Routing/PublishedContentRequest.cs
#	src/Umbraco.Web/Trees/PackagesTreeController.cs
#	src/Umbraco.Web/UI/LegacyDialogHandler.cs
#	src/Umbraco.Web/UmbracoModule.cs
#	src/Umbraco.Web/Web References/org.umbraco.our/Reference.map
#	src/Umbraco.Web/Web References/org.umbraco.our/repository.disco
#	src/Umbraco.Web/Web References/org.umbraco.our/repository.wsdl
#	src/Umbraco.Web/app.config
#	src/Umbraco.Web/umbraco.presentation/item.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadScripts.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/create/simple.ascx.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/developer/Packages/editPackage.aspx
#	src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/search.aspx.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/preview/PreviewContent.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/DocumentExtensions.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/NodeExtensions.cs
#	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/uQuery-Nodes.cs
#	src/umbraco.MacroEngines/RazorDataTypeModels/IntegerDataTypeModel.cs
#	src/umbraco.MacroEngines/RazorDynamicNode/DynamicNodeList.cs
#	src/umbraco.businesslogic/ApplicationTree.cs
#	src/umbraco.businesslogic/BasePages/BasePage.cs
#	src/umbraco.businesslogic/BasePages/UmbracoEnsuredPage.cs
#	src/umbraco.editorControls/uploadfield/uploadField.cs
2018-07-31 14:57:20 +10:00

124 lines
6.0 KiB
C#

using System;
using System.Web;
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Composing;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
namespace Umbraco.Core.Sync
{
/// <summary>
/// A helper used to determine the current server umbraco application url.
/// </summary>
public static class ApplicationUrlHelper
{
// because we cannot logger.Info<ApplicationUrlHelper> because type is static
private static readonly Type TypeOfApplicationUrlHelper = typeof(ApplicationUrlHelper);
/// <summary>
/// Gets or sets a custom provider for the umbraco application url.
/// </summary>
/// <remarks>
/// <para>Receives the current request as a parameter, and it may be null. Must return a properly
/// formatted url with scheme and umbraco dir and no trailing slash eg "http://www.mysite.com/umbraco",
/// or <c>null</c>. To be used in auto-load-balancing scenarios where the application url is not
/// in config files but is determined programmatically.</para>
/// <para>Must be assigned before resolution is frozen.</para>
/// </remarks>
// FIXME need another way to do it, eg an interface, injected!
public static Func<HttpRequestBase, string> ApplicationUrlProvider { get; set; }
internal static string GetApplicationUrl(ILogger logger, IGlobalSettings globalSettings, IUmbracoSettingsSection settings, IServerRegistrar serverRegistrar, HttpRequestBase request = null)
{
var umbracoApplicationUrl = TryGetApplicationUrl(settings, logger, globalSettings, serverRegistrar);
if (umbracoApplicationUrl != null)
return umbracoApplicationUrl;
umbracoApplicationUrl = ApplicationUrlProvider?.Invoke(request);
if (string.IsNullOrWhiteSpace(umbracoApplicationUrl) == false)
{
umbracoApplicationUrl = umbracoApplicationUrl.TrimEnd('/');
logger.Info(TypeOfApplicationUrlHelper, "ApplicationUrl: " + umbracoApplicationUrl + " (provider)");
return umbracoApplicationUrl;
}
if (request == null) return null;
umbracoApplicationUrl = GetApplicationUrlFromCurrentRequest(request, globalSettings);
logger.Info(TypeOfApplicationUrlHelper, "ApplicationUrl: " + umbracoApplicationUrl + " (UmbracoModule request)");
return umbracoApplicationUrl;
}
internal static string TryGetApplicationUrl(IUmbracoSettingsSection settings, ILogger logger, IGlobalSettings globalSettings, IServerRegistrar serverRegistrar)
{
// try umbracoSettings:settings/web.routing/@umbracoApplicationUrl
// which is assumed to:
// - end with SystemDirectories.Umbraco
// - contain a scheme
// - end or not with a slash, it will be taken care of
// eg "http://www.mysite.com/umbraco"
var url = settings.WebRouting.UmbracoApplicationUrl;
if (url.IsNullOrWhiteSpace() == false)
{
var umbracoApplicationUrl = url.TrimEnd('/');
logger.Info(TypeOfApplicationUrlHelper, "ApplicationUrl: " + umbracoApplicationUrl + " (using web.routing/@umbracoApplicationUrl)");
return umbracoApplicationUrl;
}
// try umbracoSettings:settings/scheduledTasks/@baseUrl
// which is assumed to:
// - end with SystemDirectories.Umbraco
// - NOT contain any scheme (because, legacy)
// - end or not with a slash, it will be taken care of
// eg "mysite.com/umbraco"
url = settings.ScheduledTasks.BaseUrl;
if (url.IsNullOrWhiteSpace() == false)
{
var ssl = globalSettings.UseHttps ? "s" : "";
url = "http" + ssl + "://" + url;
var umbracoApplicationUrl = url.TrimEnd('/');
logger.Info(TypeOfApplicationUrlHelper, "ApplicationUrl: " + umbracoApplicationUrl + " (using scheduledTasks/@baseUrl)");
return umbracoApplicationUrl;
}
// try the server registrar
// which is assumed to return a url that:
// - end with SystemDirectories.Umbraco
// - contain a scheme
// - end or not with a slash, it will be taken care of
// eg "http://www.mysite.com/umbraco"
url = serverRegistrar.GetCurrentServerUmbracoApplicationUrl();
if (url.IsNullOrWhiteSpace() == false)
{
var umbracoApplicationUrl = url.TrimEnd('/');
logger.Info(TypeOfApplicationUrlHelper, "ApplicationUrl: " + umbracoApplicationUrl + " (IServerRegistrar)");
return umbracoApplicationUrl;
}
// else give up...
return null;
}
public static string GetApplicationUrlFromCurrentRequest(HttpRequestBase request, IGlobalSettings globalSettings)
{
// if (HTTP and SSL not required) or (HTTPS and SSL required),
// use ports from request
// otherwise,
// if non-standard ports used,
// user may need to set umbracoApplicationUrl manually per
// https://our.umbraco.com/documentation/Using-Umbraco/Config-files/umbracoSettings/#ScheduledTasks
var port = (request.IsSecureConnection == false && globalSettings.UseHttps == false)
|| (request.IsSecureConnection && globalSettings.UseHttps)
? ":" + request.ServerVariables["SERVER_PORT"]
: "";
var useSsl = globalSettings.UseHttps || port == "443";
var ssl = useSsl ? "s" : ""; // force, whatever the first request
var url = "http" + ssl + "://" + request.ServerVariables["SERVER_NAME"] + port + IOHelper.ResolveUrl(SystemDirectories.Umbraco);
return url.TrimEnd('/');
}
}
}