< Summary

Line coverage
0%
Covered lines: 0
Uncovered lines: 43
Coverable lines: 43
Total lines: 432
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 10
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
File 1: .ctor()100%110%
File 1: DisposeAndClearHandle(...)0%220%
File 1: ReleaseHandle()0%220%
File 2: ConvertToUnmanaged(...)100%110%
File 2: ConvertToManaged(...)100%110%
File 2: Free(...)100%110%
File 2: .ctor(...)0%440%
File 2: ToManaged()0%220%
File 2: FreeNative()100%110%

File(s)

D:\runner\runtime\src\libraries\Common\src\Interop\Windows\WinHttp\Interop.SafeWinHttpHandle.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4#pragma warning disable CA1852 // unit test project includes this file and derives from SafeWinHttpHandle
 5
 6using System;
 7using System.Diagnostics;
 8using System.Runtime.InteropServices;
 9
 10using Microsoft.Win32.SafeHandles;
 11
 12internal static partial class Interop
 13{
 14    internal static partial class WinHttp
 15    {
 16        internal class SafeWinHttpHandle : SafeHandleZeroOrMinusOneIsInvalid
 17        {
 18            private SafeWinHttpHandle? _parentHandle;
 19
 020            public SafeWinHttpHandle() : base(true)
 021            {
 022            }
 23
 24            public static void DisposeAndClearHandle(ref SafeWinHttpHandle? safeHandle)
 025            {
 026                if (safeHandle != null)
 027                {
 028                    safeHandle.Dispose();
 029                    safeHandle = null;
 030                }
 031            }
 32
 33            public void SetParentHandle(SafeWinHttpHandle parentHandle)
 34            {
 35                Debug.Assert(_parentHandle == null);
 36                Debug.Assert(parentHandle != null);
 37                Debug.Assert(!parentHandle.IsInvalid);
 38
 39                bool ignore = false;
 40                parentHandle.DangerousAddRef(ref ignore);
 41
 42                _parentHandle = parentHandle;
 43            }
 44
 45            // Important: WinHttp API calls should not happen while another WinHttp call for the same handle did not
 46            // return. During finalization that was not initiated by the Dispose pattern we don't expect any other WinHt
 47            // calls in progress.
 48            protected override bool ReleaseHandle()
 049            {
 050                if (_parentHandle != null)
 051                {
 052                    _parentHandle.DangerousRelease();
 053                    _parentHandle = null;
 054                }
 55
 056                return Interop.WinHttp.WinHttpCloseHandle(handle);
 057            }
 58        }
 59    }
 60}

D:\runner\runtime\src\libraries\Common\src\Interop\Windows\WinHttp\Interop.winhttp_types.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System;
 5using System.Runtime.InteropServices;
 6#if NET
 7using System.Runtime.InteropServices.Marshalling;
 8#endif
 9using System.Text;
 10
 11internal static partial class Interop
 12{
 13    internal static partial class WinHttp
 14    {
 15        public const uint ERROR_SUCCESS = 0;
 16        public const uint ERROR_FILE_NOT_FOUND = 2;
 17        public const uint ERROR_INVALID_HANDLE = 6;
 18        public const uint ERROR_INVALID_PARAMETER = 87;
 19        public const uint ERROR_INSUFFICIENT_BUFFER = 122;
 20        public const uint ERROR_NOT_FOUND = 1168;
 21        public const uint ERROR_WINHTTP_INVALID_OPTION = 12009;
 22        public const uint ERROR_WINHTTP_LOGIN_FAILURE = 12015;
 23        public const uint ERROR_WINHTTP_OPERATION_CANCELLED = 12017;
 24        public const uint ERROR_WINHTTP_INCORRECT_HANDLE_STATE = 12019;
 25        public const uint ERROR_WINHTTP_CONNECTION_ERROR = 12030;
 26        public const uint ERROR_WINHTTP_RESEND_REQUEST = 12032;
 27        public const uint ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED = 12044;
 28        public const uint ERROR_WINHTTP_HEADER_NOT_FOUND = 12150;
 29        public const uint ERROR_WINHTTP_SECURE_FAILURE = 12175;
 30        public const uint ERROR_WINHTTP_AUTODETECTION_FAILED = 12180;
 31
 32        public const uint WINHTTP_OPTION_PROXY = 38;
 33        public const uint WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0;
 34        public const uint WINHTTP_ACCESS_TYPE_NO_PROXY = 1;
 35        public const uint WINHTTP_ACCESS_TYPE_NAMED_PROXY = 3;
 36        public const uint WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY = 4;
 37
 38        public const uint WINHTTP_AUTOPROXY_AUTO_DETECT = 0x00000001;
 39        public const uint WINHTTP_AUTOPROXY_CONFIG_URL = 0x00000002;
 40        public const uint WINHTTP_AUTOPROXY_HOST_KEEPCASE = 0x00000004;
 41        public const uint WINHTTP_AUTOPROXY_HOST_LOWERCASE = 0x00000008;
 42        public const uint WINHTTP_AUTOPROXY_RUN_INPROCESS = 0x00010000;
 43        public const uint WINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY = 0x00020000;
 44        public const uint WINHTTP_AUTOPROXY_NO_DIRECTACCESS = 0x00040000;
 45        public const uint WINHTTP_AUTOPROXY_NO_CACHE_CLIENT = 0x00080000;
 46        public const uint WINHTTP_AUTOPROXY_NO_CACHE_SVC = 0x00100000;
 47        public const uint WINHTTP_AUTOPROXY_SORT_RESULTS = 0x00400000;
 48
 49        public const uint WINHTTP_AUTO_DETECT_TYPE_DHCP = 0x00000001;
 50        public const uint WINHTTP_AUTO_DETECT_TYPE_DNS_A = 0x00000002;
 51
 52        public const string WINHTTP_NO_PROXY_NAME = null;
 53        public const string WINHTTP_NO_PROXY_BYPASS = null;
 54
 55        public const uint WINHTTP_ADDREQ_FLAG_ADD = 0x20000000;
 56        public const uint WINHTTP_ADDREQ_FLAG_REPLACE = 0x80000000;
 57
 58        public const string WINHTTP_NO_REFERER = null;
 59        public const string WINHTTP_DEFAULT_ACCEPT_TYPES = null;
 60
 61        public const ushort INTERNET_DEFAULT_PORT = 0;
 62        public const ushort INTERNET_DEFAULT_HTTP_PORT = 80;
 63        public const ushort INTERNET_DEFAULT_HTTPS_PORT = 443;
 64
 65        public const uint WINHTTP_FLAG_SECURE = 0x00800000;
 66        public const uint WINHTTP_FLAG_ESCAPE_DISABLE = 0x00000040;
 67        public const uint WINHTTP_FLAG_AUTOMATIC_CHUNKING = 0x00000200;
 68
 69        public const uint WINHTTP_QUERY_FLAG_NUMBER = 0x20000000;
 70        public const uint WINHTTP_QUERY_VERSION = 18;
 71        public const uint WINHTTP_QUERY_STATUS_CODE = 19;
 72        public const uint WINHTTP_QUERY_STATUS_TEXT = 20;
 73        public const uint WINHTTP_QUERY_RAW_HEADERS = 21;
 74        public const uint WINHTTP_QUERY_RAW_HEADERS_CRLF = 22;
 75        public const uint WINHTTP_QUERY_FLAG_TRAILERS = 0x02000000;
 76        public const uint WINHTTP_QUERY_CONTENT_ENCODING = 29;
 77        public const uint WINHTTP_QUERY_SET_COOKIE = 43;
 78        public const uint WINHTTP_QUERY_CUSTOM = 65535;
 79        public const string WINHTTP_HEADER_NAME_BY_INDEX = null;
 80        public const byte[] WINHTTP_NO_OUTPUT_BUFFER = null;
 81
 82        public const uint WINHTTP_OPTION_DECOMPRESSION = 118;
 83        public const uint WINHTTP_DECOMPRESSION_FLAG_GZIP = 0x00000001;
 84        public const uint WINHTTP_DECOMPRESSION_FLAG_DEFLATE = 0x00000002;
 85        public const uint WINHTTP_DECOMPRESSION_FLAG_ALL = WINHTTP_DECOMPRESSION_FLAG_GZIP | WINHTTP_DECOMPRESSION_FLAG_
 86
 87        public const uint WINHTTP_OPTION_REDIRECT_POLICY = 88;
 88        public const uint WINHTTP_OPTION_REDIRECT_POLICY_NEVER = 0;
 89        public const uint WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP = 1;
 90        public const uint WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS = 2;
 91        public const uint WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS = 89;
 92
 93        public const uint WINHTTP_OPTION_MAX_CONNS_PER_SERVER = 73;
 94        public const uint WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER = 74;
 95
 96        public const uint WINHTTP_OPTION_DISABLE_FEATURE = 63;
 97        public const uint WINHTTP_DISABLE_COOKIES = 0x00000001;
 98        public const uint WINHTTP_DISABLE_REDIRECTS = 0x00000002;
 99        public const uint WINHTTP_DISABLE_AUTHENTICATION = 0x00000004;
 100        public const uint WINHTTP_DISABLE_KEEP_ALIVE = 0x00000008;
 101
 102        public const uint WINHTTP_OPTION_ENABLE_FEATURE = 79;
 103        public const uint WINHTTP_ENABLE_SSL_REVOCATION = 0x00000001;
 104
 105        public const uint WINHTTP_OPTION_CLIENT_CERT_CONTEXT = 47;
 106        public const uint WINHTTP_OPTION_CLIENT_CERT_ISSUER_LIST = 94;
 107        public const uint WINHTTP_OPTION_SERVER_CERT_CONTEXT = 78;
 108        public const uint WINHTTP_OPTION_SECURITY_FLAGS = 31;
 109        public const uint WINHTTP_OPTION_SECURE_PROTOCOLS = 84;
 110        public const uint WINHTTP_FLAG_SECURE_PROTOCOL_SSL2 = 0x00000008;
 111        public const uint WINHTTP_FLAG_SECURE_PROTOCOL_SSL3 = 0x00000020;
 112        public const uint WINHTTP_FLAG_SECURE_PROTOCOL_TLS1 = 0x00000080;
 113        public const uint WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 = 0x00000200;
 114        public const uint WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 = 0x00000800;
 115        public const uint WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3 = 0x00002000;
 116
 117        public const uint SECURITY_FLAG_IGNORE_UNKNOWN_CA = 0x00000100;
 118        public const uint SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000;
 119        public const uint SECURITY_FLAG_IGNORE_CERT_CN_INVALID = 0x00001000;
 120        public const uint SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE = 0x00000200;
 121
 122        public const uint WINHTTP_OPTION_AUTOLOGON_POLICY = 77;
 123        public const uint WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM = 0; // default creds only sent to intranet servers (d
 124        public const uint WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW = 1; // default creds set to all servers
 125        public const uint WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH = 2; // default creds never sent
 126
 127        public const uint WINHTTP_AUTH_SCHEME_BASIC = 0x00000001;
 128        public const uint WINHTTP_AUTH_SCHEME_NTLM = 0x00000002;
 129        public const uint WINHTTP_AUTH_SCHEME_PASSPORT = 0x00000004;
 130        public const uint WINHTTP_AUTH_SCHEME_DIGEST = 0x00000008;
 131        public const uint WINHTTP_AUTH_SCHEME_NEGOTIATE = 0x00000010;
 132
 133        public const uint WINHTTP_AUTH_TARGET_SERVER = 0x00000000;
 134        public const uint WINHTTP_AUTH_TARGET_PROXY = 0x00000001;
 135
 136        public const uint WINHTTP_OPTION_USERNAME = 0x1000;
 137        // [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Suppression approved. It is p
 138        public const uint WINHTTP_OPTION_PASSWORD = 0x1001;
 139        public const uint WINHTTP_OPTION_PROXY_USERNAME = 0x1002;
 140        // [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Suppression approved. It is p
 141        public const uint WINHTTP_OPTION_PROXY_PASSWORD = 0x1003;
 142
 143        public const uint WINHTTP_OPTION_SERVER_SPN_USED = 106;
 144        public const uint WINHTTP_OPTION_SERVER_CBT = 108;
 145
 146        public const uint WINHTTP_OPTION_CONNECT_TIMEOUT = 3;
 147        public const uint WINHTTP_OPTION_SEND_TIMEOUT = 5;
 148        public const uint WINHTTP_OPTION_RECEIVE_TIMEOUT = 6;
 149
 150        public const uint WINHTTP_OPTION_URL = 34;
 151
 152        public const uint WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE = 91;
 153        public const uint WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE = 92;
 154        public const uint WINHTTP_OPTION_CONNECTION_INFO = 93;
 155
 156        public const uint WINHTTP_OPTION_ASSURED_NON_BLOCKING_CALLBACKS = 111;
 157
 158        public const uint WINHTTP_OPTION_ENABLE_HTTP2_PLUS_CLIENT_CERT = 161;
 159        public const uint WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL = 133;
 160        public const uint WINHTTP_OPTION_HTTP_PROTOCOL_USED = 134;
 161        public const uint WINHTTP_PROTOCOL_FLAG_HTTP2 = 0x1;
 162        public const uint WINHTTP_HTTP2_PLUS_CLIENT_CERT_FLAG = 0x1;
 163        public const uint WINHTTP_OPTION_DISABLE_STREAM_QUEUE = 139;
 164
 165        public const uint WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET = 114;
 166        public const uint WINHTTP_OPTION_WEB_SOCKET_CLOSE_TIMEOUT = 115;
 167        public const uint WINHTTP_OPTION_WEB_SOCKET_KEEPALIVE_INTERVAL = 116;
 168
 169        public const uint WINHTTP_OPTION_WEB_SOCKET_RECEIVE_BUFFER_SIZE = 122;
 170        public const uint WINHTTP_OPTION_WEB_SOCKET_SEND_BUFFER_SIZE = 123;
 171
 172        public const uint WINHTTP_OPTION_TCP_KEEPALIVE = 152;
 173        public const uint WINHTTP_OPTION_STREAM_ERROR_CODE = 159;
 174        public const uint WINHTTP_OPTION_REQUIRE_STREAM_END = 160;
 175
 176        public enum WINHTTP_WEB_SOCKET_BUFFER_TYPE
 177        {
 178            WINHTTP_WEB_SOCKET_BINARY_MESSAGE_BUFFER_TYPE = 0,
 179            WINHTTP_WEB_SOCKET_BINARY_FRAGMENT_BUFFER_TYPE = 1,
 180            WINHTTP_WEB_SOCKET_UTF8_MESSAGE_BUFFER_TYPE = 2,
 181            WINHTTP_WEB_SOCKET_UTF8_FRAGMENT_BUFFER_TYPE = 3,
 182            WINHTTP_WEB_SOCKET_CLOSE_BUFFER_TYPE = 4
 183        }
 184
 185        public const uint WINHTTP_OPTION_CONTEXT_VALUE = 45;
 186
 187        public const uint WINHTTP_FLAG_ASYNC = 0x10000000;
 188
 189        public const uint WINHTTP_CALLBACK_STATUS_RESOLVING_NAME = 0x00000001;
 190        public const uint WINHTTP_CALLBACK_STATUS_NAME_RESOLVED = 0x00000002;
 191        public const uint WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER = 0x00000004;
 192        public const uint WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER = 0x00000008;
 193        public const uint WINHTTP_CALLBACK_STATUS_SENDING_REQUEST = 0x00000010;
 194        public const uint WINHTTP_CALLBACK_STATUS_REQUEST_SENT = 0x00000020;
 195        public const uint WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE = 0x00000040;
 196        public const uint WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED = 0x00000080;
 197        public const uint WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION = 0x00000100;
 198        public const uint WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED = 0x00000200;
 199        public const uint WINHTTP_CALLBACK_STATUS_HANDLE_CREATED = 0x00000400;
 200        public const uint WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING = 0x00000800;
 201        public const uint WINHTTP_CALLBACK_STATUS_DETECTING_PROXY = 0x00001000;
 202        public const uint WINHTTP_CALLBACK_STATUS_REDIRECT = 0x00004000;
 203        public const uint WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE = 0x00008000;
 204        public const uint WINHTTP_CALLBACK_STATUS_SECURE_FAILURE = 0x00010000;
 205        public const uint WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE = 0x00020000;
 206        public const uint WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE = 0x00040000;
 207        public const uint WINHTTP_CALLBACK_STATUS_READ_COMPLETE = 0x00080000;
 208        public const uint WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE = 0x00100000;
 209        public const uint WINHTTP_CALLBACK_STATUS_REQUEST_ERROR = 0x00200000;
 210        public const uint WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE = 0x00400000;
 211        public const uint WINHTTP_CALLBACK_STATUS_GETPROXYFORURL_COMPLETE = 0x01000000;
 212        public const uint WINHTTP_CALLBACK_STATUS_CLOSE_COMPLETE = 0x02000000;
 213        public const uint WINHTTP_CALLBACK_STATUS_SHUTDOWN_COMPLETE = 0x04000000;
 214
 215        public const uint WINHTTP_CALLBACK_FLAG_SEND_REQUEST =
 216            WINHTTP_CALLBACK_STATUS_SENDING_REQUEST |
 217            WINHTTP_CALLBACK_STATUS_REQUEST_SENT;
 218        public const uint WINHTTP_CALLBACK_FLAG_HANDLES =
 219            WINHTTP_CALLBACK_STATUS_HANDLE_CREATED |
 220            WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING;
 221        public const uint WINHTTP_CALLBACK_FLAG_REDIRECT = WINHTTP_CALLBACK_STATUS_REDIRECT;
 222        public const uint WINHTTP_CALLBACK_FLAG_SECURE_FAILURE = WINHTTP_CALLBACK_STATUS_SECURE_FAILURE;
 223        public const uint WINHTTP_CALLBACK_FLAG_SENDREQUEST_COMPLETE = WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE;
 224        public const uint WINHTTP_CALLBACK_FLAG_HEADERS_AVAILABLE = WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE;
 225        public const uint WINHTTP_CALLBACK_FLAG_DATA_AVAILABLE = WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE;
 226        public const uint WINHTTP_CALLBACK_FLAG_READ_COMPLETE = WINHTTP_CALLBACK_STATUS_READ_COMPLETE;
 227        public const uint WINHTTP_CALLBACK_FLAG_WRITE_COMPLETE = WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE;
 228        public const uint WINHTTP_CALLBACK_FLAG_REQUEST_ERROR = WINHTTP_CALLBACK_STATUS_REQUEST_ERROR;
 229        public const uint WINHTTP_CALLBACK_FLAG_GETPROXYFORURL_COMPLETE = WINHTTP_CALLBACK_STATUS_GETPROXYFORURL_COMPLET
 230        public const uint WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS =
 231            WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE |
 232            WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE |
 233            WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE |
 234            WINHTTP_CALLBACK_STATUS_READ_COMPLETE |
 235            WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE |
 236            WINHTTP_CALLBACK_STATUS_REQUEST_ERROR |
 237            WINHTTP_CALLBACK_STATUS_GETPROXYFORURL_COMPLETE;
 238        public const uint WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS = 0xFFFFFFFF;
 239
 240        public const uint WININET_E_CONNECTION_RESET = 0x80072EFF;
 241
 242        public const int WINHTTP_INVALID_STATUS_CALLBACK = -1;
 243        public delegate void WINHTTP_STATUS_CALLBACK(
 244            IntPtr handle,
 245            IntPtr context,
 246            uint internetStatus,
 247            IntPtr statusInformation,
 248            uint statusInformationLength);
 249
 250#if NET
 251        [NativeMarshalling(typeof(Marshaller))]
 252#endif
 253        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
 254        public struct WINHTTP_AUTOPROXY_OPTIONS
 255        {
 256            public uint Flags;
 257            public uint AutoDetectFlags;
 258            [MarshalAs(UnmanagedType.LPWStr)]
 259            public string? AutoConfigUrl;
 260            public IntPtr Reserved1;
 261            public uint Reserved2;
 262            [MarshalAs(UnmanagedType.Bool)]
 263            public bool AutoLoginIfChallenged;
 264#if NET
 265            [CustomMarshaller(typeof(WINHTTP_AUTOPROXY_OPTIONS), MarshalMode.Default, typeof(Marshaller))]
 266            public static class Marshaller
 267            {
 0268                public static Native ConvertToUnmanaged(WINHTTP_AUTOPROXY_OPTIONS managed) => new(managed);
 269
 0270                public static WINHTTP_AUTOPROXY_OPTIONS ConvertToManaged(Native native) => native.ToManaged();
 271
 0272                public static void Free(Native native) => native.FreeNative();
 273
 274                public struct Native
 275                {
 276                    private uint Flags;
 277                    private uint AutoDetectFlags;
 278                    private IntPtr AutoConfigUrl;
 279                    private IntPtr Reserved1;
 280                    private uint Reserved2;
 281                    private int AutoLoginIfChallenged;
 282
 283                    public Native(WINHTTP_AUTOPROXY_OPTIONS managed)
 0284                    {
 0285                        Flags = managed.Flags;
 0286                        AutoDetectFlags = managed.AutoDetectFlags;
 0287                        AutoConfigUrl = managed.AutoConfigUrl is not null ? Marshal.StringToCoTaskMemUni(managed.AutoCon
 0288                        Reserved1 = managed.Reserved1;
 0289                        Reserved2 = managed.Reserved2;
 0290                        AutoLoginIfChallenged = managed.AutoLoginIfChallenged ? 1 : 0;
 0291                    }
 292
 293                    public WINHTTP_AUTOPROXY_OPTIONS ToManaged()
 0294                    {
 0295                        return new WINHTTP_AUTOPROXY_OPTIONS
 0296                        {
 0297                            Flags = Flags,
 0298                            AutoDetectFlags = AutoDetectFlags,
 0299                            AutoConfigUrl = AutoConfigUrl != IntPtr.Zero ? Marshal.PtrToStringUni(AutoConfigUrl) : null,
 0300                            Reserved1 = Reserved1,
 0301                            Reserved2 = Reserved2,
 0302                            AutoLoginIfChallenged = AutoLoginIfChallenged != 0
 0303                        };
 0304                    }
 305
 306                    public void FreeNative()
 0307                    {
 0308                        Marshal.FreeCoTaskMem(AutoConfigUrl);
 0309                    }
 310                }
 311            }
 312#endif
 313        }
 314
 315        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
 316        public struct WINHTTP_CURRENT_USER_IE_PROXY_CONFIG
 317        {
 318            public int AutoDetect;
 319            public IntPtr AutoConfigUrl;
 320            public IntPtr Proxy;
 321            public IntPtr ProxyBypass;
 322        }
 323
 324        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
 325        public struct WINHTTP_PROXY_INFO
 326        {
 327            public uint AccessType;
 328            public IntPtr Proxy;
 329            public IntPtr ProxyBypass;
 330        }
 331
 332        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
 333        public struct WINHTTP_ASYNC_RESULT
 334        {
 335            public IntPtr dwResult;
 336            public uint dwError;
 337        }
 338
 339        [StructLayout(LayoutKind.Sequential)]
 340        public unsafe struct WINHTTP_CONNECTION_INFO
 341        {
 342            // This field is actually 4 bytes, but we use nuint to avoid alignment issues for x64.
 343            // If we want to read this field in the future, we need to change type and make sure
 344            // alignment is correct for necessary archs.
 345            public nuint cbSize;
 346            public fixed byte LocalAddress[128];
 347            public fixed byte RemoteAddress[128];
 348        }
 349
 350        [StructLayout(LayoutKind.Sequential)]
 351        public struct tcp_keepalive
 352        {
 353            public uint onoff;
 354            public uint keepalivetime;
 355            public uint keepaliveinterval;
 356        }
 357
 358        public const uint API_RECEIVE_RESPONSE = 1;
 359        public const uint API_QUERY_DATA_AVAILABLE = 2;
 360        public const uint API_READ_DATA = 3;
 361        public const uint API_WRITE_DATA = 4;
 362        public const uint API_SEND_REQUEST = 5;
 363
 364        public enum WINHTTP_WEB_SOCKET_OPERATION
 365        {
 366            WINHTTP_WEB_SOCKET_SEND_OPERATION = 0,
 367            WINHTTP_WEB_SOCKET_RECEIVE_OPERATION = 1,
 368            WINHTTP_WEB_SOCKET_CLOSE_OPERATION = 2,
 369            WINHTTP_WEB_SOCKET_SHUTDOWN_OPERATION = 3
 370        }
 371    }
 372}