Pass parameters to createapplication method (#998)

This commit is contained in:
Pavel Krymets 2018-06-29 12:42:00 -07:00 committed by GitHub
parent dfed3d7563
commit 65d3787fc4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 65 additions and 51 deletions

View File

@ -20,9 +20,11 @@
typedef
HRESULT
(WINAPI * PFN_ASPNETCORE_CREATE_APPLICATION)(
_In_ IHttpServer *pServer,
_In_ IHttpApplication *pHttpApplication,
_Out_ IAPPLICATION **pApplication
_In_ IHttpServer *pServer,
_In_ IHttpApplication *pHttpApplication,
_In_ APPLICATION_PARAMETER *pParameters,
_In_ DWORD nParameters,
_Out_ IAPPLICATION **pApplication
);
extern BOOL g_fRecycleProcessCalled;

View File

@ -3,6 +3,7 @@
#include "applicationinfo.h"
#include <array>
#include "proxymodule.h"
#include "hostfxr_utility.h"
#include "utility.h"
@ -222,8 +223,16 @@ APPLICATION_INFO::EnsureApplicationCreated(
FINISHED(HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION));
}
FINISHED_IF_FAILED(m_pfnAspNetCoreCreateApplication(m_pServer, pHttpContext->GetApplication(), &pApplication));
pApplication->SetParameter(L"InProcessExeLocation", struExeLocation.QueryStr());
std::array<APPLICATION_PARAMETER, 1> parameters {
{"InProcessExeLocation", struExeLocation.QueryStr()}
};
FINISHED_IF_FAILED(m_pfnAspNetCoreCreateApplication(
m_pServer,
pHttpContext->GetApplication(),
parameters.data(),
static_cast<DWORD>(parameters.size()),
&pApplication));
m_pApplication = pApplication;
}

View File

@ -40,16 +40,6 @@ public:
}
}
VOID
SetParameter(
_In_ LPCWSTR pzName,
_In_ LPCWSTR pzValue)
override
{
UNREFERENCED_PARAMETER(pzName);
UNREFERENCED_PARAMETER(pzValue);
}
protected:
volatile APPLICATION_STATUS m_status = APPLICATION_STATUS::UNKNOWN;

View File

@ -14,6 +14,12 @@ enum APPLICATION_STATUS
FAIL
};
struct APPLICATION_PARAMETER
{
LPCSTR pzName;
PVOID pValue;
};
class IAPPLICATION
{
public:
@ -46,10 +52,4 @@ public:
CreateHandler(
_In_ IHttpContext *pHttpContext,
_Out_ IREQUEST_HANDLER **pRequestHandler) = 0;
virtual
VOID
SetParameter(
_In_ LPCWSTR pzName,
_In_ LPCWSTR pzValue) = 0;
};

View File

@ -82,9 +82,11 @@ BOOL APIENTRY DllMain(HMODULE hModule,
HRESULT
__stdcall
CreateApplication(
_In_ IHttpServer *pServer,
_In_ IHttpApplication *pHttpApplication,
_Out_ IAPPLICATION **ppApplication
_In_ IHttpServer *pServer,
_In_ IHttpApplication *pHttpApplication,
_In_ APPLICATION_PARAMETER *pParameters,
_In_ DWORD nParameters,
_Out_ IAPPLICATION **ppApplication
)
{
REQUESTHANDLER_CONFIG *pConfig = NULL;
@ -97,11 +99,11 @@ CreateApplication(
auto config = std::unique_ptr<REQUESTHANDLER_CONFIG>(pConfig);
BOOL disableStartupPage = pConfig->QueryDisableStartUpErrorPage();
const bool disableStartupPage = pConfig->QueryDisableStartUpErrorPage();
auto pApplication = std::make_unique<IN_PROCESS_APPLICATION>(pServer, std::move(config));
if (FAILED(pApplication->LoadManagedApplication()))
auto pApplication = std::make_unique<IN_PROCESS_APPLICATION>(pServer, std::move(config), pParameters, nParameters);
if (FAILED_LOG(pApplication->LoadManagedApplication()))
{
// Set the currently running application to a fake application that returns startup exceptions.
*ppApplication = new StartupExceptionApplication(pServer, disableStartupPage);

View File

@ -13,18 +13,22 @@
#include "exceptions.h"
#include "LoggingHelpers.h"
const LPCSTR IN_PROCESS_APPLICATION::s_exeLocationParameterName = "InProcessExeLocation";
IN_PROCESS_APPLICATION* IN_PROCESS_APPLICATION::s_Application = NULL;
IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION(
IHttpServer *pHttpServer,
std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig) :
std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig,
APPLICATION_PARAMETER *pParameters,
DWORD nParameters) :
InProcessApplicationBase(pHttpServer),
m_pHttpServer(pHttpServer),
m_ProcessExitCode(0),
m_fBlockCallbacksIntoManaged(FALSE),
m_fInitialized(FALSE),
m_fShutdownCalledFromNative(FALSE),
m_fShutdownCalledFromManaged(FALSE),
InProcessApplicationBase(pHttpServer),
m_fInitialized(FALSE),
m_pConfig(std::move(pConfig))
{
// is it guaranteed that we have already checked app offline at this point?
@ -32,6 +36,13 @@ IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION(
DBG_ASSERT(pHttpServer != NULL);
DBG_ASSERT(pConfig != NULL);
for (DWORD i = 0; i < nParameters; i++)
{
if (_stricmp(pParameters[i].pzName, s_exeLocationParameterName) == 0)
{
m_struExeLocation.Copy(reinterpret_cast<PCWSTR>(pParameters[i].pValue));
}
}
m_status = APPLICATION_STATUS::STARTING;
}

View File

@ -18,7 +18,9 @@ class IN_PROCESS_APPLICATION : public InProcessApplicationBase
public:
IN_PROCESS_APPLICATION(
IHttpServer* pHttpServer,
std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig);
std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig,
APPLICATION_PARAMETER *pParameters,
DWORD nParameters);
~IN_PROCESS_APPLICATION();
@ -42,19 +44,6 @@ public:
_Out_ IREQUEST_HANDLER **pRequestHandler)
override;
VOID
SetParameter(
_In_ LPCWSTR pzName,
_In_ LPCWSTR pzValue)
override
{
const auto exeLocationParameterName = L"InProcessExeLocation";
if (_wcsicmp(pzName, exeLocationParameterName) == 0)
{
m_struExeLocation.Copy(pzValue);
}
}
// Executes the .NET Core process
HRESULT
ExecuteApplication(
@ -162,7 +151,7 @@ private:
IOutputManager* m_pLoggerProvider;
std::unique_ptr<REQUESTHANDLER_CONFIG> m_pConfig;
static const LPCSTR s_exeLocationParameterName;
static
VOID

View File

@ -272,9 +272,13 @@ __stdcall
CreateApplication(
_In_ IHttpServer *pServer,
_In_ IHttpApplication *pHttpApplication,
_In_ APPLICATION_PARAMETER *pParameters,
_In_ DWORD nParameters,
_Out_ IAPPLICATION **ppApplication
)
{
UNREFERENCED_PARAMETER(pParameters);
UNREFERENCED_PARAMETER(nParameters);
HRESULT hr = S_OK;
IAPPLICATION *pApplication = NULL;
REQUESTHANDLER_CONFIG *pConfig = NULL;

View File

@ -3,6 +3,7 @@
#include "stdafx.h"
#include <array>
#include "inprocessapplication.h"
#include "fakeclasses.h"
@ -17,11 +18,13 @@ namespace InprocessTests
auto server = new MockHttpServer();
auto requestHandlerConfig = MockRequestHandlerConfig::CreateConfig();
auto config = std::unique_ptr<REQUESTHANDLER_CONFIG>(requestHandlerConfig);
IN_PROCESS_APPLICATION *app = new IN_PROCESS_APPLICATION(server, std::move(config));
{
std::wstring exePath(L"hello");
app->SetParameter(L"InProcessExeLocation", exePath.c_str());
}
std::wstring exePath(L"hello");
std::array<APPLICATION_PARAMETER, 1> parameters {
{"InProcessExeLocation", exePath.data()}
};
IN_PROCESS_APPLICATION *app = new IN_PROCESS_APPLICATION(server, std::move(config), parameters.data(), 1);
ASSERT_STREQ(app->QueryExeLocation(), L"hello");
}
}

View File

@ -3,6 +3,7 @@
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using IISIntegration.FunctionalTests.Utilities;
@ -77,6 +78,9 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
await AssertStarts(
deploymentResult => Helpers.ModifyAspNetCoreSectionInWebConfig(deploymentResult, "processPath", path),
deploymentParameters => deploymentParameters.EnvironmentVariables["PATH"] = Path.GetDirectoryName(_dotnetLocation));
// Verify that in this scenario where.exe was invoked only once by shim and request handler uses cached value
Assert.Equal(1, TestSink.Writes.Count(w => w.Message.Contains("Invoking where.exe to find dotnet.exe")));
}
private async Task AssertStarts(Action<IISDeploymentResult> postDeploy, Action<DeploymentParameters> preDeploy = null)