< Summary

Line coverage
0%
Covered lines: 0
Uncovered lines: 43
Coverable lines: 43
Total lines: 446
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)

https://raw.githubusercontent.com/dotnet/runtime/811a7eabb75c42db53440e8ba3f60c07511cfd1f/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}
 61

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