Only run fallback logic for dotnet and dotnet.exe (#1004)

This commit is contained in:
Pavel Krymets 2018-07-03 16:49:24 -07:00 committed by GitHub
parent e7d36a42e6
commit 724cc3ce88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 15 deletions

View File

@ -128,11 +128,6 @@ HOSTFXR_UTILITY::GetHostFxrParameters(
fs::path processPath = Environment::ExpandEnvironmentVariables(pcwzProcessPath); fs::path processPath = Environment::ExpandEnvironmentVariables(pcwzProcessPath);
std::wstring arguments = Environment::ExpandEnvironmentVariables(pcwzArguments); std::wstring arguments = Environment::ExpandEnvironmentVariables(pcwzArguments);
if (processPath.is_relative())
{
processPath = applicationPhysicalPath / processPath;
}
// Check if the absolute path is to dotnet or not. // Check if the absolute path is to dotnet or not.
if (IsDotnetExecutable(processPath)) if (IsDotnetExecutable(processPath))
{ {
@ -143,7 +138,7 @@ HOSTFXR_UTILITY::GetHostFxrParameters(
// Get the absolute path to dotnet. If the path is already an absolute path, it will return that path // Get the absolute path to dotnet. If the path is already an absolute path, it will return that path
// //
// Make sure to append the dotnet.exe path correctly here (pass in regular path)? // Make sure to append the dotnet.exe path correctly here (pass in regular path)?
auto fullProcessPath = GetAbsolutePathToDotnet(processPath); auto fullProcessPath = GetAbsolutePathToDotnet(applicationPhysicalPath, processPath);
if (!fullProcessPath.has_value()) if (!fullProcessPath.has_value())
{ {
return E_FAIL; return E_FAIL;
@ -172,6 +167,11 @@ HOSTFXR_UTILITY::GetHostFxrParameters(
{ {
WLOG_INFOF(L"Process path %s is not dotnet, treating application as standalone", processPath.c_str()); WLOG_INFOF(L"Process path %s is not dotnet, treating application as standalone", processPath.c_str());
if (processPath.is_relative())
{
processPath = applicationPhysicalPath / processPath;
}
// //
// The processPath is a path to the application executable // The processPath is a path to the application executable
// like: C:\test\MyApp.Exe or MyApp.Exe // like: C:\test\MyApp.Exe or MyApp.Exe
@ -331,11 +331,18 @@ Finished:
std::optional<fs::path> std::optional<fs::path>
HOSTFXR_UTILITY::GetAbsolutePathToDotnet( HOSTFXR_UTILITY::GetAbsolutePathToDotnet(
const fs::path & applicationPath,
const fs::path & requestedPath const fs::path & requestedPath
) )
{ {
WLOG_INFOF(L"Resolving absolute path to dotnet.exe from %s", requestedPath.c_str()); WLOG_INFOF(L"Resolving absolute path to dotnet.exe from %s", requestedPath.c_str());
auto processPath = requestedPath;
if (processPath.is_relative())
{
processPath = applicationPath / processPath;
}
// //
// If we are given an absolute path to dotnet.exe, we are done // If we are given an absolute path to dotnet.exe, we are done
// //
@ -360,7 +367,7 @@ HOSTFXR_UTILITY::GetAbsolutePathToDotnet(
// If we encounter any failures, try getting dotnet.exe from the // If we encounter any failures, try getting dotnet.exe from the
// backup location. // backup location.
// Only do it if no path is specified // Only do it if no path is specified
if (!requestedPath.has_parent_path()) if (requestedPath.has_parent_path())
{ {
return std::nullopt; return std::nullopt;
} }

View File

@ -91,6 +91,7 @@ public:
static static
std::optional<std::experimental::filesystem::path> std::optional<std::experimental::filesystem::path>
GetAbsolutePathToDotnet( GetAbsolutePathToDotnet(
_In_ const std::experimental::filesystem::path & applicationPath,
_In_ const std::experimental::filesystem::path & requestedPath _In_ const std::experimental::filesystem::path & requestedPath
); );
}; };

View File

@ -33,20 +33,18 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
deploymentParameters => deploymentParameters.EnvironmentVariables["DotnetPath"] = _dotnetLocation); deploymentParameters => deploymentParameters.EnvironmentVariables["DotnetPath"] = _dotnetLocation);
} }
[ConditionalFact] [ConditionalTheory]
public async Task InvalidProcessPath_ExpectServerError() [InlineData("bogus")]
[InlineData("c:\\random files\\dotnet.exe")]
[InlineData(".\\dotnet.exe")]
public async Task InvalidProcessPath_ExpectServerError(string path)
{ {
var dotnetLocation = "bogus";
var deploymentParameters = GetBaseDeploymentParameters(); var deploymentParameters = GetBaseDeploymentParameters();
// Point to dotnet installed in user profile.
deploymentParameters.EnvironmentVariables["DotnetPath"] = Environment.ExpandEnvironmentVariables(dotnetLocation); // Path to dotnet.
var deploymentResult = await DeployAsync(deploymentParameters); var deploymentResult = await DeployAsync(deploymentParameters);
Helpers.ModifyAspNetCoreSectionInWebConfig(deploymentResult, "processPath", "%DotnetPath%"); Helpers.ModifyAspNetCoreSectionInWebConfig(deploymentResult, "processPath", path);
// Request to base address and check if various parts of the body are rendered & measure the cold startup time.
var response = await deploymentResult.RetryingHttpClient.GetAsync("HelloWorld"); var response = await deploymentResult.RetryingHttpClient.GetAsync("HelloWorld");
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);