Make exchange classes pure virtual (#792)

Make exchange classes pure virtual
This commit is contained in:
Pavel Krymets 2018-05-01 16:09:49 -07:00 committed by GitHub
parent e36b0982bf
commit e49b0a34ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 321 additions and 320 deletions

1
.gitignore vendored
View File

@ -48,6 +48,7 @@ x64/
*.pdb *.pdb
*.lib *.lib
*.idb *.idb
*.TMP
src/*/AspNetCore/aspnetcoremodule.h src/*/AspNetCore/aspnetcoremodule.h
src/*/AspNetCore/aspnetcore_msg.h src/*/AspNetCore/aspnetcore_msg.h

View File

@ -11,17 +11,9 @@ HRESULT
(WINAPI * PFN_ASPNETCORE_CREATE_APPLICATION)( (WINAPI * PFN_ASPNETCORE_CREATE_APPLICATION)(
_In_ IHttpServer *pServer, _In_ IHttpServer *pServer,
_In_ ASPNETCORE_CONFIG *pConfig, _In_ ASPNETCORE_CONFIG *pConfig,
_Out_ APPLICATION **pApplication _Out_ IAPPLICATION **pApplication
); );
typedef
HRESULT
(WINAPI * PFN_ASPNETCORE_CREATE_REQUEST_HANDLER)(
_In_ IHttpContext *pHttpContext,
_In_ HTTP_MODULE_ID *pModuleId,
_In_ APPLICATION *pApplication,
_Out_ REQUEST_HANDLER **pRequestHandler
);
// //
// The key used for hash-table lookups, consists of the port on which the http process is created. // The key used for hash-table lookups, consists of the port on which the http process is created.
// //
@ -71,8 +63,7 @@ public:
m_cRefs(1), m_fAppOfflineFound(FALSE), m_cRefs(1), m_fAppOfflineFound(FALSE),
m_pAppOfflineHtm(NULL), m_pFileWatcherEntry(NULL), m_pAppOfflineHtm(NULL), m_pFileWatcherEntry(NULL),
m_pConfiguration(NULL), m_pConfiguration(NULL),
m_pfnAspNetCoreCreateApplication(NULL), m_pfnAspNetCoreCreateApplication(NULL)
m_pfnAspNetCoreCreateRequestHandler(NULL)
{ {
InitializeSRWLock(&m_srwLock); InitializeSRWLock(&m_srwLock);
} }
@ -136,7 +127,7 @@ public:
// Otherwise memory leak // Otherwise memory leak
// //
VOID VOID
ExtractApplication(APPLICATION** ppApplication) ExtractApplication(IAPPLICATION** ppApplication)
{ {
AcquireSRWLockShared(&m_srwLock); AcquireSRWLockShared(&m_srwLock);
if (m_pApplication != NULL) if (m_pApplication != NULL)
@ -156,12 +147,6 @@ public:
HRESULT HRESULT
EnsureApplicationCreated(); EnsureApplicationCreated();
PFN_ASPNETCORE_CREATE_REQUEST_HANDLER
QueryCreateRequestHandler()
{
return m_pfnAspNetCoreCreateRequestHandler;
}
private: private:
HRESULT FindRequestHandlerAssembly(); HRESULT FindRequestHandlerAssembly();
HRESULT FindNativeAssemblyFromGlobalLocation(STRU* struFilename); HRESULT FindNativeAssemblyFromGlobalLocation(STRU* struFilename);
@ -175,11 +160,10 @@ private:
APP_OFFLINE_HTM *m_pAppOfflineHtm; APP_OFFLINE_HTM *m_pAppOfflineHtm;
FILE_WATCHER_ENTRY *m_pFileWatcherEntry; FILE_WATCHER_ENTRY *m_pFileWatcherEntry;
ASPNETCORE_CONFIG *m_pConfiguration; ASPNETCORE_CONFIG *m_pConfiguration;
APPLICATION *m_pApplication; IAPPLICATION *m_pApplication;
SRWLOCK m_srwLock; SRWLOCK m_srwLock;
IHttpServer *m_pServer; IHttpServer *m_pServer;
PFN_ASPNETCORE_CREATE_APPLICATION m_pfnAspNetCoreCreateApplication; PFN_ASPNETCORE_CREATE_APPLICATION m_pfnAspNetCoreCreateApplication;
PFN_ASPNETCORE_CREATE_REQUEST_HANDLER m_pfnAspNetCoreCreateRequestHandler;
}; };
class APPLICATION_INFO_HASH : class APPLICATION_INFO_HASH :

View File

@ -46,8 +46,8 @@ class ASPNET_CORE_PROXY_MODULE : public CHttpModule
private: private:
APPLICATION_INFO *m_pApplicationInfo; APPLICATION_INFO *m_pApplicationInfo;
APPLICATION *m_pApplication; IAPPLICATION *m_pApplication;
REQUEST_HANDLER *m_pHandler; IREQUEST_HANDLER *m_pHandler;
}; };
class ASPNET_CORE_PROXY_MODULE_FACTORY : public IHttpModuleFactory class ASPNET_CORE_PROXY_MODULE_FACTORY : public IHttpModuleFactory

View File

@ -15,7 +15,7 @@ APPLICATION_INFO::~APPLICATION_INFO()
{ {
// Mark the entry as invalid, // Mark the entry as invalid,
// StopMonitor will close the file handle and trigger a FCN // StopMonitor will close the file handle and trigger a FCN
// the entry will delete itself when processing this FCN // the entry will delete itself when processing this FCN
m_pFileWatcherEntry->MarkEntryInValid(); m_pFileWatcherEntry->MarkEntryInValid();
m_pFileWatcherEntry->StopMonitor(); m_pFileWatcherEntry->StopMonitor();
m_pFileWatcherEntry->DereferenceFileWatcherEntry(); m_pFileWatcherEntry->DereferenceFileWatcherEntry();
@ -161,7 +161,7 @@ APPLICATION_INFO::UpdateAppOfflineFileHandle()
STACK_STRU(strEventMsg, 256); STACK_STRU(strEventMsg, 256);
if (SUCCEEDED(strEventMsg.SafeSnwprintf( if (SUCCEEDED(strEventMsg.SafeSnwprintf(
ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_MSG, ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_MSG,
m_pApplication->QueryConfig()->QueryApplicationPath()->QueryStr()))) m_pConfiguration->QueryApplicationPath()->QueryStr())))
{ {
UTILITY::LogEvent(g_hEventLog, UTILITY::LogEvent(g_hEventLog,
EVENTLOG_INFORMATION_TYPE, EVENTLOG_INFORMATION_TYPE,
@ -181,7 +181,7 @@ APPLICATION_INFO::EnsureApplicationCreated()
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
BOOL fLocked = FALSE; BOOL fLocked = FALSE;
APPLICATION* pApplication = NULL; IAPPLICATION* pApplication = NULL;
STACK_STRU(struFileName, 300); // >MAX_PATH STACK_STRU(struFileName, 300); // >MAX_PATH
STRU struHostFxrDllLocation; STRU struHostFxrDllLocation;
@ -314,24 +314,15 @@ APPLICATION_INFO::FindRequestHandlerAssembly()
hr = HRESULT_FROM_WIN32(GetLastError()); hr = HRESULT_FROM_WIN32(GetLastError());
goto Finished; goto Finished;
} }
g_pfnAspNetCoreCreateRequestHandler = (PFN_ASPNETCORE_CREATE_REQUEST_HANDLER)
GetProcAddress(g_hAspnetCoreRH, "CreateRequestHandler");
if (g_pfnAspNetCoreCreateRequestHandler == NULL)
{
hr = HRESULT_FROM_WIN32(GetLastError());
goto Finished;
}
g_fAspnetcoreRHAssemblyLoaded = TRUE; g_fAspnetcoreRHAssemblyLoaded = TRUE;
} }
Finished: Finished:
// //
// Question: we remember the load failure so that we will not try again. // Question: we remember the load failure so that we will not try again.
// User needs to check whether the fuction pointer is NULL // User needs to check whether the fuction pointer is NULL
// //
m_pfnAspNetCoreCreateApplication = g_pfnAspNetCoreCreateApplication; m_pfnAspNetCoreCreateApplication = g_pfnAspNetCoreCreateApplication;
m_pfnAspNetCoreCreateRequestHandler = g_pfnAspNetCoreCreateRequestHandler;
if (!g_fAspnetcoreRHLoadedError && FAILED(hr)) if (!g_fAspnetcoreRHLoadedError && FAILED(hr))
{ {
g_fAspnetcoreRHLoadedError = TRUE; g_fAspnetcoreRHLoadedError = TRUE;
@ -401,11 +392,11 @@ Finished:
return hr; return hr;
} }
// //
// Tries to find aspnetcorerh.dll from the application // Tries to find aspnetcorerh.dll from the application
// Calls into hostfxr.dll to find it. // Calls into hostfxr.dll to find it.
// Will leave hostfxr.dll loaded as it will be used again to call hostfxr_main. // Will leave hostfxr.dll loaded as it will be used again to call hostfxr_main.
// //
HRESULT HRESULT
APPLICATION_INFO::FindNativeAssemblyFromHostfxr( APPLICATION_INFO::FindNativeAssemblyFromHostfxr(
STRU* struFilename STRU* struFilename
@ -440,7 +431,7 @@ APPLICATION_INFO::FindNativeAssemblyFromHostfxr(
if (pFnHostFxrSearchDirectories == NULL) if (pFnHostFxrSearchDirectories == NULL)
{ {
// Host fxr version is incorrect (need a higher version). // Host fxr version is incorrect (need a higher version).
// TODO log error // TODO log error
hr = E_FAIL; hr = E_FAIL;
goto Finished; goto Finished;
} }
@ -540,7 +531,7 @@ Finished:
VOID VOID
APPLICATION_INFO::RecycleApplication() APPLICATION_INFO::RecycleApplication()
{ {
APPLICATION* pApplication = NULL; IAPPLICATION* pApplication = NULL;
HANDLE hThread = INVALID_HANDLE_VALUE; HANDLE hThread = INVALID_HANDLE_VALUE;
BOOL fLockAcquired = FALSE; BOOL fLockAcquired = FALSE;
@ -551,7 +542,7 @@ APPLICATION_INFO::RecycleApplication()
if (m_pApplication != NULL) if (m_pApplication != NULL)
{ {
pApplication = m_pApplication; pApplication = m_pApplication;
if (pApplication->QueryConfig()->QueryHostingModel() == HOSTING_OUT_PROCESS) if (m_pConfiguration->QueryHostingModel() == HOSTING_OUT_PROCESS)
{ {
// //
// For inprocess, need to set m_pApplication to NULL first to // For inprocess, need to set m_pApplication to NULL first to
@ -588,7 +579,7 @@ APPLICATION_INFO::RecycleApplication()
g_pHttpServer->RecycleProcess(L"On Demand by AspNetCore Module for recycle application failure"); g_pHttpServer->RecycleProcess(L"On Demand by AspNetCore Module for recycle application failure");
} }
} }
else else
{ {
// Closing a thread handle does not terminate the associated thread or remove the thread object. // Closing a thread handle does not terminate the associated thread or remove the thread object.
CloseHandle(hThread); CloseHandle(hThread);
@ -606,7 +597,7 @@ VOID
APPLICATION_INFO::DoRecycleApplication( APPLICATION_INFO::DoRecycleApplication(
LPVOID lpParam) LPVOID lpParam)
{ {
APPLICATION* pApplication = static_cast<APPLICATION*>(lpParam); IAPPLICATION* pApplication = static_cast<IAPPLICATION*>(lpParam);
// No lock required // No lock required
@ -624,7 +615,7 @@ APPLICATION_INFO::DoRecycleApplication(
VOID VOID
APPLICATION_INFO::ShutDownApplication() APPLICATION_INFO::ShutDownApplication()
{ {
APPLICATION* pApplication = NULL; IAPPLICATION* pApplication = NULL;
BOOL fLockAcquired = FALSE; BOOL fLockAcquired = FALSE;
// pApplication can be NULL due to app_offline // pApplication can be NULL due to app_offline

View File

@ -21,7 +21,6 @@ DWORD g_dwDebugFlags = 0;
PCSTR g_szDebugLabel = "ASPNET_CORE_MODULE"; PCSTR g_szDebugLabel = "ASPNET_CORE_MODULE";
PCWSTR g_pwzAspnetcoreRequestHandlerName = L"aspnetcorerh.dll"; PCWSTR g_pwzAspnetcoreRequestHandlerName = L"aspnetcorerh.dll";
PFN_ASPNETCORE_CREATE_APPLICATION g_pfnAspNetCoreCreateApplication; PFN_ASPNETCORE_CREATE_APPLICATION g_pfnAspNetCoreCreateApplication;
PFN_ASPNETCORE_CREATE_REQUEST_HANDLER g_pfnAspNetCoreCreateRequestHandler;
VOID VOID
StaticCleanup() StaticCleanup()
@ -49,7 +48,7 @@ BOOL WINAPI DllMain(HMODULE hModule,
break; break;
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
// IIS can cause dll detach to occur before we receive global notifications // IIS can cause dll detach to occur before we receive global notifications
// For example, when we switch the bitness of the worker process, // For example, when we switch the bitness of the worker process,
// this is a bug in IIS. To try to avoid AVs, we will set a global flag // this is a bug in IIS. To try to avoid AVs, we will set a global flag
g_fInShutdown = TRUE; g_fInShutdown = TRUE;
StaticCleanup(); StaticCleanup();
@ -204,7 +203,7 @@ HRESULT
hr = E_OUTOFMEMORY; hr = E_OUTOFMEMORY;
goto Finished; goto Finished;
} }
hr = pApplicationManager->Initialize(); hr = pApplicationManager->Initialize();
if(FAILED(hr)) if(FAILED(hr))
{ {

View File

@ -104,7 +104,7 @@ inline bool IsSpace(char ch)
#include "..\..\CommonLib\environmentvariablehash.h" #include "..\..\CommonLib\environmentvariablehash.h"
#include "..\..\CommonLib\aspnetcoreconfig.h" #include "..\..\CommonLib\aspnetcoreconfig.h"
#include "..\..\CommonLib\hostfxr_utility.h" #include "..\..\CommonLib\hostfxr_utility.h"
#include "..\..\CommonLib\application.h" #include "..\..\CommonLib\iapplication.h"
#include "..\..\CommonLib\utility.h" #include "..\..\CommonLib\utility.h"
#include "..\..\CommonLib\debugutil.h" #include "..\..\CommonLib\debugutil.h"
#include "..\..\CommonLib\requesthandler.h" #include "..\..\CommonLib\requesthandler.h"
@ -138,7 +138,7 @@ FORCEINLINE
HRESULT HRESULT
HRESULT_FROM_GETLASTERROR() HRESULT_FROM_GETLASTERROR()
{ {
return ( GetLastError() != NO_ERROR ) return ( GetLastError() != NO_ERROR )
? HRESULT_FROM_WIN32( GetLastError() ) ? HRESULT_FROM_WIN32( GetLastError() )
: E_FAIL; : E_FAIL;
} }
@ -155,5 +155,4 @@ extern SRWLOCK g_srwLock;
extern PCWSTR g_pwzAspnetcoreRequestHandlerName; extern PCWSTR g_pwzAspnetcoreRequestHandlerName;
extern HANDLE g_hEventLog; extern HANDLE g_hEventLog;
extern PFN_ASPNETCORE_CREATE_APPLICATION g_pfnAspNetCoreCreateApplication; extern PFN_ASPNETCORE_CREATE_APPLICATION g_pfnAspNetCoreCreateApplication;
extern PFN_ASPNETCORE_CREATE_REQUEST_HANDLER g_pfnAspNetCoreCreateRequestHandler;
#pragma warning( error : 4091) #pragma warning( error : 4091)

View File

@ -81,7 +81,7 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler(
ASPNETCORE_CONFIG *pConfig = NULL; ASPNETCORE_CONFIG *pConfig = NULL;
APPLICATION_MANAGER *pApplicationManager = NULL; APPLICATION_MANAGER *pApplicationManager = NULL;
REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE; REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE;
APPLICATION* pApplication = NULL; IAPPLICATION* pApplication = NULL;
STACK_STRU(struFileName, 256); STACK_STRU(struFileName, 256);
if (g_fInShutdown) if (g_fInShutdown)
{ {
@ -162,9 +162,8 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler(
} }
// Create RequestHandler and process the request // Create RequestHandler and process the request
hr = m_pApplicationInfo->QueryCreateRequestHandler()(pHttpContext, hr = pApplication->CreateHandler(pHttpContext,
(HTTP_MODULE_ID*) &g_pModuleId, (HTTP_MODULE_ID*) &g_pModuleId,
pApplication,
&m_pHandler); &m_pHandler);
if (FAILED(hr)) if (FAILED(hr))
@ -174,7 +173,7 @@ ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler(
retVal = m_pHandler->OnExecuteRequestHandler(); retVal = m_pHandler->OnExecuteRequestHandler();
Finished: Finished:
if (FAILED(hr)) if (FAILED(hr))
{ {
retVal = RQ_NOTIFICATION_FINISH_REQUEST; retVal = RQ_NOTIFICATION_FINISH_REQUEST;

View File

@ -171,12 +171,14 @@
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="application.h" /> <ClInclude Include="application.h" />
<ClInclude Include="iapplication.h" />
<ClInclude Include="aspnetcoreconfig.h" /> <ClInclude Include="aspnetcoreconfig.h" />
<ClInclude Include="debugutil.h" /> <ClInclude Include="debugutil.h" />
<ClInclude Include="disconnectcontext.h" /> <ClInclude Include="disconnectcontext.h" />
<ClInclude Include="environmentvariablehash.h" /> <ClInclude Include="environmentvariablehash.h" />
<ClInclude Include="fx_ver.h" /> <ClInclude Include="fx_ver.h" />
<ClInclude Include="hostfxr_utility.h" /> <ClInclude Include="hostfxr_utility.h" />
<ClInclude Include="irequesthandler.h" />
<ClInclude Include="requesthandler.h" /> <ClInclude Include="requesthandler.h" />
<ClInclude Include="resources.h" /> <ClInclude Include="resources.h" />
<ClInclude Include="SRWLockWrapper.h" /> <ClInclude Include="SRWLockWrapper.h" />
@ -184,11 +186,9 @@
<ClInclude Include="utility.h" /> <ClInclude Include="utility.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="application.cpp" />
<ClCompile Include="aspnetcoreconfig.cxx" /> <ClCompile Include="aspnetcoreconfig.cxx" />
<ClCompile Include="fx_ver.cxx" /> <ClCompile Include="fx_ver.cxx" />
<ClCompile Include="hostfxr_utility.cpp" /> <ClCompile Include="hostfxr_utility.cpp" />
<ClCompile Include="requesthandler.cxx" />
<ClCompile Include="SRWLockWrapper.cpp" /> <ClCompile Include="SRWLockWrapper.cpp" />
<ClCompile Include="stdafx.cpp"> <ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>

View File

@ -1,50 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
#include "stdafx.h"
APPLICATION::APPLICATION(
_In_ IHttpServer* pHttpServer,
_In_ ASPNETCORE_CONFIG* pConfig) :
m_cRefs(1),
m_pConfig(pConfig),
m_status(APPLICATION_STATUS::UNKNOWN)
{
UNREFERENCED_PARAMETER(pHttpServer);
}
APPLICATION::~APPLICATION()
{
}
APPLICATION_STATUS
APPLICATION::QueryStatus()
{
return m_status;
}
ASPNETCORE_CONFIG*
APPLICATION::QueryConfig()
{
return m_pConfig;
}
VOID
APPLICATION::ReferenceApplication()
const
{
InterlockedIncrement(&m_cRefs);
}
VOID
APPLICATION::DereferenceApplication()
const
{
DBG_ASSERT(m_cRefs != 0);
LONG cRefs = 0;
if ((cRefs = InterlockedDecrement(&m_cRefs)) == 0)
{
delete this;
}
}

View File

@ -3,51 +3,45 @@
#pragma once #pragma once
enum APPLICATION_STATUS #include "stdafx.h"
{
UNKNOWN = 0,
STARTING,
RUNNING,
SHUTDOWN,
FAIL
};
class ASPNETCORE_CONFIG; class APPLICATION : public IAPPLICATION
class APPLICATION
{ {
public: public:
APPLICATION(
_In_ IHttpServer* pHttpServer,
_In_ ASPNETCORE_CONFIG* pConfig);
virtual
VOID
ShutDown() = 0;
virtual
VOID
Recycle() = 0;
virtual
~APPLICATION();
APPLICATION_STATUS APPLICATION_STATUS
QueryStatus(); QueryStatus() override
{
return m_status;
}
ASPNETCORE_CONFIG* APPLICATION()
QueryConfig(); : m_cRefs(1)
{
}
VOID VOID
ReferenceApplication() ReferenceApplication() override
const; {
InterlockedIncrement(&m_cRefs);
}
VOID VOID
DereferenceApplication() DereferenceApplication() override
const; {
DBG_ASSERT(m_cRefs != 0);
LONG cRefs = 0;
if ((cRefs = InterlockedDecrement(&m_cRefs)) == 0)
{
delete this;
}
}
protected: protected:
mutable LONG m_cRefs; volatile APPLICATION_STATUS m_status = APPLICATION_STATUS::UNKNOWN;
volatile APPLICATION_STATUS m_status;
ASPNETCORE_CONFIG* m_pConfig; private:
mutable LONG m_cRefs;
}; };

View File

@ -0,0 +1,47 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
#pragma once
enum APPLICATION_STATUS
{
UNKNOWN = 0,
STARTING,
RUNNING,
SHUTDOWN,
FAIL
};
class IAPPLICATION
{
public:
virtual
VOID
ShutDown() = 0;
virtual
VOID
Recycle() = 0;
virtual
~IAPPLICATION() = 0 { };
virtual
APPLICATION_STATUS
QueryStatus() = 0;
virtual
VOID
ReferenceApplication() = 0;
virtual
VOID
DereferenceApplication() = 0;
virtual
HRESULT
CreateHandler(
_In_ IHttpContext *pHttpContext,
_In_ HTTP_MODULE_ID *pModuleId,
_Out_ IREQUEST_HANDLER **pRequestHandler) = 0;
};

View File

@ -0,0 +1,48 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
#pragma once
#include "stdafx.h"
//
// Pure abstract class
//
class IREQUEST_HANDLER
{
public:
virtual
REQUEST_NOTIFICATION_STATUS
OnExecuteRequestHandler() = 0;
virtual
REQUEST_NOTIFICATION_STATUS
OnAsyncCompletion(
DWORD cbCompletion,
HRESULT hrCompletionStatus
) = 0;
virtual
VOID
TerminateRequest(
bool fClientInitiated
) = 0;
virtual
~IREQUEST_HANDLER(
VOID
) = 0 { }
virtual
VOID
ReferenceRequestHandler(
VOID
) = 0;
virtual
VOID
DereferenceRequestHandler(
VOID
) = 0;
};

View File

@ -1,44 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
#include "stdafx.h"
REQUEST_HANDLER::REQUEST_HANDLER(
_In_ IHttpContext *pW3Context,
_In_ HTTP_MODULE_ID *pModuleId,
_In_ APPLICATION *pApplication)
: m_cRefs(1)
{
m_pW3Context = pW3Context;
m_pApplication = pApplication;
m_pModuleId = *pModuleId;
}
REQUEST_HANDLER::~REQUEST_HANDLER()
{
}
VOID
REQUEST_HANDLER::ReferenceRequestHandler(
VOID
) const
{
InterlockedIncrement(&m_cRefs);
}
VOID
REQUEST_HANDLER::DereferenceRequestHandler(
VOID
) const
{
DBG_ASSERT(m_cRefs != 0);
LONG cRefs = 0;
if ((cRefs = InterlockedDecrement(&m_cRefs)) == 0)
{
delete this;
}
}

View File

@ -4,56 +4,32 @@
#pragma once #pragma once
#include "stdafx.h" #include "stdafx.h"
#include "application.h"
// //
// Abstract class // Pure abstract class
// //
class REQUEST_HANDLER class REQUEST_HANDLER: public virtual IREQUEST_HANDLER
{ {
public: public:
REQUEST_HANDLER(
_In_ IHttpContext *pW3Context,
_In_ HTTP_MODULE_ID *pModuleId,
_In_ APPLICATION *pApplication
);
virtual
REQUEST_NOTIFICATION_STATUS
OnExecuteRequestHandler() = 0;
virtual
REQUEST_NOTIFICATION_STATUS
OnAsyncCompletion(
DWORD cbCompletion,
HRESULT hrCompletionStatus
) = 0;
virtual
VOID VOID
TerminateRequest( ReferenceRequestHandler() override
bool fClientInitiated {
) = 0; InterlockedIncrement(&m_cRefs);
}
virtual
~REQUEST_HANDLER(
VOID
);
VOID VOID
ReferenceRequestHandler( DereferenceRequestHandler() override
VOID {
) const; DBG_ASSERT(m_cRefs != 0);
virtual LONG cRefs = 0;
VOID if ((cRefs = InterlockedDecrement(&m_cRefs)) == 0)
DereferenceRequestHandler( {
VOID delete this;
) const; }
}
protected: private:
mutable LONG m_cRefs; mutable LONG m_cRefs = 1;
IHttpContext* m_pW3Context; };
APPLICATION* m_pApplication;
HTTP_MODULE_ID m_pModuleId;
};

View File

@ -25,10 +25,14 @@
#include "environmentvariablehash.h" #include "environmentvariablehash.h"
#include "utility.h" #include "utility.h"
#include "aspnetcoreconfig.h" #include "aspnetcoreconfig.h"
#include "application.h"
#include "requesthandler.h"
#include "fx_ver.h" #include "fx_ver.h"
#include "hostfxr_utility.h" #include "hostfxr_utility.h"
#include "resources.h" #include "resources.h"
#include "aspnetcore_msg.h" #include "aspnetcore_msg.h"
#include "irequesthandler.h"
#include "iapplication.h"
#include "requesthandler.h"
#include "application.h"

View File

@ -2,5 +2,4 @@ LIBRARY aspnetcorerh
EXPORTS EXPORTS
CreateApplication CreateApplication
CreateRequestHandler

View File

@ -21,7 +21,7 @@ public:
VOID VOID
NotifyDisconnect() NotifyDisconnect()
{ {
REQUEST_HANDLER *pInitialValue = (REQUEST_HANDLER*) IREQUEST_HANDLER *pInitialValue = (IREQUEST_HANDLER*)
InterlockedExchangePointer((PVOID*)&m_pHandler, NULL); InterlockedExchangePointer((PVOID*)&m_pHandler, NULL);
if (pInitialValue != NULL) if (pInitialValue != NULL)
@ -33,7 +33,7 @@ public:
VOID VOID
SetHandler( SetHandler(
REQUEST_HANDLER *pHandler IREQUEST_HANDLER *pHandler
) )
{ {
// //
@ -61,7 +61,7 @@ public:
VOID VOID
) )
{ {
REQUEST_HANDLER *pInitialValue = (REQUEST_HANDLER*) IREQUEST_HANDLER *pInitialValue = (IREQUEST_HANDLER*)
InterlockedExchangePointer((PVOID*)&m_pHandler, NULL); InterlockedExchangePointer((PVOID*)&m_pHandler, NULL);
if (pInitialValue != NULL) if (pInitialValue != NULL)
@ -74,5 +74,5 @@ private:
~ASYNC_DISCONNECT_CONTEXT() ~ASYNC_DISCONNECT_CONTEXT()
{} {}
REQUEST_HANDLER * m_pHandler; IREQUEST_HANDLER * m_pHandler;
}; };

View File

@ -187,10 +187,10 @@ EnsureOutOfProcessInitializtion()
} }
// //
// Don't set non-blocking callbacks WINHTTP_OPTION_ASSURED_NON_BLOCKING_CALLBACKS, // Don't set non-blocking callbacks WINHTTP_OPTION_ASSURED_NON_BLOCKING_CALLBACKS,
// as we will call WinHttpQueryDataAvailable to get response on the same thread // as we will call WinHttpQueryDataAvailable to get response on the same thread
// that we received callback from Winhttp on completing sending/forwarding the request // that we received callback from Winhttp on completing sending/forwarding the request
// //
// //
// Setup the callback function // Setup the callback function
@ -277,11 +277,11 @@ __stdcall
CreateApplication( CreateApplication(
_In_ IHttpServer *pServer, _In_ IHttpServer *pServer,
_In_ ASPNETCORE_CONFIG *pConfig, _In_ ASPNETCORE_CONFIG *pConfig,
_Out_ APPLICATION **ppApplication _Out_ IAPPLICATION **ppApplication
) )
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
APPLICATION *pApplication = NULL; IAPPLICATION *pApplication = NULL;
// Initialze some global variables here // Initialze some global variables here
InitializeGlobalConfiguration(pServer); InitializeGlobalConfiguration(pServer);
@ -303,7 +303,8 @@ CreateApplication(
goto Finished; goto Finished;
} }
pApplication = new OUT_OF_PROCESS_APPLICATION(pServer, pConfig);
pApplication = new OUT_OF_PROCESS_APPLICATION(pConfig);
if (pApplication == NULL) if (pApplication == NULL)
{ {
hr = HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY); hr = HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY);
@ -329,41 +330,3 @@ CreateApplication(
Finished: Finished:
return hr; return hr;
} }
HRESULT
__stdcall
CreateRequestHandler(
_In_ IHttpContext *pHttpContext,
_In_ HTTP_MODULE_ID *pModuleId,
_In_ APPLICATION *pApplication,
_Out_ REQUEST_HANDLER **pRequestHandler
)
{
HRESULT hr = S_OK;
REQUEST_HANDLER* pHandler = NULL;
ASPNETCORE_CONFIG* pConfig = pApplication->QueryConfig();
DBG_ASSERT(pConfig);
if (pConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_IN_PROCESS)
{
pHandler = new IN_PROCESS_HANDLER(pHttpContext, pModuleId, pApplication);
}
else if (pConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_OUT_PROCESS)
{
pHandler = new FORWARDING_HANDLER(pHttpContext, pModuleId, pApplication);
}
else
{
return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
}
if (pHandler == NULL)
{
hr = HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY);
}
else
{
*pRequestHandler = pHandler;
}
return hr;
}

View File

@ -5,7 +5,6 @@ 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,
ASPNETCORE_CONFIG* pConfig) : ASPNETCORE_CONFIG* pConfig) :
APPLICATION(pHttpServer, pConfig),
m_pHttpServer(pHttpServer), m_pHttpServer(pHttpServer),
m_ProcessExitCode(0), m_ProcessExitCode(0),
m_hLogFileHandle(INVALID_HANDLE_VALUE), m_hLogFileHandle(INVALID_HANDLE_VALUE),
@ -17,7 +16,8 @@ IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION(
m_fInitialized(FALSE), m_fInitialized(FALSE),
m_fShutdownCalledFromNative(FALSE), m_fShutdownCalledFromNative(FALSE),
m_fShutdownCalledFromManaged(FALSE), m_fShutdownCalledFromManaged(FALSE),
m_srwLock() m_srwLock(),
m_pConfig(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?
// If so, I don't think there is much to do here. // If so, I don't think there is much to do here.
@ -985,3 +985,28 @@ IN_PROCESS_APPLICATION::FilterException(unsigned int, struct _EXCEPTION_POINTERS
// TODO, log error based on exception code. // TODO, log error based on exception code.
return EXCEPTION_EXECUTE_HANDLER; return EXCEPTION_EXECUTE_HANDLER;
} }
ASPNETCORE_CONFIG*
IN_PROCESS_APPLICATION::QueryConfig() const
{
return m_pConfig;
}
HRESULT
IN_PROCESS_APPLICATION::CreateHandler(
_In_ IHttpContext *pHttpContext,
_In_ HTTP_MODULE_ID *pModuleId,
_Out_ IREQUEST_HANDLER **pRequestHandler)
{
HRESULT hr = S_OK;
IREQUEST_HANDLER* pHandler = NULL;
pHandler = new IN_PROCESS_HANDLER(pHttpContext, pModuleId, this);
if (pHandler == NULL)
{
hr = HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY);
}
*pRequestHandler = pHandler;
return hr;
}

View File

@ -33,6 +33,14 @@ public:
VOID VOID
); );
__override
HRESULT
CreateHandler(
_In_ IHttpContext *pHttpContext,
_In_ HTTP_MODULE_ID *pModuleId,
_Out_ IREQUEST_HANDLER **pRequestHandler)
override;
// Executes the .NET Core process // Executes the .NET Core process
HRESULT HRESULT
ExecuteApplication( ExecuteApplication(
@ -98,6 +106,9 @@ public:
return s_Application; return s_Application;
} }
ASPNETCORE_CONFIG*
QueryConfig() const;
private: private:
static static
DWORD DWORD
@ -155,6 +166,8 @@ private:
DWORD m_dwStdErrReadTotal; DWORD m_dwStdErrReadTotal;
static IN_PROCESS_APPLICATION* s_Application; static IN_PROCESS_APPLICATION* s_Application;
ASPNETCORE_CONFIG* m_pConfig;
VOID VOID
SetStdOut( SetStdOut(
VOID VOID

View File

@ -3,8 +3,10 @@
IN_PROCESS_HANDLER::IN_PROCESS_HANDLER( IN_PROCESS_HANDLER::IN_PROCESS_HANDLER(
_In_ IHttpContext *pW3Context, _In_ IHttpContext *pW3Context,
_In_ HTTP_MODULE_ID *pModuleId, _In_ HTTP_MODULE_ID *pModuleId,
_In_ APPLICATION *pApplication _In_ IN_PROCESS_APPLICATION *pApplication
): REQUEST_HANDLER(pW3Context, pModuleId, pApplication) ): m_pW3Context(pW3Context),
m_pApplication(pApplication),
m_pModuleId(*pModuleId)
{ {
m_fManagedRequestComplete = FALSE; m_fManagedRequestComplete = FALSE;
} }
@ -20,7 +22,7 @@ IN_PROCESS_HANDLER::OnExecuteRequestHandler()
{ {
// First get the in process Application // First get the in process Application
HRESULT hr; HRESULT hr;
hr = ((IN_PROCESS_APPLICATION*)m_pApplication)->LoadManagedApplication(); hr = m_pApplication->LoadManagedApplication();
if (FAILED(hr)) if (FAILED(hr))
{ {
// TODO remove com_error? // TODO remove com_error?
@ -39,7 +41,7 @@ IN_PROCESS_HANDLER::OnExecuteRequestHandler()
} }
// FREB log // FREB log
if (ANCMEvents::ANCM_START_APPLICATION_SUCCESS::IsEnabled(m_pW3Context->GetTraceContext())) if (ANCMEvents::ANCM_START_APPLICATION_SUCCESS::IsEnabled(m_pW3Context->GetTraceContext()))
{ {
ANCMEvents::ANCM_START_APPLICATION_SUCCESS::RaiseEvent( ANCMEvents::ANCM_START_APPLICATION_SUCCESS::RaiseEvent(
@ -49,7 +51,7 @@ IN_PROCESS_HANDLER::OnExecuteRequestHandler()
} }
//SetHttpSysDisconnectCallback(); //SetHttpSysDisconnectCallback();
return ((IN_PROCESS_APPLICATION*)m_pApplication)->OnExecuteRequest(m_pW3Context, this); return m_pApplication->OnExecuteRequest(m_pW3Context, this);
} }
__override __override
@ -59,15 +61,9 @@ IN_PROCESS_HANDLER::OnAsyncCompletion(
HRESULT hrCompletionStatus HRESULT hrCompletionStatus
) )
{ {
IN_PROCESS_APPLICATION* application = (IN_PROCESS_APPLICATION*)m_pApplication;
if (application == NULL)
{
return RQ_NOTIFICATION_FINISH_REQUEST;
}
// OnAsyncCompletion must call into the application if there was a error. We will redo calls // OnAsyncCompletion must call into the application if there was a error. We will redo calls
// to Read/Write if we called cancelIo on the IHttpContext. // to Read/Write if we called cancelIo on the IHttpContext.
return application->OnAsyncCompletion(cbCompletion, hrCompletionStatus, this); return m_pApplication->OnAsyncCompletion(cbCompletion, hrCompletionStatus, this);
} }
VOID VOID

View File

@ -1,5 +1,7 @@
#pragma once #pragma once
class IN_PROCESS_APPLICATION;
class IN_PROCESS_HANDLER : public REQUEST_HANDLER class IN_PROCESS_HANDLER : public REQUEST_HANDLER
{ {
public: public:
@ -7,27 +9,26 @@ public:
_In_ IHttpContext *pW3Context, _In_ IHttpContext *pW3Context,
_In_ HTTP_MODULE_ID *pModuleId, _In_ HTTP_MODULE_ID *pModuleId,
_In_ APPLICATION *pApplication); _In_ IN_PROCESS_APPLICATION *pApplication);
~IN_PROCESS_HANDLER(); ~IN_PROCESS_HANDLER() override;
__override __override
REQUEST_NOTIFICATION_STATUS REQUEST_NOTIFICATION_STATUS
OnExecuteRequestHandler(); OnExecuteRequestHandler() override;
__override __override
REQUEST_NOTIFICATION_STATUS REQUEST_NOTIFICATION_STATUS
OnAsyncCompletion( OnAsyncCompletion(
DWORD cbCompletion, DWORD cbCompletion,
HRESULT hrCompletionStatus HRESULT hrCompletionStatus
); ) override;
__override __override
VOID VOID
TerminateRequest( TerminateRequest(
bool fClientInitiated bool fClientInitiated
) override;
);
PVOID PVOID
QueryManagedHttpContext( QueryManagedHttpContext(
@ -69,4 +70,8 @@ private:
IHttpContext* m_pHttpContext; IHttpContext* m_pHttpContext;
BOOL m_fManagedRequestComplete; BOOL m_fManagedRequestComplete;
REQUEST_NOTIFICATION_STATUS m_requestNotificationStatus; REQUEST_NOTIFICATION_STATUS m_requestNotificationStatus;
};
IHttpContext* m_pW3Context;
IN_PROCESS_APPLICATION* m_pApplication;
HTTP_MODULE_ID m_pModuleId;
};

View File

@ -18,10 +18,10 @@ PROTOCOL_CONFIG FORWARDING_HANDLER::sm_ProtocolConfig;
RESPONSE_HEADER_HASH * FORWARDING_HANDLER::sm_pResponseHeaderHash = NULL; RESPONSE_HEADER_HASH * FORWARDING_HANDLER::sm_pResponseHeaderHash = NULL;
FORWARDING_HANDLER::FORWARDING_HANDLER( FORWARDING_HANDLER::FORWARDING_HANDLER(
_In_ IHttpContext *pW3Context, _In_ IHttpContext *pW3Context,
_In_ HTTP_MODULE_ID *pModuleId, _In_ HTTP_MODULE_ID *pModuleId,
_In_ APPLICATION *pApplication _In_ OUT_OF_PROCESS_APPLICATION *pApplication
) : REQUEST_HANDLER(pW3Context, pModuleId, pApplication), ) : IREQUEST_HANDLER(),
m_Signature(FORWARDING_HANDLER_SIGNATURE), m_Signature(FORWARDING_HANDLER_SIGNATURE),
m_RequestStatus(FORWARDER_START), m_RequestStatus(FORWARDER_START),
m_fClientDisconnected(FALSE), m_fClientDisconnected(FALSE),
@ -39,7 +39,11 @@ FORWARDING_HANDLER::FORWARDING_HANDLER(
m_fDoneAsyncCompletion(FALSE), m_fDoneAsyncCompletion(FALSE),
m_fHttpHandleInClose(FALSE), m_fHttpHandleInClose(FALSE),
m_fWebSocketHandleInClose(FALSE), m_fWebSocketHandleInClose(FALSE),
m_fServerResetConn(FALSE) m_fServerResetConn(FALSE),
m_cRefs(1),
m_pW3Context(pW3Context),
m_pApplication(pApplication),
m_pModuleId(*pModuleId)
{ {
#ifdef DEBUG #ifdef DEBUG
DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO,
@ -67,9 +71,9 @@ FORWARDING_HANDLER::~FORWARDING_HANDLER(
// //
// Disconnect notification cleanup would happen first, before // Disconnect notification cleanup would happen first, before
// the FORWARDING_HANDLER instance got removed from m_pSharedhandler list. // the FORWARDING_HANDLER instance got removed from m_pSharedhandler list.
// The m_pServer cleanup would happen afterwards, since there may be a // The m_pServer cleanup would happen afterwards, since there may be a
// call pending from SHARED_HANDLER to FORWARDING_HANDLER::SetStatusAndHeaders() // call pending from SHARED_HANDLER to FORWARDING_HANDLER::SetStatusAndHeaders()
// //
DBG_ASSERT(m_pDisconnect == NULL); DBG_ASSERT(m_pDisconnect == NULL);
RemoveRequest(); RemoveRequest();
@ -472,7 +476,7 @@ REQUEST_NOTIFICATION_STATUS
if (FAILED(hr)) if (FAILED(hr))
{ {
// This failure could happen when client disconnect happens or backend server fails // This failure could happen when client disconnect happens or backend server fails
// after websocket upgrade // after websocket upgrade
goto Failure; goto Failure;
} }
@ -827,8 +831,8 @@ FORWARDING_HANDLER::GetHeaders(
PCSTR pszFinalHeader; PCSTR pszFinalHeader;
USHORT cchCurrentHeader; USHORT cchCurrentHeader;
DWORD cchFinalHeader; DWORD cchFinalHeader;
BOOL fSecure = FALSE; // dummy. Used in SplitUrl. Value will not be used BOOL fSecure = FALSE; // dummy. Used in SplitUrl. Value will not be used
// as ANCM always use http protocol to communicate with backend // as ANCM always use http protocol to communicate with backend
STRU struDestination; STRU struDestination;
STRU struUrl; STRU struUrl;
STACK_STRA(strTemp, 64); STACK_STRA(strTemp, 64);
@ -858,7 +862,7 @@ FORWARDING_HANDLER::GetHeaders(
} }
// //
// Strip all headers starting with MS-ASPNETCORE. // Strip all headers starting with MS-ASPNETCORE.
// These headers are generated by the asp.net core module and // These headers are generated by the asp.net core module and
// passed to the process it creates. // passed to the process it creates.
// //
@ -1143,7 +1147,7 @@ FORWARDING_HANDLER::CreateWinHttpRequest(
{ {
dwTimeout = pProtocol->QueryTimeout(); dwTimeout = pProtocol->QueryTimeout();
} }
if (!WinHttpSetTimeouts(m_hRequest, if (!WinHttpSetTimeouts(m_hRequest,
dwTimeout, //resolve timeout dwTimeout, //resolve timeout
dwTimeout, // connect timeout dwTimeout, // connect timeout
@ -2007,7 +2011,7 @@ FORWARDING_HANDLER::OnWinHttpCompletionStatusReadComplete(
// //
hr = pResponse->Flush(TRUE, // fAsync hr = pResponse->Flush(TRUE, // fAsync
TRUE, // fMoreData TRUE, // fMoreData
NULL); // pcbSent NULL); // pcbSent
if (FAILED(hr)) if (FAILED(hr))
{ {
goto Finished; goto Finished;

View File

@ -4,6 +4,7 @@ extern DWORD g_OptionalWinHttpFlags;
extern HINSTANCE g_hWinHttpModule; extern HINSTANCE g_hWinHttpModule;
extern HINSTANCE g_hAspNetCoreModule; extern HINSTANCE g_hAspNetCoreModule;
class OUT_OF_PROCESS_APPLICATION;
enum FORWARDING_REQUEST_STATUS enum FORWARDING_REQUEST_STATUS
{ {
@ -23,7 +24,7 @@ public:
_In_ IHttpContext *pW3Context, _In_ IHttpContext *pW3Context,
_In_ HTTP_MODULE_ID *pModuleId, _In_ HTTP_MODULE_ID *pModuleId,
_In_ APPLICATION *pApplication); _In_ OUT_OF_PROCESS_APPLICATION *pApplication);
~FORWARDING_HANDLER(); ~FORWARDING_HANDLER();
@ -193,7 +194,7 @@ private:
volatile BOOL m_fDoneAsyncCompletion; volatile BOOL m_fDoneAsyncCompletion;
volatile BOOL m_fHasError; volatile BOOL m_fHasError;
// //
// WinHttp may hit AV under race if handle got closed more than once simultaneously // WinHttp may hit AV under race if handle got closed more than once simultaneously
// Use two bool variables to guard // Use two bool variables to guard
// //
volatile BOOL m_fHttpHandleInClose; volatile BOOL m_fHttpHandleInClose;
@ -230,4 +231,9 @@ private:
static TRACE_LOG * sm_pTraceLog; static TRACE_LOG * sm_pTraceLog;
static STRA sm_pStra502ErrorMsg; static STRA sm_pStra502ErrorMsg;
mutable LONG m_cRefs;
IHttpContext* m_pW3Context;
OUT_OF_PROCESS_APPLICATION* m_pApplication;
HTTP_MODULE_ID m_pModuleId;
}; };

View File

@ -1,9 +1,8 @@
#include "..\precomp.hxx" #include "..\precomp.hxx"
OUT_OF_PROCESS_APPLICATION::OUT_OF_PROCESS_APPLICATION( OUT_OF_PROCESS_APPLICATION::OUT_OF_PROCESS_APPLICATION(
IHttpServer* pHttpServer,
ASPNETCORE_CONFIG* pConfig) : ASPNETCORE_CONFIG* pConfig) :
APPLICATION(pHttpServer, pConfig) m_pConfig(pConfig)
{ {
m_status = APPLICATION_STATUS::RUNNING; m_status = APPLICATION_STATUS::RUNNING;
m_pProcessManager = NULL; m_pProcessManager = NULL;
@ -53,6 +52,12 @@ OUT_OF_PROCESS_APPLICATION::GetProcess(
return m_pProcessManager->GetProcess(m_pConfig, ppServerProcess); return m_pProcessManager->GetProcess(m_pConfig, ppServerProcess);
} }
ASPNETCORE_CONFIG*
OUT_OF_PROCESS_APPLICATION::QueryConfig() const
{
return m_pConfig;
}
__override __override
VOID VOID
OUT_OF_PROCESS_APPLICATION::ShutDown() OUT_OF_PROCESS_APPLICATION::ShutDown()
@ -76,3 +81,21 @@ OUT_OF_PROCESS_APPLICATION::Recycle()
ShutDown(); ShutDown();
} }
HRESULT
OUT_OF_PROCESS_APPLICATION::CreateHandler(
_In_ IHttpContext *pHttpContext,
_In_ HTTP_MODULE_ID *pModuleId,
_Out_ IREQUEST_HANDLER **pRequestHandler)
{
HRESULT hr = S_OK;
IREQUEST_HANDLER* pHandler = NULL;
pHandler = new FORWARDING_HANDLER(pHttpContext, pModuleId, this);
if (pHandler == NULL)
{
hr = HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY);
}
*pRequestHandler = pHandler;
return hr;
}

View File

@ -4,9 +4,10 @@ class OUT_OF_PROCESS_APPLICATION : public APPLICATION
{ {
public: public:
OUT_OF_PROCESS_APPLICATION(IHttpServer* pHttpServer, ASPNETCORE_CONFIG *pConfig); OUT_OF_PROCESS_APPLICATION(ASPNETCORE_CONFIG *pConfig);
~OUT_OF_PROCESS_APPLICATION(); __override
~OUT_OF_PROCESS_APPLICATION() override;
HRESULT HRESULT
Initialize(); Initialize();
@ -18,13 +19,30 @@ public:
__override __override
VOID VOID
ShutDown(); ShutDown()
override;
__override __override
VOID VOID
Recycle(); Recycle()
override;
__override
HRESULT
CreateHandler(
_In_ IHttpContext *pHttpContext,
_In_ HTTP_MODULE_ID *pModuleId,
_Out_ IREQUEST_HANDLER **pRequestHandler)
override;
ASPNETCORE_CONFIG*
QueryConfig()
const;
private: private:
PROCESS_MANAGER * m_pProcessManager; PROCESS_MANAGER * m_pProcessManager;
SRWLOCK rwlock; SRWLOCK rwlock;
ASPNETCORE_CONFIG* m_pConfig;
}; };

View File

@ -72,6 +72,7 @@
#include ".\outofprocess\forwardinghandler.h" #include ".\outofprocess\forwardinghandler.h"
#include ".\outofprocess\outprocessapplication.h" #include ".\outofprocess\outprocessapplication.h"
#include ".\outofprocess\winhttphelper.h" #include ".\outofprocess\winhttphelper.h"
#include ".\outofprocess\outprocessapplication.h"
#ifdef max #ifdef max
#undef max #undef max

View File

@ -43,7 +43,7 @@
#include "hostfxr_utility.h" #include "hostfxr_utility.h"
#include "environmentvariablehash.h" #include "environmentvariablehash.h"
#include "aspnetcoreconfig.h" #include "aspnetcoreconfig.h"
#include "application.h" #include "iapplication.h"
#include "utility.h" #include "utility.h"
#include "debugutil.h" #include "debugutil.h"
#include "requesthandler.h" #include "requesthandler.h"