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 typedef
HRESULT HRESULT
(WINAPI * PFN_ASPNETCORE_CREATE_APPLICATION)( (WINAPI * PFN_ASPNETCORE_CREATE_APPLICATION)(
_In_ IHttpServer *pServer, _In_ IHttpServer *pServer,
_In_ IHttpApplication *pHttpApplication, _In_ IHttpApplication *pHttpApplication,
_Out_ IAPPLICATION **pApplication _In_ APPLICATION_PARAMETER *pParameters,
_In_ DWORD nParameters,
_Out_ IAPPLICATION **pApplication
); );
extern BOOL g_fRecycleProcessCalled; extern BOOL g_fRecycleProcessCalled;

View File

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

View File

@ -14,6 +14,12 @@ enum APPLICATION_STATUS
FAIL FAIL
}; };
struct APPLICATION_PARAMETER
{
LPCSTR pzName;
PVOID pValue;
};
class IAPPLICATION class IAPPLICATION
{ {
public: public:
@ -46,10 +52,4 @@ public:
CreateHandler( CreateHandler(
_In_ IHttpContext *pHttpContext, _In_ IHttpContext *pHttpContext,
_Out_ IREQUEST_HANDLER **pRequestHandler) = 0; _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 HRESULT
__stdcall __stdcall
CreateApplication( CreateApplication(
_In_ IHttpServer *pServer, _In_ IHttpServer *pServer,
_In_ IHttpApplication *pHttpApplication, _In_ IHttpApplication *pHttpApplication,
_Out_ IAPPLICATION **ppApplication _In_ APPLICATION_PARAMETER *pParameters,
_In_ DWORD nParameters,
_Out_ IAPPLICATION **ppApplication
) )
{ {
REQUESTHANDLER_CONFIG *pConfig = NULL; REQUESTHANDLER_CONFIG *pConfig = NULL;
@ -97,11 +99,11 @@ CreateApplication(
auto config = std::unique_ptr<REQUESTHANDLER_CONFIG>(pConfig); 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)); auto pApplication = std::make_unique<IN_PROCESS_APPLICATION>(pServer, std::move(config), pParameters, nParameters);
if (FAILED(pApplication->LoadManagedApplication())) if (FAILED_LOG(pApplication->LoadManagedApplication()))
{ {
// Set the currently running application to a fake application that returns startup exceptions. // Set the currently running application to a fake application that returns startup exceptions.
*ppApplication = new StartupExceptionApplication(pServer, disableStartupPage); *ppApplication = new StartupExceptionApplication(pServer, disableStartupPage);

View File

@ -13,18 +13,22 @@
#include "exceptions.h" #include "exceptions.h"
#include "LoggingHelpers.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::s_Application = NULL;
IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION( IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION(
IHttpServer *pHttpServer, 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_pHttpServer(pHttpServer),
m_ProcessExitCode(0), m_ProcessExitCode(0),
m_fBlockCallbacksIntoManaged(FALSE), m_fBlockCallbacksIntoManaged(FALSE),
m_fInitialized(FALSE),
m_fShutdownCalledFromNative(FALSE), m_fShutdownCalledFromNative(FALSE),
m_fShutdownCalledFromManaged(FALSE), m_fShutdownCalledFromManaged(FALSE),
InProcessApplicationBase(pHttpServer), m_fInitialized(FALSE),
m_pConfig(std::move(pConfig)) m_pConfig(std::move(pConfig))
{ {
// is it guaranteed that we have already checked app offline at this point? // 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(pHttpServer != NULL);
DBG_ASSERT(pConfig != 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; m_status = APPLICATION_STATUS::STARTING;
} }

View File

@ -18,7 +18,9 @@ class IN_PROCESS_APPLICATION : public InProcessApplicationBase
public: public:
IN_PROCESS_APPLICATION( IN_PROCESS_APPLICATION(
IHttpServer* pHttpServer, IHttpServer* pHttpServer,
std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig); std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig,
APPLICATION_PARAMETER *pParameters,
DWORD nParameters);
~IN_PROCESS_APPLICATION(); ~IN_PROCESS_APPLICATION();
@ -42,19 +44,6 @@ public:
_Out_ IREQUEST_HANDLER **pRequestHandler) _Out_ IREQUEST_HANDLER **pRequestHandler)
override; 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 // Executes the .NET Core process
HRESULT HRESULT
ExecuteApplication( ExecuteApplication(
@ -162,7 +151,7 @@ private:
IOutputManager* m_pLoggerProvider; IOutputManager* m_pLoggerProvider;
std::unique_ptr<REQUESTHANDLER_CONFIG> m_pConfig; std::unique_ptr<REQUESTHANDLER_CONFIG> m_pConfig;
static const LPCSTR s_exeLocationParameterName;
static static
VOID VOID

View File

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

View File

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

View File

@ -3,6 +3,7 @@
using System; using System;
using System.IO; using System.IO;
using System.Linq;
using System.Net; using System.Net;
using System.Threading.Tasks; using System.Threading.Tasks;
using IISIntegration.FunctionalTests.Utilities; using IISIntegration.FunctionalTests.Utilities;
@ -77,6 +78,9 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
await AssertStarts( await AssertStarts(
deploymentResult => Helpers.ModifyAspNetCoreSectionInWebConfig(deploymentResult, "processPath", path), deploymentResult => Helpers.ModifyAspNetCoreSectionInWebConfig(deploymentResult, "processPath", path),
deploymentParameters => deploymentParameters.EnvironmentVariables["PATH"] = Path.GetDirectoryName(_dotnetLocation)); 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) private async Task AssertStarts(Action<IISDeploymentResult> postDeploy, Action<DeploymentParameters> preDeploy = null)