104 lines
4.9 KiB
C#
104 lines
4.9 KiB
C#
|
//------------------------------------------------------------------------------
|
|||
|
// <copyright file="UnmanagedWebSocketContext.cs" company="Microsoft">
|
|||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|||
|
// </copyright>
|
|||
|
//------------------------------------------------------------------------------
|
|||
|
|
|||
|
namespace System.Web.WebSockets {
|
|||
|
using System;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using System.Security;
|
|||
|
using System.Security.Permissions;
|
|||
|
|
|||
|
// Concrete implementation of IUnmanagedWebSocketContext, implemented by IIS8 unmanaged WebSocket module
|
|||
|
// SECURITY NOTE: All parameters are assumed to have been validated by the caller
|
|||
|
|
|||
|
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
|
|||
|
internal sealed class UnmanagedWebSocketContext : IUnmanagedWebSocketContext {
|
|||
|
|
|||
|
// the 'this' parameter for the unmanaged interface
|
|||
|
private readonly IntPtr _pWebSocketContext;
|
|||
|
|
|||
|
internal UnmanagedWebSocketContext(IntPtr pWebSocketContext) {
|
|||
|
_pWebSocketContext = pWebSocketContext;
|
|||
|
}
|
|||
|
|
|||
|
public int WriteFragment(IntPtr pData, ref int pcbSent, bool fAsync, bool fUtf8Encoded, bool fFinalFragment, IntPtr pfnCompletion, IntPtr pvCompletionContext, out bool pfCompletionExpected) {
|
|||
|
return IIS.MgdWebSocketWriteFragment(_pWebSocketContext, pData, ref pcbSent, fAsync, fUtf8Encoded, fFinalFragment, pfnCompletion, pvCompletionContext, out pfCompletionExpected);
|
|||
|
}
|
|||
|
|
|||
|
public int ReadFragment(IntPtr pData, ref int pcbData, bool fAsync, out bool pfUtf8Encoded, out bool pfFinalFragment, out bool pfConnectionClose, IntPtr pfnCompletion, IntPtr pvCompletionContext, out bool pfCompletionExpected) {
|
|||
|
return IIS.MgdWebSocketReadFragment(_pWebSocketContext, pData, ref pcbData, fAsync, out pfUtf8Encoded, out pfFinalFragment, out pfConnectionClose, pfnCompletion, pvCompletionContext, out pfCompletionExpected);
|
|||
|
}
|
|||
|
|
|||
|
public int SendConnectionClose(bool fAsync, ushort uStatusCode, string szReason, IntPtr pfnCompletion, IntPtr pvCompletionContext, out bool pfCompletionExpected) {
|
|||
|
return IIS.MgdWebSocketSendConnectionClose(_pWebSocketContext, fAsync, uStatusCode, szReason, pfnCompletion, pvCompletionContext, out pfCompletionExpected);
|
|||
|
}
|
|||
|
|
|||
|
public int GetCloseStatus(out ushort pStatusCode, out IntPtr ppszReason, out ushort pcchReason) {
|
|||
|
return IIS.MgdWebSocketGetCloseStatus(_pWebSocketContext, out pStatusCode, out ppszReason, out pcchReason);
|
|||
|
}
|
|||
|
|
|||
|
public void CloseTcpConnection() {
|
|||
|
IIS.MgdWebSocketCloseTcpConnection(_pWebSocketContext);
|
|||
|
}
|
|||
|
|
|||
|
// API documentation for each method can be found in ndp/fx/src/xsp/webengine/mgdexports.cxx.
|
|||
|
[SuppressUnmanagedCodeSecurity]
|
|||
|
private static class IIS {
|
|||
|
private const string _IIS_NATIVE_DLL = ModName.MGDENG_FULL_NAME;
|
|||
|
|
|||
|
// Write a data fragment to the provided IWebSocketContext.
|
|||
|
[DllImport(_IIS_NATIVE_DLL)]
|
|||
|
internal static extern int MgdWebSocketWriteFragment(
|
|||
|
IntPtr pContext,
|
|||
|
IntPtr pData,
|
|||
|
ref int pcbSent,
|
|||
|
bool fAsync,
|
|||
|
bool fUTF8Encoded,
|
|||
|
bool fFinalFragment,
|
|||
|
IntPtr pfnCompletion,
|
|||
|
IntPtr pvCompletionContext,
|
|||
|
out bool pfCompletionExpected);
|
|||
|
|
|||
|
// Reads a data fragment from the provided IWebSocketContext.
|
|||
|
[DllImport(_IIS_NATIVE_DLL)]
|
|||
|
internal static extern int MgdWebSocketReadFragment(
|
|||
|
IntPtr pContext,
|
|||
|
IntPtr pData,
|
|||
|
ref int pcbData,
|
|||
|
bool fAsync,
|
|||
|
out bool pfUTF8Encoded,
|
|||
|
out bool pfFinalFragment,
|
|||
|
out bool pfConnectionClose,
|
|||
|
IntPtr pfnCompletion,
|
|||
|
IntPtr pvCompletionContext,
|
|||
|
out bool pfCompletionExpected);
|
|||
|
|
|||
|
// Sends a CLOSE frame to the provided IWebSocketContext.
|
|||
|
[DllImport(_IIS_NATIVE_DLL)]
|
|||
|
internal static extern int MgdWebSocketSendConnectionClose(
|
|||
|
IntPtr pContext,
|
|||
|
bool fAsync,
|
|||
|
ushort pStatusCode,
|
|||
|
[MarshalAs(UnmanagedType.LPWStr)] string pszReason,
|
|||
|
IntPtr pfnCompletion,
|
|||
|
IntPtr pvCompletionContext,
|
|||
|
out bool pfCompletionExpected);
|
|||
|
|
|||
|
// Gets information on the CLOSE frame sent from the client to the server.
|
|||
|
[DllImport(_IIS_NATIVE_DLL)]
|
|||
|
internal static extern int MgdWebSocketGetCloseStatus(
|
|||
|
IntPtr pContext,
|
|||
|
out ushort pStatusCode,
|
|||
|
out IntPtr ppszReason,
|
|||
|
out ushort pcchReason);
|
|||
|
|
|||
|
// Closes the TCP connection used by the provided IWebSocketContext.
|
|||
|
[DllImport(_IIS_NATIVE_DLL)]
|
|||
|
internal static extern void MgdWebSocketCloseTcpConnection(
|
|||
|
IntPtr pContext);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|