diff --git a/samples/IISSample/web.config b/samples/IISSample/web.config index 1ee540eb0f..ca998a82a4 100644 --- a/samples/IISSample/web.config +++ b/samples/IISSample/web.config @@ -9,11 +9,11 @@ - + - + diff --git a/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj b/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj index e848a32af8..be9582b9df 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj +++ b/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj @@ -82,7 +82,7 @@ WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions) precomp.hxx $(IntDir)$(TargetName).pch - ..\IISLib;.\Inc + ..\IISLib;inc;..\CommonLib ProgramDatabase MultiThreadedDebug true @@ -115,7 +115,7 @@ WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions) precomp.hxx $(IntDir)$(TargetName).pch - ..\IISLib;.\Inc + ..\IISLib;inc;..\CommonLib ProgramDatabase MultiThreadedDebug true @@ -148,7 +148,7 @@ true true WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions) - ..\IISLib;inc + ..\IISLib;inc;..\CommonLib precomp.hxx MultiThreaded true @@ -184,7 +184,7 @@ true WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions) precomp.hxx - ..\IISLib;inc + ..\IISLib;inc;..\CommonLib MultiThreaded true true @@ -213,6 +213,7 @@ + @@ -222,6 +223,7 @@ + diff --git a/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h b/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h index 96532217e6..b40a16c1a9 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h +++ b/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h @@ -9,9 +9,10 @@ extern BOOL g_fRecycleProcessCalled; typedef HRESULT (WINAPI * PFN_ASPNETCORE_CREATE_APPLICATION)( - _In_ IHttpServer *pServer, - _In_ ASPNETCORE_CONFIG *pConfig, - _Out_ IAPPLICATION **pApplication + _In_ IHttpServer *pServer, + _In_ IHttpContext *pHttpContext, + _In_ PCWSTR pwzExeLocation, // TODO remove both pwzExeLocation and pHttpContext from this api + _Out_ IAPPLICATION **pApplication ); // @@ -79,7 +80,7 @@ public: HRESULT Initialize( - _In_ ASPNETCORE_CONFIG *pConfiguration, + _In_ ASPNETCORE_SHIM_CONFIG *pConfiguration, _In_ FILE_WATCHER *pFileWatcher ); @@ -115,7 +116,7 @@ public: HRESULT StartMonitoringAppOffline(); - ASPNETCORE_CONFIG* + ASPNETCORE_SHIM_CONFIG* QueryConfig() { return m_pConfiguration; @@ -145,7 +146,10 @@ public: ShutDownApplication(); HRESULT - EnsureApplicationCreated(); + EnsureApplicationCreated( + IHttpContext *pHttpContext, + STRU* exeLocation + ); private: HRESULT FindRequestHandlerAssembly(); @@ -159,8 +163,8 @@ private: BOOL m_fAppOfflineFound; APP_OFFLINE_HTM *m_pAppOfflineHtm; FILE_WATCHER_ENTRY *m_pFileWatcherEntry; - ASPNETCORE_CONFIG *m_pConfiguration; - IAPPLICATION *m_pApplication; + ASPNETCORE_SHIM_CONFIG *m_pConfiguration; + IAPPLICATION *m_pApplication; SRWLOCK m_srwLock; IHttpServer *m_pServer; PFN_ASPNETCORE_CREATE_APPLICATION m_pfnAspNetCoreCreateApplication; diff --git a/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h b/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h index 7201d7de49..3e035e2133 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h +++ b/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h @@ -65,7 +65,7 @@ public: HRESULT GetOrCreateApplicationInfo( _In_ IHttpServer* pServer, - _In_ ASPNETCORE_CONFIG* pConfig, + _In_ ASPNETCORE_SHIM_CONFIG* pConfig, _Out_ APPLICATION_INFO ** ppApplicationInfo ); diff --git a/src/AspNetCoreModuleV2/AspNetCore/Inc/aspnetcore_shim_config.h b/src/AspNetCoreModuleV2/AspNetCore/Inc/aspnetcore_shim_config.h new file mode 100644 index 0000000000..55cbd4ca7b --- /dev/null +++ b/src/AspNetCoreModuleV2/AspNetCore/Inc/aspnetcore_shim_config.h @@ -0,0 +1,176 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +#pragma once +#define CS_ASPNETCORE_SECTION L"system.webServer/aspNetCore" +#define CS_ASPNETCORE_PROCESS_EXE_PATH L"processPath" +#define CS_ASPNETCORE_PROCESS_ARGUMENTS L"arguments" +#define CS_ASPNETCORE_HOSTING_MODEL L"hostingModel" + +enum APP_HOSTING_MODEL +{ + HOSTING_UNKNOWN = 0, + HOSTING_IN_PROCESS, + HOSTING_OUT_PROCESS +}; + +class ASPNETCORE_SHIM_CONFIG : IHttpStoredContext +{ +public: + virtual + ~ASPNETCORE_SHIM_CONFIG(); + + static + HRESULT + GetConfig( + _In_ IHttpServer *pHttpServer, + _In_ HTTP_MODULE_ID pModuleId, + _In_ IHttpApplication *pHttpApplication, + _In_ HANDLE hEventLog, + _Out_ STRU *pcwzExePath, + _Out_ ASPNETCORE_SHIM_CONFIG **ppAspNetCoreConfig + ); + + HRESULT + Populate( + IHttpServer *pHttpServer, + IHttpApplication *pHttpContext + ); + + VOID + ReferenceConfiguration( + VOID + ) const; + + VOID + DereferenceConfiguration( + VOID + ) const; + + + VOID + CleanupStoredContext( + VOID + ) + { + DereferenceConfiguration(); + } + + STRU* + QueryApplicationPhysicalPath( + VOID + ) + { + return &m_struApplicationPhysicalPath; + } + + STRU* + QueryApplicationPath( + VOID + ) + { + return &m_struApplication; + } + + CONST + PCWSTR* + QueryHostFxrArguments( + VOID + ) + { + return m_ppStrArguments; + } + + CONST + DWORD + QueryHostFxrArgCount( + VOID + ) + { + return m_dwArgc; + } + + STRU* + QueryConfigPath( + VOID + ) + { + return &m_struConfigPath; + } + + STRU* + QueryProcessPath( + VOID + ) + { + return &m_struProcessPath; + } + + STRU* + QueryArguments( + VOID + ) + { + return &m_struArguments; + } + + HRESULT + SetHostFxrFullPath( + PCWSTR pStrHostFxrFullPath + ) + { + return m_struHostFxrLocation.Copy(pStrHostFxrFullPath); + } + + APP_HOSTING_MODEL + QueryHostingModel( + VOID + ) + { + return m_hostingModel; + } + + CONST + PCWSTR + QueryHostFxrFullPath( + VOID + ) + { + return m_struHostFxrLocation.QueryStr(); + } + + VOID + SetHostFxrArguments( + DWORD dwArgc, + PWSTR* ppStrArguments + ) + { + if (m_ppStrArguments != NULL) + { + delete[] m_ppStrArguments; + } + + m_dwArgc = dwArgc; + m_ppStrArguments = ppStrArguments; + } + +private: + ASPNETCORE_SHIM_CONFIG() : + m_cRefs(1), + m_hostingModel(HOSTING_UNKNOWN), + m_ppStrArguments(NULL) + { + } + + mutable LONG m_cRefs; + STRU m_struArguments; + STRU m_struProcessPath; + STRU m_struApplication; + STRU m_struApplicationPhysicalPath; + STRU m_struConfigPath; + APP_HOSTING_MODEL m_hostingModel; + STRU m_struHostFxrLocation; + PWSTR* m_ppStrArguments; + DWORD m_dwArgc; +}; + diff --git a/src/AspNetCoreModuleV2/AspNetCore/Inc/fx_ver.h b/src/AspNetCoreModuleV2/AspNetCore/Inc/fx_ver.h deleted file mode 100644 index f485ba5a6e..0000000000 --- a/src/AspNetCoreModuleV2/AspNetCore/Inc/fx_ver.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -#ifndef __FX_VER_H__ -#define __FX_VER_H__ -#include - -// Note: This is not SemVer (esp., in comparing pre-release part, fx_ver_t does not -// compare multiple dot separated identifiers individually.) ex: 1.0.0-beta.2 vs. 1.0.0-beta.11 -struct fx_ver_t -{ - fx_ver_t(int major, int minor, int patch); - fx_ver_t(int major, int minor, int patch, const std::wstring& pre); - fx_ver_t(int major, int minor, int patch, const std::wstring& pre, const std::wstring& build); - - int get_major() const { return m_major; } - int get_minor() const { return m_minor; } - int get_patch() const { return m_patch; } - - void set_major(int m) { m_major = m; } - void set_minor(int m) { m_minor = m; } - void set_patch(int p) { m_patch = p; } - - bool is_prerelease() const { return !m_pre.empty(); } - - std::wstring as_str() const; - std::wstring prerelease_glob() const; - std::wstring patch_glob() const; - - bool operator ==(const fx_ver_t& b) const; - bool operator !=(const fx_ver_t& b) const; - bool operator <(const fx_ver_t& b) const; - bool operator >(const fx_ver_t& b) const; - bool operator <=(const fx_ver_t& b) const; - bool operator >=(const fx_ver_t& b) const; - - static bool parse(const std::wstring& ver, fx_ver_t* fx_ver, bool parse_only_production = false); - -private: - int m_major; - int m_minor; - int m_patch; - std::wstring m_pre; - std::wstring m_build; - - static int compare(const fx_ver_t&a, const fx_ver_t& b); -}; - -#endif // __FX_VER_H__ \ No newline at end of file diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp b/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp index 20d8ef7915..656e903b76 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp +++ b/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp @@ -42,8 +42,8 @@ APPLICATION_INFO::~APPLICATION_INFO() HRESULT APPLICATION_INFO::Initialize( - _In_ ASPNETCORE_CONFIG *pConfiguration, - _In_ FILE_WATCHER *pFileWatcher + _In_ ASPNETCORE_SHIM_CONFIG *pConfiguration, + _In_ FILE_WATCHER *pFileWatcher ) { HRESULT hr = S_OK; @@ -177,11 +177,14 @@ APPLICATION_INFO::UpdateAppOfflineFileHandle() } HRESULT -APPLICATION_INFO::EnsureApplicationCreated() +APPLICATION_INFO::EnsureApplicationCreated( + IHttpContext *pHttpContext, + STRU* struExeLocation +) { HRESULT hr = S_OK; BOOL fLocked = FALSE; - IAPPLICATION* pApplication = NULL; + IAPPLICATION *pApplication = NULL; STACK_STRU(struFileName, 300); // >MAX_PATH STRU struHostFxrDllLocation; @@ -222,11 +225,8 @@ APPLICATION_INFO::EnsureApplicationCreated() goto Finished; } - hr = m_pfnAspNetCoreCreateApplication(m_pServer, m_pConfiguration, &pApplication); - if (FAILED(hr)) - { - goto Finished; - } + hr = m_pfnAspNetCoreCreateApplication(m_pServer, pHttpContext, struExeLocation->QueryStr(), &pApplication); + m_pApplication = pApplication; } } @@ -314,6 +314,7 @@ APPLICATION_INFO::FindRequestHandlerAssembly() hr = HRESULT_FROM_WIN32(GetLastError()); goto Finished; } + g_fAspnetcoreRHAssemblyLoaded = TRUE; } @@ -323,6 +324,7 @@ Finished: // User needs to check whether the fuction pointer is NULL // m_pfnAspNetCoreCreateApplication = g_pfnAspNetCoreCreateApplication; + if (!g_fAspnetcoreRHLoadedError && FAILED(hr)) { g_fAspnetcoreRHLoadedError = TRUE; diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx b/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx index fd83a19818..c5e52862ad 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx +++ b/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx @@ -13,7 +13,7 @@ APPLICATION_MANAGER* APPLICATION_MANAGER::sm_pApplicationManager = NULL; HRESULT APPLICATION_MANAGER::GetOrCreateApplicationInfo( _In_ IHttpServer* pServer, - _In_ ASPNETCORE_CONFIG* pConfig, + _In_ ASPNETCORE_SHIM_CONFIG* pConfig, _Out_ APPLICATION_INFO ** ppApplicationInfo ) { diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/aspnetcore_shim_config.cpp b/src/AspNetCoreModuleV2/AspNetCore/src/aspnetcore_shim_config.cpp new file mode 100644 index 0000000000..dc100d8d21 --- /dev/null +++ b/src/AspNetCoreModuleV2/AspNetCore/src/aspnetcore_shim_config.cpp @@ -0,0 +1,240 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +#include "precomp.hxx" + +ASPNETCORE_SHIM_CONFIG::~ASPNETCORE_SHIM_CONFIG() +{ + if (m_ppStrArguments != NULL) + { + delete[] m_ppStrArguments; + m_ppStrArguments = NULL; + } +} + +VOID +ASPNETCORE_SHIM_CONFIG::ReferenceConfiguration( + VOID +) const +{ + InterlockedIncrement(&m_cRefs); +} + +VOID +ASPNETCORE_SHIM_CONFIG::DereferenceConfiguration( + VOID +) const +{ + DBG_ASSERT(m_cRefs != 0); + LONG cRefs = 0; + if ((cRefs = InterlockedDecrement(&m_cRefs)) == 0) + { + delete this; + } +} + +HRESULT +ASPNETCORE_SHIM_CONFIG::GetConfig( + _In_ IHttpServer *pHttpServer, + _In_ HTTP_MODULE_ID pModuleId, + _In_ IHttpApplication *pHttpApplication, + _In_ HANDLE hEventLog, + _Out_ STRU *struExeLocation, + _Out_ ASPNETCORE_SHIM_CONFIG **ppAspNetCoreShimConfig +) +{ + HRESULT hr = S_OK; + ASPNETCORE_SHIM_CONFIG *pAspNetCoreShimConfig = NULL; + STRU struHostFxrDllLocation; + STRU struExeAbsolutePath; + BSTR* pwzArgv; + DWORD dwArgCount; + if (ppAspNetCoreShimConfig == NULL) + { + hr = E_INVALIDARG; + goto Finished; + } + + *ppAspNetCoreShimConfig = NULL; + + // potential bug if user sepcific config at virtual dir level + pAspNetCoreShimConfig = (ASPNETCORE_SHIM_CONFIG*) + pHttpApplication->GetModuleContextContainer()->GetModuleContext(pModuleId); + + if (pAspNetCoreShimConfig != NULL) + { + *ppAspNetCoreShimConfig = pAspNetCoreShimConfig; + pAspNetCoreShimConfig = NULL; + goto Finished; + } + + pAspNetCoreShimConfig = new ASPNETCORE_SHIM_CONFIG; + if (pAspNetCoreShimConfig == NULL) + { + hr = E_OUTOFMEMORY; + goto Finished; + } + + hr = pAspNetCoreShimConfig->Populate(pHttpServer, pHttpApplication); + if (FAILED(hr)) + { + goto Finished; + } + + // Modify Inprocess specific configuration here. + if (pAspNetCoreShimConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_IN_PROCESS) + { + if (FAILED(hr = HOSTFXR_UTILITY::GetHostFxrParameters( + hEventLog, + pAspNetCoreShimConfig->QueryProcessPath()->QueryStr(), + pAspNetCoreShimConfig->QueryApplicationPhysicalPath()->QueryStr(), + pAspNetCoreShimConfig->QueryArguments()->QueryStr(), + &struHostFxrDllLocation, + &struExeAbsolutePath, + &dwArgCount, + &pwzArgv))) + { + goto Finished; + } + + if (FAILED(hr = pAspNetCoreShimConfig->SetHostFxrFullPath(struHostFxrDllLocation.QueryStr()))) + { + goto Finished; + } + + pAspNetCoreShimConfig->SetHostFxrArguments(dwArgCount, pwzArgv); + + struExeLocation->Copy(struExeAbsolutePath); + } + + hr = pHttpApplication->GetModuleContextContainer()-> + SetModuleContext(pAspNetCoreShimConfig, pModuleId); + + if (FAILED(hr)) + { + if (hr == HRESULT_FROM_WIN32(ERROR_ALREADY_ASSIGNED)) + { + delete pAspNetCoreShimConfig; + + pAspNetCoreShimConfig = (ASPNETCORE_SHIM_CONFIG*)pHttpApplication-> + GetModuleContextContainer()-> + GetModuleContext(pModuleId); + + _ASSERT(pAspNetCoreShimConfig != NULL); + + hr = S_OK; + } + else + { + goto Finished; + } + } + else + { + DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, + "ASPNETCORE_SHIM_CONFIG::GetConfig, set config to ModuleContext"); + } + + *ppAspNetCoreShimConfig = pAspNetCoreShimConfig; + pAspNetCoreShimConfig = NULL; + +Finished: + + if (pAspNetCoreShimConfig != NULL) + { + delete pAspNetCoreShimConfig; + pAspNetCoreShimConfig = NULL; + } + + return hr; +} + + +HRESULT +ASPNETCORE_SHIM_CONFIG::Populate( + IHttpServer *pHttpServer, + IHttpApplication *pHttpApplication +) +{ + STACK_STRU(strHostingModel, 300); + HRESULT hr = S_OK; + STRU strApplicationFullPath; + IAppHostAdminManager *pAdminManager = NULL; + IAppHostElement *pAspNetCoreElement = NULL; + BSTR bstrAspNetCoreSection = NULL; + + pAdminManager = pHttpServer->GetAdminManager(); + hr = m_struConfigPath.Copy(pHttpApplication->GetAppConfigPath()); + if (FAILED(hr)) + { + goto Finished; + } + + hr = m_struApplicationPhysicalPath.Copy(pHttpApplication->GetApplicationPhysicalPath()); + if (FAILED(hr)) + { + goto Finished; + } + + bstrAspNetCoreSection = SysAllocString(CS_ASPNETCORE_SECTION); + + hr = pAdminManager->GetAdminSection(bstrAspNetCoreSection, + m_struConfigPath.QueryStr(), + &pAspNetCoreElement); + if (FAILED(hr)) + { + goto Finished; + } + + hr = GetElementStringProperty(pAspNetCoreElement, + CS_ASPNETCORE_PROCESS_EXE_PATH, + &m_struProcessPath); + if (FAILED(hr)) + { + goto Finished; + } + + hr = GetElementStringProperty(pAspNetCoreElement, + CS_ASPNETCORE_HOSTING_MODEL, + &strHostingModel); + if (FAILED(hr)) + { + // Swallow this error for backward compatability + // Use default behavior for empty string + hr = S_OK; + } + + if (strHostingModel.IsEmpty() || strHostingModel.Equals(L"outofprocess", TRUE)) + { + m_hostingModel = HOSTING_OUT_PROCESS; + } + else if (strHostingModel.Equals(L"inprocess", TRUE)) + { + m_hostingModel = HOSTING_IN_PROCESS; + } + else + { + // block unknown hosting value + hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + goto Finished; + } + + hr = GetElementStringProperty(pAspNetCoreElement, + CS_ASPNETCORE_PROCESS_ARGUMENTS, + &m_struArguments); + if (FAILED(hr)) + { + goto Finished; + } + +Finished: + + if (pAspNetCoreElement != NULL) + { + pAspNetCoreElement->Release(); + pAspNetCoreElement = NULL; + } + + return hr; +} + diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/precomp.hxx b/src/AspNetCoreModuleV2/AspNetCore/src/precomp.hxx index bd07247484..d411a47308 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/precomp.hxx +++ b/src/AspNetCoreModuleV2/AspNetCore/src/precomp.hxx @@ -101,16 +101,17 @@ inline bool IsSpace(char ch) #include #include -#include "..\..\CommonLib\environmentvariablehash.h" -#include "..\..\CommonLib\aspnetcoreconfig.h" -#include "..\..\CommonLib\hostfxr_utility.h" -#include "..\..\CommonLib\iapplication.h" -#include "..\..\CommonLib\utility.h" -#include "..\..\CommonLib\debugutil.h" -#include "..\..\CommonLib\requesthandler.h" -#include "..\..\CommonLib\resources.h" -#include "..\..\CommonLib\aspnetcore_msg.h" +#include "environmentvariablehash.h" +#include "hostfxr_utility.h" +#include "utility.h" +#include "debugutil.h" +#include "requesthandler.h" +#include "resources.h" +#include "aspnetcore_msg.h" //#include "aspnetcore_event.h" +#include "aspnetcore_shim_config.h" +#include "fx_ver.h" + #include "appoffline.h" #include "filewatcher.h" #include "applicationinfo.h" diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx b/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx index 0c295fbd0c..141f3fb36a 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx +++ b/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx @@ -46,7 +46,6 @@ Return value: WEBSOCKET_HANDLER::StaticTerminate();*/ ALLOC_CACHE_HANDLER::StaticTerminate(); - delete this; } @@ -78,18 +77,20 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler( ) { HRESULT hr = S_OK; - ASPNETCORE_CONFIG *pConfig = NULL; + ASPNETCORE_SHIM_CONFIG *pConfig = NULL; APPLICATION_MANAGER *pApplicationManager = NULL; REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE; IAPPLICATION* pApplication = NULL; + STRU struExeLocation; STACK_STRU(struFileName, 256); + if (g_fInShutdown) { hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS); goto Finished; } - hr = ASPNETCORE_CONFIG::GetConfig(g_pHttpServer, g_pModuleId, pHttpContext, g_hEventLog, &pConfig); + hr = ASPNETCORE_SHIM_CONFIG::GetConfig(g_pHttpServer, g_pModuleId, pHttpContext->GetApplication(), g_hEventLog, &struExeLocation, &pConfig); if (FAILED(hr)) { goto Finished; @@ -143,7 +144,7 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler( } // make sure assmebly is loaded and application is created - hr = m_pApplicationInfo->EnsureApplicationCreated(); + hr = m_pApplicationInfo->EnsureApplicationCreated(pHttpContext, &struExeLocation); if (FAILED(hr)) { goto Finished; @@ -163,7 +164,6 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler( // Create RequestHandler and process the request hr = pApplication->CreateHandler(pHttpContext, - (HTTP_MODULE_ID*) &g_pModuleId, &m_pHandler); if (FAILED(hr)) diff --git a/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj b/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj index 525198f1b6..73b08b965e 100644 --- a/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj +++ b/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj @@ -95,6 +95,7 @@ MultiThreadedDebug false ProgramDatabase + ..\iislib; Windows @@ -114,6 +115,7 @@ false MultiThreadedDebug false + ..\iislib; Windows @@ -133,6 +135,7 @@ true MultiThreaded false + ..\iislib; Windows @@ -152,8 +155,7 @@ false NDEBUG;_LIB;%(PreprocessorDefinitions) true - - + ..\iislib; MultiThreaded @@ -171,13 +173,12 @@ + + - - - @@ -186,7 +187,6 @@ - diff --git a/src/AspNetCoreModuleV2/CommonLib/fx_ver.h b/src/AspNetCoreModuleV2/CommonLib/fx_ver.h index 1626b2697c..a8f8e26fff 100644 --- a/src/AspNetCoreModuleV2/CommonLib/fx_ver.h +++ b/src/AspNetCoreModuleV2/CommonLib/fx_ver.h @@ -43,4 +43,3 @@ private: static int compare(const fx_ver_t&a, const fx_ver_t& b); }; - diff --git a/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp b/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp index 1ad02feba2..68e6ea0584 100644 --- a/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp +++ b/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp @@ -26,12 +26,12 @@ HOSTFXR_UTILITY::~HOSTFXR_UTILITY() HRESULT HOSTFXR_UTILITY::GetStandaloneHostfxrParameters( PCWSTR pwzExeAbsolutePath, // includes .exe file extension. - PCWSTR pcwzApplicationPhysicalPath, + PCWSTR pcwzApplicationPhysicalPath, PCWSTR pcwzArguments, HANDLE hEventLog, - _Inout_ STRU* struHostFxrDllLocation, - _Out_ DWORD* pdwArgCount, - _Out_ PWSTR** ppwzArgv + _Inout_ STRU* pStruHostFxrDllLocation, + _Out_ DWORD* pdwArgCount, + _Out_ BSTR** ppwzArgv ) { HRESULT hr = S_OK; @@ -42,36 +42,36 @@ HOSTFXR_UTILITY::GetStandaloneHostfxrParameters( DWORD dwPosition; // Obtain the app name from the processPath section. - if ( FAILED( hr = struDllPath.Copy( pwzExeAbsolutePath ) ) ) + if (FAILED(hr = struDllPath.Copy(pwzExeAbsolutePath))) { goto Finished; } - dwPosition = struDllPath.LastIndexOf( L'.', 0 ); - if ( dwPosition == -1 ) + dwPosition = struDllPath.LastIndexOf(L'.', 0); + if (dwPosition == -1) { hr = E_FAIL; goto Finished; } - hr = UTILITY::ConvertPathToFullPath( L".\\hostfxr.dll", pcwzApplicationPhysicalPath, &struHostFxrPath ); - if ( FAILED( hr ) ) + hr = UTILITY::ConvertPathToFullPath(L".\\hostfxr.dll", pcwzApplicationPhysicalPath, &struHostFxrPath); + if (FAILED(hr)) { goto Finished; } - struDllPath.QueryStr()[dwPosition] = L'\0'; - if (FAILED(hr = struDllPath.SyncWithBuffer())) - { - goto Finished; - } + struDllPath.QueryStr()[dwPosition] = L'\0'; + if (FAILED(hr = struDllPath.SyncWithBuffer())) + { + goto Finished; + } - if ( !UTILITY::CheckIfFileExists( struHostFxrPath.QueryStr() ) ) + if (!UTILITY::CheckIfFileExists(struHostFxrPath.QueryStr())) { // Most likely a full framework app. // Check that the runtime config file doesn't exist in the folder as another heuristic. if (FAILED(hr = struRuntimeConfigLocation.Copy(struDllPath)) || - FAILED(hr = struRuntimeConfigLocation.Append( L".runtimeconfig.json" ))) + FAILED(hr = struRuntimeConfigLocation.Append(L".runtimeconfig.json"))) { goto Finished; } @@ -80,28 +80,28 @@ HOSTFXR_UTILITY::GetStandaloneHostfxrParameters( hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; UTILITY::LogEventF(hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_INPROCESS_FULL_FRAMEWORK_APP, - ASPNETCORE_EVENT_INPROCESS_FULL_FRAMEWORK_APP_MSG, - pcwzApplicationPhysicalPath, - hr); + EVENTLOG_ERROR_TYPE, + ASPNETCORE_EVENT_INPROCESS_FULL_FRAMEWORK_APP, + ASPNETCORE_EVENT_INPROCESS_FULL_FRAMEWORK_APP_MSG, + pcwzApplicationPhysicalPath, + hr); } else { // If a runtime config file does exist, report a file not found on the app.exe hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); - UTILITY::LogEventF(hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_APPLICATION_EXE_NOT_FOUND, - ASPNETCORE_EVENT_APPLICATION_EXE_NOT_FOUND_MSG, - pcwzApplicationPhysicalPath, - hr); + UTILITY::LogEventF(hEventLog, + EVENTLOG_ERROR_TYPE, + ASPNETCORE_EVENT_APPLICATION_EXE_NOT_FOUND, + ASPNETCORE_EVENT_APPLICATION_EXE_NOT_FOUND_MSG, + pcwzApplicationPhysicalPath, + hr); } goto Finished; } - if (FAILED(hr = struHostFxrDllLocation->Copy(struHostFxrPath))) + if (FAILED(hr = pStruHostFxrDllLocation->Copy(struHostFxrPath))) { goto Finished; } @@ -142,15 +142,26 @@ Finished: return hr; } +BOOL +HOSTFXR_UTILITY::IsDotnetExecutable(STRU *struExecutablePath) +{ + if (struExecutablePath == NULL) + { + return FALSE; + } + return struExecutablePath->EndsWith(L"dotnet.exe") || struExecutablePath->EndsWith(L"dotnet"); +} + HRESULT HOSTFXR_UTILITY::GetHostFxrParameters( - HANDLE hEventLog, - PCWSTR pcwzProcessPath, - PCWSTR pcwzApplicationPhysicalPath, - PCWSTR pcwzArguments, - _Inout_ STRU* struHostFxrDllLocation, - _Out_ DWORD* pdwArgCount, - _Out_ BSTR** pbstrArgv + _In_ HANDLE hEventLog, + _In_ PCWSTR pcwzProcessPath, + _In_ PCWSTR pcwzApplicationPhysicalPath, + _In_ PCWSTR pcwzArguments, + _Inout_ STRU *pStruHostFxrDllLocation, + _Inout_ STRU *pStruExeAbsolutePath, + _Out_ DWORD *pdwArgCount, + _Out_ BSTR **pbstrArgv ) { HRESULT hr = S_OK; @@ -182,7 +193,7 @@ HOSTFXR_UTILITY::GetHostFxrParameters( } // Check if the absolute path is to dotnet or not. - if (struAbsolutePathToDotnet.EndsWith(L"dotnet.exe") || struAbsolutePathToDotnet.EndsWith(L"dotnet")) + if (HOSTFXR_UTILITY::IsDotnetExecutable(&struAbsolutePathToDotnet)) { // // The processPath ends with dotnet.exe or dotnet @@ -199,7 +210,7 @@ HOSTFXR_UTILITY::GetHostFxrParameters( goto Finished; } - if (FAILED(hr = ParseHostfxrArguments( + if (FAILED(hr = HOSTFXR_UTILITY::ParseHostfxrArguments( struExpandedArguments.QueryStr(), struAbsolutePathToDotnet.QueryStr(), pcwzApplicationPhysicalPath, @@ -210,10 +221,14 @@ HOSTFXR_UTILITY::GetHostFxrParameters( goto Finished; } - if (FAILED(hr = struHostFxrDllLocation->Copy(struAbsolutePathToHostFxr))) + if (FAILED(hr = pStruHostFxrDllLocation->Copy(struAbsolutePathToHostFxr))) { goto Finished; } + + if (FAILED(hr = pStruExeAbsolutePath->Copy(struAbsolutePathToDotnet))) { + goto Finished; + } } else { @@ -224,14 +239,22 @@ HOSTFXR_UTILITY::GetHostFxrParameters( // if (UTILITY::CheckIfFileExists(struAbsolutePathToDotnet.QueryStr())) { - hr = GetStandaloneHostfxrParameters( + hr = HOSTFXR_UTILITY::GetStandaloneHostfxrParameters( struAbsolutePathToDotnet.QueryStr(), pcwzApplicationPhysicalPath, struExpandedArguments.QueryStr(), hEventLog, - struHostFxrDllLocation, + pStruHostFxrDllLocation, pdwArgCount, pbstrArgv); + if (FAILED(hr)) + { + goto Finished; + } + + if (FAILED(hr = pStruExeAbsolutePath->Copy(struAbsolutePathToDotnet))) { + goto Finished; + } } else { @@ -272,10 +295,10 @@ HOSTFXR_UTILITY::ParseHostfxrArguments( _Out_ BSTR** pbstrArgv ) { - UNREFERENCED_PARAMETER( hEventLog ); // TODO use event log to set errors. + UNREFERENCED_PARAMETER(hEventLog); // TODO use event log to set errors. - DBG_ASSERT(dwArgCount != NULL); - DBG_ASSERT(pwzArgv != NULL); + DBG_ASSERT(dwArgCount != NULL); + DBG_ASSERT(pwzArgv != NULL); HRESULT hr = S_OK; INT argc = 0; @@ -484,7 +507,7 @@ HOSTFXR_UTILITY::GetAbsolutePathToHostFxr( } // As we use the logic from core-setup, we are opting to use std here. - UTILITY::FindDotNetFolders(struHostFxrSearchExpression.QueryStr(), &vVersionFolders); + HOSTFXR_UTILITY::FindDotNetFolders(struHostFxrSearchExpression.QueryStr(), &vVersionFolders); if (vVersionFolders.size() == 0) { @@ -498,7 +521,7 @@ HOSTFXR_UTILITY::GetAbsolutePathToHostFxr( goto Finished; } - hr = UTILITY::FindHighestDotNetVersion(vVersionFolders, &struHighestDotnetVersion); + hr = FindHighestDotNetVersion(vVersionFolders, &struHighestDotnetVersion); if (FAILED(hr)) { goto Finished; @@ -805,3 +828,51 @@ HOSTFXR_UTILITY::GetAbsolutePathToDotnetFromProgramFiles( Finished: return hr; } + +HRESULT +HOSTFXR_UTILITY::FindHighestDotNetVersion( + _In_ std::vector vFolders, + _Out_ STRU *pstrResult +) +{ + HRESULT hr = S_OK; + fx_ver_t max_ver(-1, -1, -1); + for (const auto& dir : vFolders) + { + fx_ver_t fx_ver(-1, -1, -1); + if (fx_ver_t::parse(dir, &fx_ver, false)) + { + // TODO using max instead of std::max works + max_ver = max(max_ver, fx_ver); + } + } + + hr = pstrResult->Copy(max_ver.as_str().c_str()); + + // we check FAILED(hr) outside of function + return hr; +} + +VOID +HOSTFXR_UTILITY::FindDotNetFolders( + _In_ PCWSTR pszPath, + _Out_ std::vector *pvFolders +) +{ + HANDLE handle = NULL; + WIN32_FIND_DATAW data = { 0 }; + + handle = FindFirstFileExW(pszPath, FindExInfoStandard, &data, FindExSearchNameMatch, NULL, 0); + if (handle == INVALID_HANDLE_VALUE) + { + return; + } + + do + { + std::wstring folder(data.cFileName); + pvFolders->push_back(folder); + } while (FindNextFileW(handle, &data)); + + FindClose(handle); +} diff --git a/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h b/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h index e7703c5bfa..381270a222 100644 --- a/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h +++ b/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h @@ -11,20 +11,6 @@ typedef INT(*hostfxr_main_fn) (CONST DWORD argc, CONST PCWSTR argv[]); class HOSTFXR_UTILITY { public: - HOSTFXR_UTILITY(); - ~HOSTFXR_UTILITY(); - - static - HRESULT - GetHostFxrParameters( - HANDLE hEventLog, - PCWSTR pcwzProcessPath, - PCWSTR pcwzApplicationPhysicalPath, - PCWSTR pcwzArguments, - _Inout_ STRU* pStruHostFxrDllLocation, - _Out_ DWORD* pdwArgCount, - _Out_ BSTR** ppwzArgv - ); static HRESULT @@ -42,11 +28,30 @@ public: HRESULT ParseHostfxrArguments( PCWSTR pwzArgumentsFromConfig, - PCWSTR pwzExePath, - PCWSTR pcwzApplicationPhysicalPath, + PCWSTR pwzExePath, + PCWSTR pcwzApplicationPhysicalPath, HANDLE hEventLog, _Out_ DWORD* pdwArgCount, - _Out_ BSTR** ppwzArgv + _Out_ BSTR** pbstrArgv + ); + + static + BOOL + IsDotnetExecutable( + STRU* struExecutablePath + ); + + static + HRESULT + GetHostFxrParameters( + _In_ HANDLE hEventLog, + _In_ PCWSTR pcwzProcessPath, + _In_ PCWSTR pcwzApplicationPhysicalPath, + _In_ PCWSTR pcwzArguments, + _Inout_ STRU *pStruHostFxrDllLocation, + _Inout_ STRU *struExeAbsolutePath, + _Out_ DWORD *pdwArgCount, + _Out_ BSTR **ppwzArgv ); static @@ -74,5 +79,22 @@ public: GetAbsolutePathToDotnetFromProgramFiles( _Inout_ STRU* pStruAbsolutePathToDotnet ); + + static + HRESULT + FindHighestDotNetVersion( + _In_ std::vector vFolders, + _Out_ STRU *pstrResult + ); + + static + VOID + FindDotNetFolders( + _In_ PCWSTR pszPath, + _Out_ std::vector *pvFolders + ); + + HOSTFXR_UTILITY(); + ~HOSTFXR_UTILITY(); }; diff --git a/src/AspNetCoreModuleV2/CommonLib/iapplication.h b/src/AspNetCoreModuleV2/CommonLib/iapplication.h index 95d726ead7..36b2b40ddb 100644 --- a/src/AspNetCoreModuleV2/CommonLib/iapplication.h +++ b/src/AspNetCoreModuleV2/CommonLib/iapplication.h @@ -3,6 +3,8 @@ #pragma once +class IREQUEST_HANDLER; + enum APPLICATION_STATUS { UNKNOWN = 0, @@ -15,6 +17,7 @@ enum APPLICATION_STATUS class IAPPLICATION { public: + virtual VOID ShutDown() = 0; @@ -42,6 +45,5 @@ public: HRESULT CreateHandler( _In_ IHttpContext *pHttpContext, - _In_ HTTP_MODULE_ID *pModuleId, - _Out_ IREQUEST_HANDLER **pRequestHandler) = 0; + _Out_ IREQUEST_HANDLER **pRequestHandler) = 0; }; diff --git a/src/AspNetCoreModuleV2/CommonLib/irequesthandler.h b/src/AspNetCoreModuleV2/CommonLib/irequesthandler.h index fce1913c32..d3e5707063 100644 --- a/src/AspNetCoreModuleV2/CommonLib/irequesthandler.h +++ b/src/AspNetCoreModuleV2/CommonLib/irequesthandler.h @@ -3,8 +3,6 @@ #pragma once -#include "stdafx.h" - // // Pure abstract class // diff --git a/src/AspNetCoreModuleV2/CommonLib/stdafx.h b/src/AspNetCoreModuleV2/CommonLib/stdafx.h index 30186ed4ad..8bb2ef7406 100644 --- a/src/AspNetCoreModuleV2/CommonLib/stdafx.h +++ b/src/AspNetCoreModuleV2/CommonLib/stdafx.h @@ -14,25 +14,22 @@ #include #include #include "Shlwapi.h" -#include "..\IISLib\hashtable.h" -#include "..\IISLib\stringu.h" -#include "..\IISLib\stringa.h" -#include "..\IISLib\multisz.h" -#include "..\IISLib\dbgutil.h" -#include "..\IISLib\ahutil.h" -#include "..\IISLib\hashfn.h" +#include "hashtable.h" +#include "stringu.h" +#include "stringa.h" +#include "multisz.h" +#include "dbgutil.h" +#include "ahutil.h" +#include "hashfn.h" +#include "irequesthandler.h" +#include "requesthandler.h" +#include "iapplication.h" +#include "application.h" #include "SRWLockWrapper.h" #include "environmentvariablehash.h" #include "utility.h" -#include "aspnetcoreconfig.h" -#include "fx_ver.h" -#include "hostfxr_utility.h" #include "resources.h" #include "aspnetcore_msg.h" - -#include "irequesthandler.h" -#include "iapplication.h" -#include "requesthandler.h" -#include "application.h" - +#include "fx_ver.h" +#include "hostfxr_utility.h" diff --git a/src/AspNetCoreModuleV2/CommonLib/utility.cxx b/src/AspNetCoreModuleV2/CommonLib/utility.cxx index cb762f21bc..ed31d17305 100644 --- a/src/AspNetCoreModuleV2/CommonLib/utility.cxx +++ b/src/AspNetCoreModuleV2/CommonLib/utility.cxx @@ -506,30 +506,6 @@ Finished: return hr; } -HRESULT -UTILITY::FindHighestDotNetVersion( - _In_ std::vector vFolders, - _Out_ STRU *pstrResult -) -{ - HRESULT hr = S_OK; - fx_ver_t max_ver(-1, -1, -1); - for (const auto& dir : vFolders) - { - fx_ver_t fx_ver(-1, -1, -1); - if (fx_ver_t::parse(dir, &fx_ver, false)) - { - // TODO using max instead of std::max works - max_ver = max(max_ver, fx_ver); - } - } - - hr = pstrResult->Copy(max_ver.as_str().c_str()); - - // we check FAILED(hr) outside of function - return hr; -} - BOOL UTILITY::DirectoryExists( _In_ STRU *pstrPath @@ -545,30 +521,6 @@ UTILITY::DirectoryExists( return GetFileAttributesExW(pstrPath->QueryStr(), GetFileExInfoStandard, &data); } -VOID -UTILITY::FindDotNetFolders( - _In_ PCWSTR pszPath, - _Out_ std::vector *pvFolders -) -{ - HANDLE handle = NULL; - WIN32_FIND_DATAW data = { 0 }; - - handle = FindFirstFileExW(pszPath, FindExInfoStandard, &data, FindExSearchNameMatch, NULL, 0); - if (handle == INVALID_HANDLE_VALUE) - { - return; - } - - do - { - std::wstring folder(data.cFileName); - pvFolders->push_back(folder); - } while (FindNextFileW(handle, &data)); - - FindClose(handle); -} - BOOL UTILITY::CheckIfFileExists( _In_ PCWSTR pszFilePath diff --git a/src/AspNetCoreModuleV2/CommonLib/utility.h b/src/AspNetCoreModuleV2/CommonLib/utility.h index 830c2a0613..58a5824044 100644 --- a/src/AspNetCoreModuleV2/CommonLib/utility.h +++ b/src/AspNetCoreModuleV2/CommonLib/utility.h @@ -91,20 +91,6 @@ public: _In_ STRU *pstrPath ); - static - VOID - FindDotNetFolders( - _In_ PCWSTR pszPath, - _Out_ std::vector *pvFolders - ); - - static - HRESULT - FindHighestDotNetVersion( - _In_ std::vector vFolders, - _Out_ STRU *pstrResult - ); - static BOOL CheckIfFileExists( diff --git a/src/AspNetCoreModuleV2/RequestHandler/RequestHandler.vcxproj b/src/AspNetCoreModuleV2/RequestHandler/RequestHandler.vcxproj index 955839f2b9..ff49cffd42 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/RequestHandler.vcxproj +++ b/src/AspNetCoreModuleV2/RequestHandler/RequestHandler.vcxproj @@ -209,6 +209,7 @@ + @@ -237,6 +238,7 @@ + diff --git a/src/AspNetCoreModuleV2/RequestHandler/dllmain.cxx b/src/AspNetCoreModuleV2/RequestHandler/dllmain.cxx index 5014e3a3ef..d38d3a9417 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/dllmain.cxx +++ b/src/AspNetCoreModuleV2/RequestHandler/dllmain.cxx @@ -4,7 +4,7 @@ #include BOOL g_fNsiApiNotSupported = FALSE; -BOOL g_fWebSocketSupported = FALSE; +BOOL g_fWebSocketStaticInitialize = FALSE; BOOL g_fEnableReferenceCountTracing = FALSE; BOOL g_fGlobalInitialize = FALSE; BOOL g_fOutOfProcessInitialize = FALSE; @@ -21,7 +21,7 @@ IHttpServer * g_pHttpServer = NULL; HINSTANCE g_hWinHttpModule; HINSTANCE g_hAspNetCoreModule; HANDLE g_hEventLog = NULL; - +PCSTR g_szDebugLabel = "ASPNET_CORE_MODULE_REQUEST_HANDLER"; VOID InitializeGlobalConfiguration( @@ -113,7 +113,7 @@ InitializeGlobalConfiguration( g_fNsiApiNotSupported = TRUE; } - g_fWebSocketSupported = IsWindows8OrGreater(); + g_fWebSocketStaticInitialize = IsWindows8OrGreater(); g_fGlobalInitialize = TRUE; } @@ -167,7 +167,7 @@ EnsureOutOfProcessInitializtion() { if (hr == HRESULT_FROM_WIN32(ERROR_PROC_NOT_FOUND)) { - g_fWebSocketSupported = FALSE; + g_fWebSocketStaticInitialize = FALSE; } else { @@ -272,20 +272,28 @@ BOOL APIENTRY DllMain(HMODULE hModule, return TRUE; } +// TODO remove pHttpContext from the CreateApplication call. HRESULT __stdcall CreateApplication( _In_ IHttpServer *pServer, - _In_ ASPNETCORE_CONFIG *pConfig, - _Out_ IAPPLICATION **ppApplication + _In_ IHttpContext *pHttpContext, + _In_ PCWSTR pwzExeLocation, + _Out_ IAPPLICATION **ppApplication ) { HRESULT hr = S_OK; IAPPLICATION *pApplication = NULL; - + REQUESTHANDLER_CONFIG *pConfig = NULL; // Initialze some global variables here InitializeGlobalConfiguration(pServer); + hr = REQUESTHANDLER_CONFIG::CreateRequestHandlerConfig(pServer, pHttpContext->GetApplication(), pwzExeLocation, g_hEventLog, &pConfig); + if (FAILED(hr)) + { + return hr; + } + if (pConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_IN_PROCESS) { pApplication = new IN_PROCESS_APPLICATION(pServer, pConfig); @@ -303,7 +311,6 @@ CreateApplication( goto Finished; } - pApplication = new OUT_OF_PROCESS_APPLICATION(pConfig); if (pApplication == NULL) { diff --git a/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.cpp b/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.cpp index ca599c9389..08e5526879 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.cpp +++ b/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.cpp @@ -4,7 +4,7 @@ IN_PROCESS_APPLICATION* IN_PROCESS_APPLICATION::s_Application = NULL; IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION( IHttpServer* pHttpServer, - ASPNETCORE_CONFIG* pConfig) : + REQUESTHANDLER_CONFIG *pConfig) : m_pHttpServer(pHttpServer), m_ProcessExitCode(0), m_hLogFileHandle(INVALID_HANDLE_VALUE), @@ -16,15 +16,15 @@ IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION( m_fInitialized(FALSE), m_fShutdownCalledFromNative(FALSE), m_fShutdownCalledFromManaged(FALSE), - m_srwLock(), - m_pConfig(pConfig) + m_srwLock() { // is it guaranteed that we have already checked app offline at this point? // If so, I don't think there is much to do here. DBG_ASSERT(pHttpServer != NULL); DBG_ASSERT(pConfig != NULL); - InitializeSRWLock(&m_srwLock); + InitializeSRWLock(&m_srwLock); + m_pConfig = pConfig; // TODO we can probably initialized as I believe we are the only ones calling recycle. m_status = APPLICATION_STATUS::STARTING; } @@ -38,6 +38,12 @@ IN_PROCESS_APPLICATION::~IN_PROCESS_APPLICATION() m_hLogFileHandle = INVALID_HANDLE_VALUE; } + if (m_pConfig != NULL) + { + delete m_pConfig; + m_pConfig = NULL; + } + m_hThread = NULL; s_Application = NULL; } @@ -110,7 +116,7 @@ Finished: // Managed layer may block the shutdown and lead to shutdown timeout // Assumption: only one inprocess application is hosted. // Call process exit to force shutdown - // + // exit(hr); } } @@ -807,7 +813,9 @@ IN_PROCESS_APPLICATION::ExecuteApplication( DBG_ASSERT(m_status == APPLICATION_STATUS::STARTING); - hModule = LoadLibraryW(m_pConfig->QueryHostFxrFullPath()); + // hostfxr should already be loaded by the shim. If not, then we will need + // to load it ourselves by finding hostfxr again. + hModule = LoadLibraryW(L"hostfxr.dll"); if (hModule == NULL) { @@ -986,7 +994,7 @@ IN_PROCESS_APPLICATION::FilterException(unsigned int, struct _EXCEPTION_POINTERS return EXCEPTION_EXECUTE_HANDLER; } -ASPNETCORE_CONFIG* +REQUESTHANDLER_CONFIG* IN_PROCESS_APPLICATION::QueryConfig() const { return m_pConfig; @@ -995,12 +1003,12 @@ IN_PROCESS_APPLICATION::QueryConfig() const HRESULT IN_PROCESS_APPLICATION::CreateHandler( _In_ IHttpContext *pHttpContext, - _In_ HTTP_MODULE_ID *pModuleId, - _Out_ IREQUEST_HANDLER **pRequestHandler) + _Out_ IREQUEST_HANDLER **pRequestHandler) { HRESULT hr = S_OK; IREQUEST_HANDLER* pHandler = NULL; - pHandler = new IN_PROCESS_HANDLER(pHttpContext, pModuleId, this); + + pHandler = new IN_PROCESS_HANDLER(pHttpContext, this); if (pHandler == NULL) { diff --git a/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.h b/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.h index 6c27d8e202..cc504cf48c 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.h +++ b/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.h @@ -2,6 +2,7 @@ // Licensed under the MIT License. See License.txt in the project root for license information. #pragma once +typedef INT(*hostfxr_main_fn) (CONST DWORD argc, CONST PCWSTR argv[]); // TODO these may need to be BSTRs typedef REQUEST_NOTIFICATION_STATUS(WINAPI * PFN_REQUEST_HANDLER) (IN_PROCESS_HANDLER* pInProcessHandler, void* pvRequestHandlerContext); typedef BOOL(WINAPI * PFN_SHUTDOWN_HANDLER) (void* pvShutdownHandlerContext); @@ -10,10 +11,15 @@ typedef REQUEST_NOTIFICATION_STATUS(WINAPI * PFN_MANAGED_CONTEXT_HANDLER)(void * class IN_PROCESS_APPLICATION : public APPLICATION { public: - IN_PROCESS_APPLICATION(IHttpServer* pHttpServer, ASPNETCORE_CONFIG* pConfig); + IN_PROCESS_APPLICATION(IHttpServer* pHttpServer, REQUESTHANDLER_CONFIG *pConfig); ~IN_PROCESS_APPLICATION(); + HRESULT + Initialize( + VOID + ); + __override VOID ShutDown(); @@ -37,7 +43,6 @@ public: HRESULT CreateHandler( _In_ IHttpContext *pHttpContext, - _In_ HTTP_MODULE_ID *pModuleId, _Out_ IREQUEST_HANDLER **pRequestHandler) override; @@ -106,9 +111,15 @@ public: return s_Application; } - ASPNETCORE_CONFIG* + REQUESTHANDLER_CONFIG* QueryConfig() const; + PCWSTR + QueryExeLocation() + { + return m_struExeLocation.QueryStr(); + } + private: static DWORD @@ -144,6 +155,7 @@ private: HANDLE m_hErrReadPipe; HANDLE m_hErrWritePipe; STRU m_struLogFilePath; + STRU m_struExeLocation; // The exit code of the .NET Core process INT m_ProcessExitCode; @@ -166,7 +178,7 @@ private: DWORD m_dwStdErrReadTotal; static IN_PROCESS_APPLICATION* s_Application; - ASPNETCORE_CONFIG* m_pConfig; + REQUESTHANDLER_CONFIG* m_pConfig; VOID SetStdOut( diff --git a/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.cpp b/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.cpp index a8bce9b974..82e3328388 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.cpp +++ b/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.cpp @@ -2,11 +2,9 @@ IN_PROCESS_HANDLER::IN_PROCESS_HANDLER( _In_ IHttpContext *pW3Context, - _In_ HTTP_MODULE_ID *pModuleId, _In_ IN_PROCESS_APPLICATION *pApplication ): m_pW3Context(pW3Context), - m_pApplication(pApplication), - m_pModuleId(*pModuleId) + m_pApplication(pApplication) { m_fManagedRequestComplete = FALSE; } @@ -22,7 +20,9 @@ IN_PROCESS_HANDLER::OnExecuteRequestHandler() { // First get the in process Application HRESULT hr; + hr = m_pApplication->LoadManagedApplication(); + if (FAILED(hr)) { // TODO remove com_error? diff --git a/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.h b/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.h index 344bde1bb0..5fbaa96940 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.h +++ b/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.h @@ -8,7 +8,6 @@ public: IN_PROCESS_HANDLER( _In_ IHttpContext *pW3Context, - _In_ HTTP_MODULE_ID *pModuleId, _In_ IN_PROCESS_APPLICATION *pApplication); ~IN_PROCESS_HANDLER() override; @@ -67,11 +66,9 @@ public: private: PVOID m_pManagedHttpContext; - IHttpContext* m_pHttpContext; BOOL m_fManagedRequestComplete; REQUEST_NOTIFICATION_STATUS m_requestNotificationStatus; IHttpContext* m_pW3Context; IN_PROCESS_APPLICATION* m_pApplication; - HTTP_MODULE_ID m_pModuleId; }; diff --git a/src/AspNetCoreModuleV2/RequestHandler/managedexports.cxx b/src/AspNetCoreModuleV2/RequestHandler/managedexports.cxx index 85eb5b4d47..5d7abb77da 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/managedexports.cxx +++ b/src/AspNetCoreModuleV2/RequestHandler/managedexports.cxx @@ -165,7 +165,7 @@ http_get_application_properties( _In_ IISConfigurationData* pIISCofigurationData ) { - ASPNETCORE_CONFIG* pConfiguration = NULL; + REQUESTHANDLER_CONFIG* pConfiguration = NULL; IN_PROCESS_APPLICATION* pApplication = IN_PROCESS_APPLICATION::GetInstance(); if (pApplication == NULL) @@ -373,11 +373,6 @@ http_enable_websockets( _In_ IN_PROCESS_HANDLER* pInProcessHandler ) { - //if (!g_fWebSocketSupported) - //{ - // return E_FAIL; - //} - ((IHttpContext3*)pInProcessHandler->QueryHttpContext())->EnableFullDuplex(); ((IHttpResponse2*)pInProcessHandler->QueryHttpContext()->GetResponse())->DisableBuffering(); diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.cpp b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.cpp index f15be2a3f3..149b06edef 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.cpp +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.cpp @@ -18,9 +18,8 @@ PROTOCOL_CONFIG FORWARDING_HANDLER::sm_ProtocolConfig; RESPONSE_HEADER_HASH * FORWARDING_HANDLER::sm_pResponseHeaderHash = NULL; FORWARDING_HANDLER::FORWARDING_HANDLER( - _In_ IHttpContext *pW3Context, - _In_ HTTP_MODULE_ID *pModuleId, - _In_ OUT_OF_PROCESS_APPLICATION *pApplication + _In_ IHttpContext *pW3Context, + _In_ OUT_OF_PROCESS_APPLICATION *pApplication ) : IREQUEST_HANDLER(), m_Signature(FORWARDING_HANDLER_SIGNATURE), m_RequestStatus(FORWARDER_START), @@ -42,14 +41,14 @@ FORWARDING_HANDLER::FORWARDING_HANDLER( m_fServerResetConn(FALSE), m_cRefs(1), m_pW3Context(pW3Context), - m_pApplication(pApplication), - m_pModuleId(*pModuleId) + m_pApplication(pApplication) { #ifdef DEBUG DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, "FORWARDING_HANDLER::FORWARDING_HANDLER"); #endif + m_fWebSocketSupported = m_pApplication->QueryWebsocketStatus(); InitializeSRWLock(&m_RequestLock); } @@ -182,7 +181,7 @@ FORWARDING_HANDLER::OnExecuteRequestHandler() // // Mark request as websocket if upgrade header is present. // - if (pApplication->QueryConfig()->QueryWebSocketEnabled()) + if (m_fWebSocketSupported) { USHORT cchHeader = 0; PCSTR pszWebSocketHeader = pRequest->GetHeader("Upgrade", &cchHeader); diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.h b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.h index 458d07dba4..725b8ea76c 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.h +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.h @@ -21,10 +21,9 @@ class FORWARDING_HANDLER : public REQUEST_HANDLER { public: FORWARDING_HANDLER( - - _In_ IHttpContext *pW3Context, - _In_ HTTP_MODULE_ID *pModuleId, - _In_ OUT_OF_PROCESS_APPLICATION *pApplication); + _In_ IHttpContext *pW3Context, + _In_ OUT_OF_PROCESS_APPLICATION *pApplication + ); ~FORWARDING_HANDLER(); @@ -178,6 +177,7 @@ private: FORWARDING_REQUEST_STATUS m_RequestStatus; BOOL m_fWebSocketEnabled; + BOOL m_fWebSocketSupported; BOOL m_fResponseHeadersReceivedAndSet; BOOL m_fResetConnection; BOOL m_fDoReverseRewriteHeaders; diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.cpp b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.cpp index ba6e3c9b4f..356029efd3 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.cpp +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.cpp @@ -1,12 +1,13 @@ #include "..\precomp.hxx" OUT_OF_PROCESS_APPLICATION::OUT_OF_PROCESS_APPLICATION( - ASPNETCORE_CONFIG* pConfig) : + REQUESTHANDLER_CONFIG *pConfig) : + m_fWebSocketSupported(WEBSOCKET_STATUS::WEBSOCKET_UNKNOWN), m_pConfig(pConfig) { m_status = APPLICATION_STATUS::RUNNING; m_pProcessManager = NULL; - InitializeSRWLock(&rwlock); + InitializeSRWLock(&m_srwLock); } OUT_OF_PROCESS_APPLICATION::~OUT_OF_PROCESS_APPLICATION() @@ -17,6 +18,12 @@ OUT_OF_PROCESS_APPLICATION::~OUT_OF_PROCESS_APPLICATION() m_pProcessManager->DereferenceProcessManager(); m_pProcessManager = NULL; } + + if (m_pConfig != NULL) + { + delete m_pConfig; + m_pConfig = NULL; + } } HRESULT @@ -49,10 +56,10 @@ OUT_OF_PROCESS_APPLICATION::GetProcess( _Out_ SERVER_PROCESS **ppServerProcess ) { - return m_pProcessManager->GetProcess(m_pConfig, ppServerProcess); + return m_pProcessManager->GetProcess(m_pConfig, QueryWebsocketStatus(), ppServerProcess); } -ASPNETCORE_CONFIG* +REQUESTHANDLER_CONFIG* OUT_OF_PROCESS_APPLICATION::QueryConfig() const { return m_pConfig; @@ -62,7 +69,7 @@ __override VOID OUT_OF_PROCESS_APPLICATION::ShutDown() { - AcquireSRWLockExclusive(&rwlock); + AcquireSRWLockExclusive(&m_srwLock); { if (m_pProcessManager != NULL) { @@ -71,7 +78,7 @@ OUT_OF_PROCESS_APPLICATION::ShutDown() m_pProcessManager = NULL; } } - ReleaseSRWLockExclusive(&rwlock); + ReleaseSRWLockExclusive(&m_srwLock); } __override @@ -84,12 +91,18 @@ OUT_OF_PROCESS_APPLICATION::Recycle() HRESULT OUT_OF_PROCESS_APPLICATION::CreateHandler( _In_ IHttpContext *pHttpContext, - _In_ HTTP_MODULE_ID *pModuleId, - _Out_ IREQUEST_HANDLER **pRequestHandler) + _Out_ IREQUEST_HANDLER **pRequestHandler) { HRESULT hr = S_OK; IREQUEST_HANDLER* pHandler = NULL; - pHandler = new FORWARDING_HANDLER(pHttpContext, pModuleId, this); + + //add websocket check here + if (m_fWebSocketSupported == WEBSOCKET_STATUS::WEBSOCKET_UNKNOWN) + { + SetWebsocketStatus(pHttpContext); + } + + pHandler = new FORWARDING_HANDLER(pHttpContext, this); if (pHandler == NULL) { @@ -99,3 +112,31 @@ OUT_OF_PROCESS_APPLICATION::CreateHandler( *pRequestHandler = pHandler; return hr; } + +VOID +OUT_OF_PROCESS_APPLICATION::SetWebsocketStatus( + IHttpContext* pHttpContext +) +{ + // Even though the applicationhost.config file contains the websocket element, + // the websocket module may still not be enabled. + PCWSTR pszTempWebsocketValue; + DWORD cbLength; + HRESULT hr; + + hr = pHttpContext->GetServerVariable("WEBSOCKET_VERSION", &pszTempWebsocketValue, &cbLength); + if (FAILED(hr)) + { + m_fWebSocketSupported = WEBSOCKET_STATUS::WEBSOCKET_NOT_SUPPORTED; + } + else + { + m_fWebSocketSupported = WEBSOCKET_STATUS::WEBSOCKET_SUPPORTED; + } +} + +BOOL +OUT_OF_PROCESS_APPLICATION::QueryWebsocketStatus() const +{ + return m_fWebSocketSupported == WEBSOCKET_STATUS::WEBSOCKET_SUPPORTED; +} diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.h b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.h index cd6f935098..9601178e63 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.h +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.h @@ -1,10 +1,20 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + #pragma once class OUT_OF_PROCESS_APPLICATION : public APPLICATION { + enum WEBSOCKET_STATUS + { + WEBSOCKET_UNKNOWN = 0, + WEBSOCKET_NOT_SUPPORTED, + WEBSOCKET_SUPPORTED, + }; public: - OUT_OF_PROCESS_APPLICATION(ASPNETCORE_CONFIG *pConfig); + OUT_OF_PROCESS_APPLICATION( + REQUESTHANDLER_CONFIG *pConfig); __override ~OUT_OF_PROCESS_APPLICATION() override; @@ -31,18 +41,25 @@ public: HRESULT CreateHandler( _In_ IHttpContext *pHttpContext, - _In_ HTTP_MODULE_ID *pModuleId, _Out_ IREQUEST_HANDLER **pRequestHandler) override; - ASPNETCORE_CONFIG* + REQUESTHANDLER_CONFIG* QueryConfig() const; + BOOL + QueryWebsocketStatus() + const; + private: - PROCESS_MANAGER * m_pProcessManager; - SRWLOCK rwlock; + VOID SetWebsocketStatus(IHttpContext *pHttpContext); - ASPNETCORE_CONFIG* m_pConfig; + PROCESS_MANAGER * m_pProcessManager; + SRWLOCK m_srwLock; + IHttpServer *m_pHttpServer; + + REQUESTHANDLER_CONFIG* m_pConfig; + WEBSOCKET_STATUS m_fWebSocketSupported; }; diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.cxx b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.cxx index 7e8c58462a..7c75d65a0d 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.cxx +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.cxx @@ -103,8 +103,9 @@ PROCESS_MANAGER::~PROCESS_MANAGER() HRESULT PROCESS_MANAGER::GetProcess( - _In_ ASPNETCORE_CONFIG *pConfig, - _Out_ SERVER_PROCESS **ppServerProcess + _In_ REQUESTHANDLER_CONFIG *pConfig, + _In_ BOOL fWebsocketSupported, + _Out_ SERVER_PROCESS **ppServerProcess ) { HRESULT hr = S_OK; @@ -220,7 +221,7 @@ PROCESS_MANAGER::GetProcess( pConfig->QueryAnonymousAuthEnabled(), pConfig->QueryEnvironmentVariables(), pConfig->QueryStdoutLogEnabled(), - pConfig->QueryWebSocketEnabled(), + fWebsocketSupported, pConfig->QueryStdoutLogFile(), pConfig->QueryApplicationPhysicalPath(), // physical path pConfig->QueryApplicationPath(), // app path diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.h b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.h index 9523e8a819..b15da72486 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.h +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.h @@ -30,8 +30,9 @@ public: HRESULT GetProcess( - _In_ ASPNETCORE_CONFIG *pConfig, - _Out_ SERVER_PROCESS **ppServerProcess + _In_ REQUESTHANDLER_CONFIG *pConfig, + _In_ BOOL fWebsocketEnabled, + _Out_ SERVER_PROCESS **ppServerProcess ); HANDLE @@ -192,4 +193,4 @@ private: volatile static BOOL sm_fWSAStartupDone; volatile BOOL m_fServerProcessListReady; -}; \ No newline at end of file +}; diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.cxx b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.cxx index 9faebab82a..bb59a5ff3d 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.cxx +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.cxx @@ -41,7 +41,7 @@ Finished: VOID PROTOCOL_CONFIG::OverrideConfig( - ASPNETCORE_CONFIG *pAspNetCoreConfig + REQUESTHANDLER_CONFIG *pAspNetCoreConfig ) { m_msTimeout = pAspNetCoreConfig->QueryRequestTimeoutInMS(); diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.h b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.h index 0bb34aa53d..a31ca1ee33 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.h +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.h @@ -16,7 +16,7 @@ class PROTOCOL_CONFIG VOID OverrideConfig( - ASPNETCORE_CONFIG *pAspNetCoreConfig + REQUESTHANDLER_CONFIG *pAspNetCoreConfig ); BOOL diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.cxx b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.cxx index dc4aace72b..cedbd0ba12 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.cxx +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.cxx @@ -22,23 +22,23 @@ SERVER_PROCESS::Initialize( BOOL fAnonymousAuthEnabled, ENVIRONMENT_VAR_HASH *pEnvironmentVariables, BOOL fStdoutLogEnabled, - BOOL fWebsocketsEnabled, + BOOL fWebSocketSupported, STRU *pstruStdoutLogFile, STRU *pszAppPhysicalPath, STRU *pszAppPath, STRU *pszAppVirtualPath ) { - HRESULT hr = S_OK; + HRESULT hr = S_OK; m_pProcessManager = pProcessManager; m_dwStartupTimeLimitInMS = dwStartupTimeLimitInMS; m_dwShutdownTimeLimitInMS = dwShtudownTimeLimitInMS; m_fStdoutLogEnabled = fStdoutLogEnabled; + m_fWebSocketSupported = fWebSocketSupported; m_fWindowsAuthEnabled = fWindowsAuthEnabled; m_fBasicAuthEnabled = fBasicAuthEnabled; m_fAnonymousAuthEnabled = fAnonymousAuthEnabled; - m_fWebsocketsEnabled = fWebsocketsEnabled; m_pProcessManager->ReferenceProcessManager(); m_fDebuggerAttached = FALSE; @@ -790,7 +790,7 @@ SERVER_PROCESS::StartProcess( if (FAILED(hr = ENVIRONMENT_VAR_HELPERS::AddWebsocketEnabledToEnvironmentVariables( pHashTable, - m_fWebsocketsEnabled + m_fWebSocketSupported ))) { pStrStage = L"AddWebsocketEnabledToEnvironmentVariables"; diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.h b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.h index e60454cac0..504232e486 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.h +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.h @@ -33,7 +33,7 @@ public: _In_ BOOL fAnonymousAuthEnabled, _In_ ENVIRONMENT_VAR_HASH* pEnvironmentVariables, _In_ BOOL fStdoutLogEnabled, - _In_ BOOL fWebsocketsEnabled, + _In_ BOOL fWebSocketSupported, _In_ STRU *pstruStdoutLogFile, _In_ STRU *pszAppPhysicalPath, _In_ STRU *pszAppPath, @@ -234,10 +234,10 @@ private: FORWARDER_CONNECTION *m_pForwarderConnection; BOOL m_fStdoutLogEnabled; + BOOL m_fWebSocketSupported; BOOL m_fWindowsAuthEnabled; BOOL m_fBasicAuthEnabled; BOOL m_fAnonymousAuthEnabled; - BOOL m_fWebsocketsEnabled; BOOL m_fDebuggerAttached; STTIMER m_Timer; diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.cxx b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.cxx index ae7ecf697e..4d86fe592e 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.cxx +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.cxx @@ -94,7 +94,7 @@ WEBSOCKET_HANDLER::StaticInitialize( --*/ { - if (!g_fWebSocketSupported) + if (!g_fWebSocketStaticInitialize) { return S_OK; } @@ -120,7 +120,7 @@ WEBSOCKET_HANDLER::StaticTerminate( VOID ) { - if (!g_fWebSocketSupported) + if (!g_fWebSocketStaticInitialize) { return; } diff --git a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.cxx b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.cxx index ce4256a710..1796e63081 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.cxx +++ b/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.cxx @@ -26,14 +26,13 @@ WINHTTP_HELPER::StaticInitialize( { HRESULT hr = S_OK; - if (!g_fWebSocketSupported) - { - return S_OK; - } - // // Initialize the function pointers for WinHttp Websocket API's. // + if (!g_fWebSocketStaticInitialize) + { + return S_OK; + } HMODULE hWinHttp = GetModuleHandleA("winhttp.dll"); if (hWinHttp == NULL) @@ -173,4 +172,4 @@ WINHTTP_HELPER::GetBufferTypeFromFlags( } return; -} \ No newline at end of file +} diff --git a/src/AspNetCoreModuleV2/RequestHandler/precomp.hxx b/src/AspNetCoreModuleV2/RequestHandler/precomp.hxx index 64bfd09ae7..8fe43d1cdb 100644 --- a/src/AspNetCoreModuleV2/RequestHandler/precomp.hxx +++ b/src/AspNetCoreModuleV2/RequestHandler/precomp.hxx @@ -26,6 +26,7 @@ #include #include #include + // This should remove our issue of compiling for win7 without header files. // We force the Windows 8 version check logic in iiswebsocket.h to succeed even though we're compiling for Windows 7. // Then, we set the version defines back to Windows 7 to for the remainder of the compilation. @@ -44,36 +45,41 @@ #define WINVER 0x0601 #define _WIN32_WINNT 0x0601 -#include "..\IISLib\acache.h" -#include "..\IISLib\multisz.h" -#include "..\IISLib\multisza.h" -#include "..\IISLib\base64.h" -#include "..\IISLib\listentry.h" -#include "..\CommonLib\fx_ver.h" -#include "..\CommonLib\debugutil.h" -#include "..\CommonLib\requesthandler.h" -#include "..\CommonLib\aspnetcoreconfig.h" -#include "..\CommonLib\utility.h" -#include "..\CommonLib\application.h" -#include "..\CommonLib\resources.h" +// IIS Lib +#include "acache.h" +#include "multisz.h" +#include "multisza.h" +#include "base64.h" +#include "listentry.h" +#include "debugutil.h" + +// Common lib +#include "hostfxr_utility.h" +#include "requesthandler.h" +#include "utility.h" +#include "application.h" +#include "resources.h" #include "aspnetcore_event.h" #include "aspnetcore_msg.h" #include "disconnectcontext.h" -#include "environmentvariablehelpers.h" + #include "sttimer.h" +#include ".\requesthandler_config.h" #include ".\inprocess\InProcessHandler.h" #include ".\inprocess\inprocessapplication.h" +#include ".\outofprocess\websockethandler.h" #include ".\outofprocess\responseheaderhash.h" #include ".\outofprocess\protocolconfig.h" #include ".\outofprocess\forwarderconnection.h" #include ".\outofprocess\serverprocess.h" #include ".\outofprocess\processmanager.h" -#include ".\outofprocess\websockethandler.h" #include ".\outofprocess\forwardinghandler.h" #include ".\outofprocess\outprocessapplication.h" #include ".\outofprocess\winhttphelper.h" #include ".\outofprocess\outprocessapplication.h" +#include "environmentvariablehelpers.h" + #ifdef max #undef max template inline T max(T a, T b) @@ -90,7 +96,6 @@ template inline T min(T a, T b) } #endif - inline bool IsSpace(char ch) { switch (ch) @@ -109,7 +114,7 @@ inline bool IsSpace(char ch) extern BOOL g_fAsyncDisconnectAvailable; extern BOOL g_fWinHttpNonBlockingCallbackAvailable; -extern BOOL g_fWebSocketSupported; +extern BOOL g_fWebSocketStaticInitialize; extern BOOL g_fNsiApiNotSupported; extern BOOL g_fEnableReferenceCountTracing; extern BOOL g_fProcessDetach; diff --git a/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.cxx b/src/AspNetCoreModuleV2/RequestHandler/requesthandler_config.cpp similarity index 76% rename from src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.cxx rename to src/AspNetCoreModuleV2/RequestHandler/requesthandler_config.cpp index 46ec0edcfd..555e711922 100644 --- a/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.cxx +++ b/src/AspNetCoreModuleV2/RequestHandler/requesthandler_config.cpp @@ -2,10 +2,10 @@ // Licensed under the MIT License. See License.txt in the project root for license information. #include "stdafx.h" -#include "aspnetcoreconfig.h" +#include "requesthandler_config.h" #include "debugutil.h" -ASPNETCORE_CONFIG::~ASPNETCORE_CONFIG() +REQUESTHANDLER_CONFIG::~REQUESTHANDLER_CONFIG() { if (m_ppStrArguments != NULL) { @@ -21,42 +21,21 @@ ASPNETCORE_CONFIG::~ASPNETCORE_CONFIG() } } -VOID -ASPNETCORE_CONFIG::ReferenceConfiguration( - VOID -) const -{ - InterlockedIncrement(&m_cRefs); -} - -VOID -ASPNETCORE_CONFIG::DereferenceConfiguration( - VOID -) const -{ - DBG_ASSERT(m_cRefs != 0); - LONG cRefs = 0; - if ((cRefs = InterlockedDecrement(&m_cRefs)) == 0) - { - delete this; - } -} - HRESULT -ASPNETCORE_CONFIG::GetConfig( +REQUESTHANDLER_CONFIG::CreateRequestHandlerConfig( _In_ IHttpServer *pHttpServer, - _In_ HTTP_MODULE_ID pModuleId, - _In_ IHttpContext *pHttpContext, + _In_ IHttpApplication *pHttpApplication, + _In_ PCWSTR pwzExeLocation, _In_ HANDLE hEventLog, - _Out_ ASPNETCORE_CONFIG **ppAspNetCoreConfig + _Out_ REQUESTHANDLER_CONFIG **ppAspNetCoreConfig ) { HRESULT hr = S_OK; - IHttpApplication *pHttpApplication = pHttpContext->GetApplication(); - ASPNETCORE_CONFIG *pAspNetCoreConfig = NULL; + REQUESTHANDLER_CONFIG *pRequestHandlerConfig = NULL; STRU struHostFxrDllLocation; - PWSTR* pwzArgv; + BSTR* pwzArgv; DWORD dwArgCount; + STRU struExeLocation; if (ppAspNetCoreConfig == NULL) { @@ -66,105 +45,101 @@ ASPNETCORE_CONFIG::GetConfig( *ppAspNetCoreConfig = NULL; - // potential bug if user sepcific config at virtual dir level - pAspNetCoreConfig = (ASPNETCORE_CONFIG*) - pHttpApplication->GetModuleContextContainer()->GetModuleContext(pModuleId); - - if (pAspNetCoreConfig != NULL) - { - *ppAspNetCoreConfig = pAspNetCoreConfig; - pAspNetCoreConfig = NULL; - goto Finished; - } - - pAspNetCoreConfig = new ASPNETCORE_CONFIG; - if (pAspNetCoreConfig == NULL) + pRequestHandlerConfig = new REQUESTHANDLER_CONFIG; + if (pRequestHandlerConfig == NULL) { hr = E_OUTOFMEMORY; goto Finished; } - hr = pAspNetCoreConfig->Populate(pHttpServer, pHttpContext); + hr = pRequestHandlerConfig->Populate(pHttpServer, pHttpApplication); if (FAILED(hr)) { goto Finished; } // Modify config for inprocess. - if (pAspNetCoreConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_IN_PROCESS) + if (pRequestHandlerConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_IN_PROCESS) { - if (FAILED(hr = HOSTFXR_UTILITY::GetHostFxrParameters( - hEventLog, - pAspNetCoreConfig->QueryProcessPath()->QueryStr(), - pAspNetCoreConfig->QueryApplicationPhysicalPath()->QueryStr(), - pAspNetCoreConfig->QueryArguments()->QueryStr(), - &struHostFxrDllLocation, - &dwArgCount, - &pwzArgv))) + if (FAILED(struExeLocation.Copy(pwzExeLocation))) { goto Finished; } - - if (FAILED(hr = pAspNetCoreConfig->SetHostFxrFullPath(struHostFxrDllLocation.QueryStr()))) + // If the exe was not provided by the shim, reobtain the hostfxr parameters (which finds dotnet). + if (struExeLocation.IsEmpty()) { - goto Finished; + if (FAILED(hr = HOSTFXR_UTILITY::GetHostFxrParameters( + hEventLog, + pRequestHandlerConfig->QueryProcessPath()->QueryStr(), + pRequestHandlerConfig->QueryApplicationPhysicalPath()->QueryStr(), + pRequestHandlerConfig->QueryArguments()->QueryStr(), + &struHostFxrDllLocation, + &struExeLocation, + &dwArgCount, + &pwzArgv))) + { + goto Finished; + } } - - pAspNetCoreConfig->SetHostFxrArguments(dwArgCount, pwzArgv); - } - - hr = pHttpApplication->GetModuleContextContainer()-> - SetModuleContext(pAspNetCoreConfig, pModuleId); - if (FAILED(hr)) - { - if (hr == HRESULT_FROM_WIN32(ERROR_ALREADY_ASSIGNED)) + else if (HOSTFXR_UTILITY::IsDotnetExecutable(&struExeLocation)) { - delete pAspNetCoreConfig; - - pAspNetCoreConfig = (ASPNETCORE_CONFIG*)pHttpApplication-> - GetModuleContextContainer()-> - GetModuleContext(pModuleId); - - _ASSERT(pAspNetCoreConfig != NULL); - - hr = S_OK; + if (FAILED(hr = HOSTFXR_UTILITY::ParseHostfxrArguments( + pRequestHandlerConfig->QueryArguments()->QueryStr(), + pwzExeLocation, + pRequestHandlerConfig->QueryApplicationPhysicalPath()->QueryStr(), + hEventLog, + &dwArgCount, + &pwzArgv))) + { + goto Finished; + } } else { - goto Finished; - } - } - else - { - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "ASPNETCORE_CONFIG::GetConfig, set config to ModuleContext"); - // set appliction info here instead of inside Populate() - // as the destructor will delete the backend process - hr = pAspNetCoreConfig->QueryApplicationPath()->Copy(pHttpApplication->GetApplicationId()); - if (FAILED(hr)) - { - goto Finished; + if (FAILED(hr = HOSTFXR_UTILITY::GetStandaloneHostfxrParameters( + pwzExeLocation, + pRequestHandlerConfig->QueryApplicationPhysicalPath()->QueryStr(), + pRequestHandlerConfig->QueryArguments()->QueryStr(), + hEventLog, + &struHostFxrDllLocation, + &dwArgCount, + &pwzArgv))) + { + goto Finished; + } } + + pRequestHandlerConfig->SetHostFxrArguments(dwArgCount, pwzArgv); } - *ppAspNetCoreConfig = pAspNetCoreConfig; - pAspNetCoreConfig = NULL; + DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, + "REQUESTHANDLER_CONFIG::GetConfig, set config to ModuleContext"); + // set appliction info here instead of inside Populate() + // as the destructor will delete the backend process + hr = pRequestHandlerConfig->QueryApplicationPath()->Copy(pHttpApplication->GetApplicationId()); + if (FAILED(hr)) + { + goto Finished; + } + + *ppAspNetCoreConfig = pRequestHandlerConfig; + pRequestHandlerConfig = NULL; Finished: - if (pAspNetCoreConfig != NULL) + if (pRequestHandlerConfig != NULL) { - delete pAspNetCoreConfig; - pAspNetCoreConfig = NULL; + delete pRequestHandlerConfig; + pRequestHandlerConfig = NULL; } return hr; } HRESULT -ASPNETCORE_CONFIG::Populate( +REQUESTHANDLER_CONFIG::Populate( IHttpServer *pHttpServer, - IHttpContext *pHttpContext + IHttpApplication *pHttpApplication ) { STACK_STRU(strHostingModel, 300); @@ -206,13 +181,13 @@ ASPNETCORE_CONFIG::Populate( } pAdminManager = pHttpServer->GetAdminManager(); - hr = m_struConfigPath.Copy(pHttpContext->GetApplication()->GetAppConfigPath()); + hr = m_struConfigPath.Copy(pHttpApplication->GetAppConfigPath()); if (FAILED(hr)) { goto Finished; } - hr = m_struApplicationPhysicalPath.Copy(pHttpContext->GetApplication()->GetApplicationPhysicalPath()); + hr = m_struApplicationPhysicalPath.Copy(pHttpApplication->GetApplicationPhysicalPath()); if (FAILED(hr)) { goto Finished; @@ -320,20 +295,6 @@ ASPNETCORE_CONFIG::Populate( } } - // Even though the applicationhost.config file contains the websocket element, - // the websocket module may still not be enabled. Check if the - PCWSTR pszVariableValue; - DWORD cbLength; - hr = pHttpContext->GetServerVariable("WEBSOCKET_VERSION", &pszVariableValue, &cbLength); - if (FAILED(hr)) - { - m_fWebSocketEnabled = FALSE; - } - else - { - m_fWebSocketEnabled = TRUE; - } - bstrAspNetCoreSection = SysAllocString(CS_ASPNETCORE_SECTION); if (bstrAspNetCoreSection == NULL) { diff --git a/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.h b/src/AspNetCoreModuleV2/RequestHandler/requesthandler_config.h similarity index 85% rename from src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.h rename to src/AspNetCoreModuleV2/RequestHandler/requesthandler_config.h index 655dcdc385..45c9518413 100644 --- a/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.h +++ b/src/AspNetCoreModuleV2/RequestHandler/requesthandler_config.h @@ -50,27 +50,21 @@ enum APP_HOSTING_MODEL HOSTING_OUT_PROCESS }; -class ASPNETCORE_CONFIG : IHttpStoredContext +class REQUESTHANDLER_CONFIG { public: virtual - ~ASPNETCORE_CONFIG(); - - VOID - CleanupStoredContext() - { - DereferenceConfiguration(); - } + ~REQUESTHANDLER_CONFIG(); static HRESULT - GetConfig( + CreateRequestHandlerConfig( _In_ IHttpServer *pHttpServer, - _In_ HTTP_MODULE_ID pModuleId, - _In_ IHttpContext *pHttpContext, + _In_ IHttpApplication *pHttpApplication, + _In_ PCWSTR pwzExeLocation, _In_ HANDLE hEventLog, - _Out_ ASPNETCORE_CONFIG **ppAspNetCoreConfig + _Out_ REQUESTHANDLER_CONFIG **ppAspNetCoreConfig ); ENVIRONMENT_VAR_HASH* @@ -155,7 +149,7 @@ public: STRU* QueryProcessPath( - VOID + VOID ) { return &m_struProcessPath; @@ -175,12 +169,6 @@ public: return m_fStdoutLogEnabled; } - BOOL - QueryWebSocketEnabled() - { - return m_fWebSocketEnabled; - } - BOOL QueryForwardWindowsAuthToken() { @@ -242,22 +230,6 @@ public: } CONST - PCWSTR - QueryHostFxrFullPath( - VOID - ) - { - return m_struHostFxrLocation.QueryStr(); - } - - HRESULT - SetHostFxrFullPath( - PCWSTR pStrHostFxrFullPath - ) - { - return m_struHostFxrLocation.Copy(pStrHostFxrFullPath); - } - VOID SetHostFxrArguments( DWORD dwArgc, @@ -273,34 +245,24 @@ public: m_ppStrArguments = ppStrArguments; } - VOID - ReferenceConfiguration( - VOID - ) const; - - VOID - DereferenceConfiguration( - VOID - ) const; - private: // // private constructor // - ASPNETCORE_CONFIG(): - m_fStdoutLogEnabled( FALSE ), - m_pEnvironmentVariables( NULL ), - m_cRefs( 1 ), - m_hostingModel( HOSTING_UNKNOWN ), + REQUESTHANDLER_CONFIG() : + m_fStdoutLogEnabled(FALSE), + m_pEnvironmentVariables(NULL), + m_cRefs(1), + m_hostingModel(HOSTING_UNKNOWN), m_ppStrArguments(NULL) { } HRESULT Populate( - IHttpServer *pHttpServer, - IHttpContext *pHttpContext + IHttpServer *pHttpServer, + IHttpApplication *pHttpApplication ); mutable LONG m_cRefs; @@ -323,10 +285,9 @@ private: BOOL m_fWindowsAuthEnabled; BOOL m_fBasicAuthEnabled; BOOL m_fAnonymousAuthEnabled; - BOOL m_fWebSocketEnabled; APP_HOSTING_MODEL m_hostingModel; ENVIRONMENT_VAR_HASH* m_pEnvironmentVariables; STRU m_struHostFxrLocation; - PWSTR* m_ppStrArguments; + PWSTR* m_ppStrArguments; DWORD m_dwArgc; }; diff --git a/test/CommonLibTests/CommonLibTests.vcxproj b/test/CommonLibTests/CommonLibTests.vcxproj index c68f83af6d..1f8ad4b512 100644 --- a/test/CommonLibTests/CommonLibTests.vcxproj +++ b/test/CommonLibTests/CommonLibTests.vcxproj @@ -47,6 +47,9 @@ + + {ec82302f-d2f0-4727-99d1-eabc0dd9dc3b} + {55494e58-e061-4c4c-a0a8-837008e72f85} @@ -69,7 +72,7 @@ EnableFastChecks MultiThreadedDebug Level3 - $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest-1.8.0\include + $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest-1.8.0\include;..\..\src\AspNetCoreModuleV2\AspNetCore\Inc; /D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" @@ -91,7 +94,7 @@ EnableFastChecks MultiThreadedDebug Level3 - $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest-1.8.0\include + $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest-1.8.0\include;..\..\src\AspNetCoreModuleV2\AspNetCore\Inc; /D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" @@ -111,7 +114,7 @@ MultiThreaded Level3 ProgramDatabase - $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest-1.8.0\include + $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest-1.8.0\include;..\..\src\AspNetCoreModuleV2\AspNetCore\Inc; /D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" @@ -133,7 +136,7 @@ MultiThreaded Level3 ProgramDatabase - $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest-1.8.0\include + $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest-1.8.0\include;..\..\src\AspNetCoreModuleV2\AspNetCore\Inc; /D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" diff --git a/test/CommonLibTests/hostfxr_utility_tests.cpp b/test/CommonLibTests/hostfxr_utility_tests.cpp index aacb71db56..2aace524e0 100644 --- a/test/CommonLibTests/hostfxr_utility_tests.cpp +++ b/test/CommonLibTests/hostfxr_utility_tests.cpp @@ -126,6 +126,7 @@ TEST(GetHostFxrArguments, InvalidParams) DWORD retVal = 0; BSTR* bstrArray; STRU struHostFxrDllLocation; + STRU struExeLocation; HRESULT hr = HOSTFXR_UTILITY::GetHostFxrParameters( INVALID_HANDLE_VALUE, @@ -133,8 +134,9 @@ TEST(GetHostFxrArguments, InvalidParams) L"", // application physical path, ignored. L"ignored", //arguments NULL, // event log + &struExeLocation, &retVal, // arg count &bstrArray); // args array. EXPECT_EQ(E_INVALIDARG, hr); -} +} \ No newline at end of file diff --git a/test/CommonLibTests/stdafx.h b/test/CommonLibTests/stdafx.h index feb79f19fe..3ada2d330d 100644 --- a/test/CommonLibTests/stdafx.h +++ b/test/CommonLibTests/stdafx.h @@ -42,7 +42,6 @@ #include "hostfxr_utility.h" #include "environmentvariablehash.h" -#include "aspnetcoreconfig.h" #include "iapplication.h" #include "utility.h" #include "debugutil.h"