aspnetcore/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outofprocess/websockethandler.h

226 lines
4.0 KiB
C++

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
#pragma once
extern IHttpServer * g_pHttpServer;
class FORWARDING_HANDLER;
class WEBSOCKET_HANDLER
{
public:
WEBSOCKET_HANDLER();
static
HRESULT
StaticInitialize(
BOOL fEnableReferenceTraceLogging
);
static
VOID
StaticTerminate(
VOID
);
VOID
Terminate(
VOID
);
VOID
TerminateRequest(
VOID
)
{
Cleanup(ServerStateUnavailable);
}
HRESULT
ProcessRequest(
FORWARDING_HANDLER *pHandler,
IHttpContext * pHttpContext,
HINTERNET hRequest,
BOOL* pfHandleCreated
);
REQUEST_NOTIFICATION_STATUS
OnAsyncCompletion(
VOID
);
HRESULT
OnWinHttpSendComplete(
WINHTTP_WEB_SOCKET_STATUS * pCompletionStatus
);
HRESULT
OnWinHttpShutdownComplete(
VOID
);
HRESULT
OnWinHttpReceiveComplete(
WINHTTP_WEB_SOCKET_STATUS * pCompletionStatus
);
HRESULT
OnWinHttpIoError(
WINHTTP_WEB_SOCKET_ASYNC_RESULT *pCompletionStatus
);
private:
enum CleanupReason
{
CleanupReasonUnknown = 0,
IdleTimeout = 1,
ConnectFailed = 2,
ClientDisconnect = 3,
ServerDisconnect = 4,
ServerStateUnavailable = 5
};
virtual
~WEBSOCKET_HANDLER()
{
}
WEBSOCKET_HANDLER(const WEBSOCKET_HANDLER &);
void operator=(const WEBSOCKET_HANDLER &);
VOID
InsertRequest(
VOID
);
VOID
RemoveRequest(
VOID
);
static
VOID
WINAPI
OnReadIoCompletion(
HRESULT hrError,
VOID * pvCompletionContext,
DWORD cbIO,
BOOL fUTF8Encoded,
BOOL fFinalFragment,
BOOL fClose
);
static
VOID
WINAPI
OnWriteIoCompletion(
HRESULT hrError,
VOID * pvCompletionContext,
DWORD cbIO,
BOOL fUTF8Encoded,
BOOL fFinalFragment,
BOOL fClose
);
VOID
Cleanup(
CleanupReason reason
);
HRESULT
DoIisWebSocketReceive(
VOID
);
HRESULT
DoWinHttpWebSocketReceive(
VOID
);
HRESULT
DoIisWebSocketSend(
DWORD cbData,
WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType
);
HRESULT
DoWinHttpWebSocketSend(
DWORD cbData,
WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType
);
HRESULT
OnIisSendComplete(
HRESULT hrError,
DWORD cbIO
);
HRESULT
OnIisReceiveComplete(
HRESULT hrError,
DWORD cbIO,
BOOL fUTF8Encoded,
BOOL fFinalFragment,
BOOL fClose
);
VOID
IncrementOutstandingIo(
VOID
);
VOID
DecrementOutstandingIo(
VOID
);
VOID
IndicateCompletionToIIS(
VOID
);
private:
static const
DWORD RECEIVE_BUFFER_SIZE = 4*1024;
LIST_ENTRY _listEntry;
IHttpContext3 * _pHttpContext;
IWebSocketContext * _pWebSocketContext;
FORWARDING_HANDLER *_pHandler;
HINTERNET _hWebSocketRequest;
BYTE _WinHttpReceiveBuffer[RECEIVE_BUFFER_SIZE];
BYTE _IisReceiveBuffer[RECEIVE_BUFFER_SIZE];
CRITICAL_SECTION _RequestLock;
LONG _dwOutstandingIo;
volatile
BOOL _fCleanupInProgress;
volatile
BOOL _fIndicateCompletionToIis;
volatile
BOOL _fHandleClosed;
volatile
BOOL _fReceivedCloseMsg;
static
LIST_ENTRY sm_RequestsListHead;
static
SRWLOCK sm_RequestsListLock;
static
TRACE_LOG * sm_pTraceLog;
};