outprocessapplication.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright (c) .NET Foundation. All rights reserved.
  2. // Licensed under the MIT License. See License.txt in the project root for license information.
  3. #include "outprocessapplication.h"
  4. #include "SRWExclusiveLock.h"
  5. #include "exceptions.h"
  6. OUT_OF_PROCESS_APPLICATION::OUT_OF_PROCESS_APPLICATION(
  7. IHttpApplication& pApplication,
  8. std::unique_ptr<REQUESTHANDLER_CONFIG> pConfig) :
  9. AppOfflineTrackingApplication(pApplication),
  10. m_fWebSocketSupported(WEBSOCKET_STATUS::WEBSOCKET_UNKNOWN),
  11. m_pConfig(std::move(pConfig))
  12. {
  13. m_pProcessManager = nullptr;
  14. }
  15. OUT_OF_PROCESS_APPLICATION::~OUT_OF_PROCESS_APPLICATION()
  16. {
  17. SRWExclusiveLock lock(m_stopLock);
  18. if (m_pProcessManager != nullptr)
  19. {
  20. m_pProcessManager->Shutdown();
  21. m_pProcessManager->DereferenceProcessManager();
  22. m_pProcessManager = nullptr;
  23. }
  24. }
  25. HRESULT
  26. OUT_OF_PROCESS_APPLICATION::Initialize(
  27. )
  28. {
  29. if (m_pProcessManager == nullptr)
  30. {
  31. m_pProcessManager = new PROCESS_MANAGER();
  32. RETURN_IF_FAILED(m_pProcessManager->Initialize());
  33. }
  34. return S_OK;
  35. }
  36. HRESULT
  37. OUT_OF_PROCESS_APPLICATION::GetProcess(
  38. _Out_ SERVER_PROCESS **ppServerProcess
  39. )
  40. {
  41. return m_pProcessManager->GetProcess(m_pConfig.get(), QueryWebsocketStatus(), ppServerProcess);
  42. }
  43. __override
  44. VOID
  45. OUT_OF_PROCESS_APPLICATION::StopInternal(bool fServerInitiated)
  46. {
  47. AppOfflineTrackingApplication::StopInternal(fServerInitiated);
  48. if (m_pProcessManager != nullptr)
  49. {
  50. m_pProcessManager->Shutdown();
  51. }
  52. }
  53. HRESULT
  54. OUT_OF_PROCESS_APPLICATION::CreateHandler(
  55. _In_ IHttpContext *pHttpContext,
  56. _Out_ IREQUEST_HANDLER **pRequestHandler)
  57. {
  58. IREQUEST_HANDLER* pHandler = nullptr;
  59. //add websocket check here
  60. if (m_fWebSocketSupported == WEBSOCKET_STATUS::WEBSOCKET_UNKNOWN)
  61. {
  62. SetWebsocketStatus(pHttpContext);
  63. }
  64. pHandler = new FORWARDING_HANDLER(pHttpContext, ::ReferenceApplication(this));
  65. *pRequestHandler = pHandler;
  66. return S_OK;
  67. }
  68. VOID
  69. OUT_OF_PROCESS_APPLICATION::SetWebsocketStatus(
  70. IHttpContext* pHttpContext
  71. )
  72. {
  73. // Even though the applicationhost.config file contains the websocket element,
  74. // the websocket module may still not be enabled.
  75. PCWSTR pszTempWebsocketValue;
  76. DWORD cbLength;
  77. HRESULT hr = pHttpContext->GetServerVariable("WEBSOCKET_VERSION", &pszTempWebsocketValue, &cbLength);
  78. if (SUCCEEDED(hr))
  79. {
  80. m_fWebSocketSupported = WEBSOCKET_STATUS::WEBSOCKET_SUPPORTED;
  81. }
  82. else
  83. {
  84. m_fWebSocketSupported = WEBSOCKET_STATUS::WEBSOCKET_NOT_SUPPORTED;
  85. if (hr != HRESULT_FROM_WIN32(ERROR_INVALID_INDEX))
  86. {
  87. LOG_IF_FAILED(hr);
  88. }
  89. }
  90. }
  91. BOOL
  92. OUT_OF_PROCESS_APPLICATION::QueryWebsocketStatus() const
  93. {
  94. return m_fWebSocketSupported == WEBSOCKET_STATUS::WEBSOCKET_SUPPORTED;
  95. }