| File: System\Net\Http\WinHttpChannelBinding.cs | Web Access |
| Project: src\runtime\src\libraries\System.Net.Http.WinHttpHandler\src\System.Net.Http.WinHttpHandler.csproj (System.Net.Http.WinHttpHandler) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Runtime.InteropServices; using System.Security.Authentication.ExtendedProtection; using System.Text; using SafeWinHttpHandle = Interop.WinHttp.SafeWinHttpHandle; namespace System.Net.Http { internal sealed class WinHttpChannelBinding : ChannelBinding { private int _size; private string? _cachedToString; internal WinHttpChannelBinding(SafeWinHttpHandle requestHandle) { uint dataSize = 0; if (!Interop.WinHttp.WinHttpQueryOption(requestHandle, Interop.WinHttp.WINHTTP_OPTION_SERVER_CBT, IntPtr.Zero, ref dataSize)) { if (Marshal.GetLastWin32Error() == Interop.WinHttp.ERROR_INSUFFICIENT_BUFFER) { IntPtr data = Marshal.AllocHGlobal((int)dataSize); if (Interop.WinHttp.WinHttpQueryOption(requestHandle, Interop.WinHttp.WINHTTP_OPTION_SERVER_CBT, data, ref dataSize)) { SetHandle(data); _size = (int)dataSize; } else { Marshal.FreeHGlobal(data); } } } } public override bool IsInvalid { get { return _size == 0; } } public override int Size { get { return _size; } } public override string? ToString() { if (_cachedToString == null && !IsInvalid) { var bytes = new byte[_size]; Marshal.Copy(this.handle, bytes, 0, _size); _cachedToString = BitConverter.ToString(bytes).Replace('-', ' '); } return _cachedToString; } protected override bool ReleaseHandle() { Marshal.FreeHGlobal(this.handle); SetHandle(IntPtr.Zero); _size = 0; return true; } } }