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 // See the LICENSE file in the project root for more information.
4 
5 using System;
6 using System.Runtime.InteropServices;
7 using System.Text;
8 
9 internal partial class Interop
10 {
11     internal partial class WinHttp
12     {
13         public const uint ERROR_SUCCESS = 0;
14         public const uint ERROR_FILE_NOT_FOUND = 2;
15         public const uint ERROR_INVALID_HANDLE = 6;
16         public const uint ERROR_INVALID_PARAMETER = 87;
17         public const uint ERROR_INSUFFICIENT_BUFFER = 122;
18         public const uint ERROR_NOT_FOUND = 1168;
19         public const uint ERROR_WINHTTP_INVALID_OPTION = 12009;
20         public const uint ERROR_WINHTTP_LOGIN_FAILURE = 12015;
21         public const uint ERROR_WINHTTP_OPERATION_CANCELLED = 12017;
22         public const uint ERROR_WINHTTP_INCORRECT_HANDLE_STATE = 12019;
23         public const uint ERROR_WINHTTP_CONNECTION_ERROR = 12030;
24         public const uint ERROR_WINHTTP_RESEND_REQUEST = 12032;
25         public const uint ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED = 12044;
26         public const uint ERROR_WINHTTP_HEADER_NOT_FOUND = 12150;
27         public const uint ERROR_WINHTTP_SECURE_FAILURE = 12175;
28         public const uint ERROR_WINHTTP_AUTODETECTION_FAILED = 12180;
29 
30         public const uint WINHTTP_OPTION_PROXY = 38;
31         public const uint WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0;
32         public const uint WINHTTP_ACCESS_TYPE_NO_PROXY = 1;
33         public const uint WINHTTP_ACCESS_TYPE_NAMED_PROXY = 3;
34         public const uint WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY = 4;
35 
36         public const uint WINHTTP_AUTOPROXY_AUTO_DETECT = 0x00000001;
37         public const uint WINHTTP_AUTOPROXY_CONFIG_URL = 0x00000002;
38         public const uint WINHTTP_AUTOPROXY_HOST_KEEPCASE = 0x00000004;
39         public const uint WINHTTP_AUTOPROXY_HOST_LOWERCASE = 0x00000008;
40         public const uint WINHTTP_AUTOPROXY_RUN_INPROCESS = 0x00010000;
41         public const uint WINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY = 0x00020000;
42         public const uint WINHTTP_AUTOPROXY_NO_DIRECTACCESS = 0x00040000;
43         public const uint WINHTTP_AUTOPROXY_NO_CACHE_CLIENT = 0x00080000;
44         public const uint WINHTTP_AUTOPROXY_NO_CACHE_SVC = 0x00100000;
45         public const uint WINHTTP_AUTOPROXY_SORT_RESULTS = 0x00400000;
46 
47         public const uint WINHTTP_AUTO_DETECT_TYPE_DHCP = 0x00000001;
48         public const uint WINHTTP_AUTO_DETECT_TYPE_DNS_A = 0x00000002;
49 
50         public const string WINHTTP_NO_PROXY_NAME = null;
51         public const string WINHTTP_NO_PROXY_BYPASS = null;
52 
53         public const uint WINHTTP_ADDREQ_FLAG_ADD = 0x20000000;
54         public const uint WINHTTP_ADDREQ_FLAG_REPLACE = 0x80000000;
55 
56         public const string WINHTTP_NO_REFERER = null;
57         public const string WINHTTP_DEFAULT_ACCEPT_TYPES = null;
58 
59         public const ushort INTERNET_DEFAULT_PORT = 0;
60         public const ushort INTERNET_DEFAULT_HTTP_PORT = 80;
61         public const ushort INTERNET_DEFAULT_HTTPS_PORT = 443;
62 
63         public const uint WINHTTP_FLAG_SECURE = 0x00800000;
64         public const uint WINHTTP_FLAG_ESCAPE_DISABLE = 0x00000040;
65 
66         public const StringBuilder WINHTTP_NO_ADDITIONAL_HEADERS = null;
67 
68         public const uint WINHTTP_QUERY_FLAG_NUMBER = 0x20000000;
69         public const uint WINHTTP_QUERY_VERSION = 18;
70         public const uint WINHTTP_QUERY_STATUS_CODE = 19;
71         public const uint WINHTTP_QUERY_STATUS_TEXT = 20;
72         public const uint WINHTTP_QUERY_RAW_HEADERS = 21;
73         public const uint WINHTTP_QUERY_RAW_HEADERS_CRLF = 22;
74         public const uint WINHTTP_QUERY_CONTENT_ENCODING = 29;
75         public const uint WINHTTP_QUERY_SET_COOKIE = 43;
76         public const uint WINHTTP_QUERY_CUSTOM = 65535;
77         public const string WINHTTP_HEADER_NAME_BY_INDEX = null;
78         public const byte[] WINHTTP_NO_OUTPUT_BUFFER = null;
79 
80         public const uint WINHTTP_OPTION_DECOMPRESSION = 118;
81         public const uint WINHTTP_DECOMPRESSION_FLAG_GZIP = 0x00000001;
82         public const uint WINHTTP_DECOMPRESSION_FLAG_DEFLATE = 0x00000002;
83         public const uint WINHTTP_DECOMPRESSION_FLAG_ALL = WINHTTP_DECOMPRESSION_FLAG_GZIP | WINHTTP_DECOMPRESSION_FLAG_DEFLATE;
84 
85         public const uint WINHTTP_OPTION_REDIRECT_POLICY = 88;
86         public const uint WINHTTP_OPTION_REDIRECT_POLICY_NEVER = 0;
87         public const uint WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP = 1;
88         public const uint WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS = 2;
89         public const uint WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS = 89;
90 
91         public const uint WINHTTP_OPTION_MAX_CONNS_PER_SERVER = 73;
92         public const uint WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER = 74;
93 
94         public const uint WINHTTP_OPTION_DISABLE_FEATURE = 63;
95         public const uint WINHTTP_DISABLE_COOKIES = 0x00000001;
96         public const uint WINHTTP_DISABLE_REDIRECTS = 0x00000002;
97         public const uint WINHTTP_DISABLE_AUTHENTICATION = 0x00000004;
98         public const uint WINHTTP_DISABLE_KEEP_ALIVE = 0x00000008;
99 
100         public const uint WINHTTP_OPTION_ENABLE_FEATURE = 79;
101         public const uint WINHTTP_ENABLE_SSL_REVOCATION = 0x00000001;
102 
103         public const uint WINHTTP_OPTION_CLIENT_CERT_CONTEXT = 47;
104         public const uint WINHTTP_OPTION_CLIENT_CERT_ISSUER_LIST = 94;
105         public const uint WINHTTP_OPTION_SERVER_CERT_CONTEXT = 78;
106         public const uint WINHTTP_OPTION_SECURITY_FLAGS = 31;
107         public const uint WINHTTP_OPTION_SECURE_PROTOCOLS = 84;
108         public const uint WINHTTP_FLAG_SECURE_PROTOCOL_SSL2 = 0x00000008;
109         public const uint WINHTTP_FLAG_SECURE_PROTOCOL_SSL3 = 0x00000020;
110         public const uint WINHTTP_FLAG_SECURE_PROTOCOL_TLS1 = 0x00000080;
111         public const uint WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 = 0x00000200;
112         public const uint WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 = 0x00000800;
113 
114         public const uint SECURITY_FLAG_IGNORE_UNKNOWN_CA = 0x00000100;
115         public const uint SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000;
116         public const uint SECURITY_FLAG_IGNORE_CERT_CN_INVALID = 0x00001000;
117         public const uint SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE = 0x00000200;
118 
119         public const uint WINHTTP_OPTION_AUTOLOGON_POLICY = 77;
120         public const uint WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM = 0; // default creds only sent to intranet servers (default)
121         public const uint WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW = 1; // default creds set to all servers
122         public const uint WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH = 2; // default creds never sent
123 
124         public const uint WINHTTP_AUTH_SCHEME_BASIC = 0x00000001;
125         public const uint WINHTTP_AUTH_SCHEME_NTLM = 0x00000002;
126         public const uint WINHTTP_AUTH_SCHEME_PASSPORT = 0x00000004;
127         public const uint WINHTTP_AUTH_SCHEME_DIGEST = 0x00000008;
128         public const uint WINHTTP_AUTH_SCHEME_NEGOTIATE = 0x00000010;
129 
130         public const uint WINHTTP_AUTH_TARGET_SERVER = 0x00000000;
131         public const uint WINHTTP_AUTH_TARGET_PROXY = 0x00000001;
132 
133         public const uint WINHTTP_OPTION_USERNAME = 0x1000;
134         public const uint WINHTTP_OPTION_PASSWORD = 0x1001;
135         public const uint WINHTTP_OPTION_PROXY_USERNAME = 0x1002;
136         public const uint WINHTTP_OPTION_PROXY_PASSWORD = 0x1003;
137 
138         public const uint WINHTTP_OPTION_SERVER_SPN_USED = 106;
139         public const uint WINHTTP_OPTION_SERVER_CBT = 108;
140 
141         public const uint WINHTTP_OPTION_CONNECT_TIMEOUT = 3;
142         public const uint WINHTTP_OPTION_SEND_TIMEOUT = 5;
143         public const uint WINHTTP_OPTION_RECEIVE_TIMEOUT = 6;
144 
145         public const uint WINHTTP_OPTION_URL = 34;
146 
147         public const uint WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE = 91;
148         public const uint WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE = 92;
149         public const uint WINHTTP_OPTION_CONNECTION_INFO = 93;
150 
151         public const uint WINHTTP_OPTION_ASSURED_NON_BLOCKING_CALLBACKS = 111;
152 
153         public const uint WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL = 133;
154         public const uint WINHTTP_OPTION_HTTP_PROTOCOL_USED = 134;
155         public const uint WINHTTP_PROTOCOL_FLAG_HTTP2 = 0x1;
156 
157         public const uint WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET = 114;
158         public const uint WINHTTP_OPTION_WEB_SOCKET_CLOSE_TIMEOUT = 115;
159         public const uint WINHTTP_OPTION_WEB_SOCKET_KEEPALIVE_INTERVAL = 116;
160 
161         public const uint WINHTTP_OPTION_WEB_SOCKET_RECEIVE_BUFFER_SIZE = 122;
162         public const uint WINHTTP_OPTION_WEB_SOCKET_SEND_BUFFER_SIZE = 123;
163 
164         public enum WINHTTP_WEB_SOCKET_BUFFER_TYPE
165         {
166             WINHTTP_WEB_SOCKET_BINARY_MESSAGE_BUFFER_TYPE = 0,
167             WINHTTP_WEB_SOCKET_BINARY_FRAGMENT_BUFFER_TYPE = 1,
168             WINHTTP_WEB_SOCKET_UTF8_MESSAGE_BUFFER_TYPE = 2,
169             WINHTTP_WEB_SOCKET_UTF8_FRAGMENT_BUFFER_TYPE = 3,
170             WINHTTP_WEB_SOCKET_CLOSE_BUFFER_TYPE = 4
171         }
172 
173         public const uint WINHTTP_OPTION_CONTEXT_VALUE = 45;
174 
175         public const uint WINHTTP_FLAG_ASYNC = 0x10000000;
176 
177         public const uint WINHTTP_CALLBACK_STATUS_RESOLVING_NAME = 0x00000001;
178         public const uint WINHTTP_CALLBACK_STATUS_NAME_RESOLVED = 0x00000002;
179         public const uint WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER = 0x00000004;
180         public const uint WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER = 0x00000008;
181         public const uint WINHTTP_CALLBACK_STATUS_SENDING_REQUEST = 0x00000010;
182         public const uint WINHTTP_CALLBACK_STATUS_REQUEST_SENT = 0x00000020;
183         public const uint WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE = 0x00000040;
184         public const uint WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED = 0x00000080;
185         public const uint WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION = 0x00000100;
186         public const uint WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED = 0x00000200;
187         public const uint WINHTTP_CALLBACK_STATUS_HANDLE_CREATED = 0x00000400;
188         public const uint WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING = 0x00000800;
189         public const uint WINHTTP_CALLBACK_STATUS_DETECTING_PROXY = 0x00001000;
190         public const uint WINHTTP_CALLBACK_STATUS_REDIRECT = 0x00004000;
191         public const uint WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE = 0x00008000;
192         public const uint WINHTTP_CALLBACK_STATUS_SECURE_FAILURE = 0x00010000;
193         public const uint WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE = 0x00020000;
194         public const uint WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE = 0x00040000;
195         public const uint WINHTTP_CALLBACK_STATUS_READ_COMPLETE = 0x00080000;
196         public const uint WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE = 0x00100000;
197         public const uint WINHTTP_CALLBACK_STATUS_REQUEST_ERROR = 0x00200000;
198         public const uint WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE = 0x00400000;
199         public const uint WINHTTP_CALLBACK_STATUS_GETPROXYFORURL_COMPLETE = 0x01000000;
200         public const uint WINHTTP_CALLBACK_STATUS_CLOSE_COMPLETE = 0x02000000;
201         public const uint WINHTTP_CALLBACK_STATUS_SHUTDOWN_COMPLETE = 0x04000000;
202 
203         public const uint WINHTTP_CALLBACK_FLAG_SEND_REQUEST =
204             WINHTTP_CALLBACK_STATUS_SENDING_REQUEST |
205             WINHTTP_CALLBACK_STATUS_REQUEST_SENT;
206         public const uint WINHTTP_CALLBACK_FLAG_HANDLES =
207             WINHTTP_CALLBACK_STATUS_HANDLE_CREATED |
208             WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING;
209         public const uint WINHTTP_CALLBACK_FLAG_REDIRECT = WINHTTP_CALLBACK_STATUS_REDIRECT;
210         public const uint WINHTTP_CALLBACK_FLAG_SECURE_FAILURE = WINHTTP_CALLBACK_STATUS_SECURE_FAILURE;
211         public const uint WINHTTP_CALLBACK_FLAG_SENDREQUEST_COMPLETE = WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE;
212         public const uint WINHTTP_CALLBACK_FLAG_HEADERS_AVAILABLE = WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE;
213         public const uint WINHTTP_CALLBACK_FLAG_DATA_AVAILABLE = WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE;
214         public const uint WINHTTP_CALLBACK_FLAG_READ_COMPLETE = WINHTTP_CALLBACK_STATUS_READ_COMPLETE;
215         public const uint WINHTTP_CALLBACK_FLAG_WRITE_COMPLETE = WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE;
216         public const uint WINHTTP_CALLBACK_FLAG_REQUEST_ERROR = WINHTTP_CALLBACK_STATUS_REQUEST_ERROR;
217         public const uint WINHTTP_CALLBACK_FLAG_GETPROXYFORURL_COMPLETE = WINHTTP_CALLBACK_STATUS_GETPROXYFORURL_COMPLETE;
218         public const uint WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS =
219             WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE |
220             WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE |
221             WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE |
222             WINHTTP_CALLBACK_STATUS_READ_COMPLETE |
223             WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE |
224             WINHTTP_CALLBACK_STATUS_REQUEST_ERROR |
225             WINHTTP_CALLBACK_STATUS_GETPROXYFORURL_COMPLETE;
226         public const uint WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS = 0xFFFFFFFF;
227 
228         public const uint WININET_E_CONNECTION_RESET = 0x80072EFF;
229 
230         public const int WINHTTP_INVALID_STATUS_CALLBACK = -1;
WINHTTP_STATUS_CALLBACK( IntPtr handle, IntPtr context, uint internetStatus, IntPtr statusInformation, uint statusInformationLength)231         public delegate void WINHTTP_STATUS_CALLBACK(
232             IntPtr handle,
233             IntPtr context,
234             uint internetStatus,
235             IntPtr statusInformation,
236             uint statusInformationLength);
237 
238         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
239         public struct WINHTTP_AUTOPROXY_OPTIONS
240         {
241             public uint Flags;
242             public uint AutoDetectFlags;
243             [MarshalAs(UnmanagedType.LPWStr)]
244             public string AutoConfigUrl;
245             public IntPtr Reserved1;
246             public uint Reserved2;
247             [MarshalAs(UnmanagedType.Bool)]
248             public bool AutoLoginIfChallenged;
249         }
250 
251         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
252         public struct WINHTTP_CURRENT_USER_IE_PROXY_CONFIG
253         {
254             [MarshalAs(UnmanagedType.Bool)]
255             public bool AutoDetect;
256             public IntPtr AutoConfigUrl;
257             public IntPtr Proxy;
258             public IntPtr ProxyBypass;
259         }
260 
261         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
262         public struct WINHTTP_PROXY_INFO
263         {
264             public uint AccessType;
265             public IntPtr Proxy;
266             public IntPtr ProxyBypass;
267         }
268 
269         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
270         public struct WINHTTP_CONNECTION_INFO
271         {
272             public uint Size;
273             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
274             public byte[] LocalAddress; // SOCKADDR_STORAGE
275             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
276             public byte[] RemoteAddress; // SOCKADDR_STORAGE
277         }
278 
279         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
280         public struct WINHTTP_ASYNC_RESULT
281         {
282             public IntPtr dwResult;
283             public uint dwError;
284         }
285 
286         public const uint API_RECEIVE_RESPONSE = 1;
287         public const uint API_QUERY_DATA_AVAILABLE = 2;
288         public const uint API_READ_DATA = 3;
289         public const uint API_WRITE_DATA = 4;
290         public const uint API_SEND_REQUEST = 5;
291 
292         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
293         public struct WINHTTP_WEB_SOCKET_ASYNC_RESULT
294         {
295             public WINHTTP_ASYNC_RESULT AsyncResult;
296             public WINHTTP_WEB_SOCKET_OPERATION Operation;
297         }
298 
299         public enum WINHTTP_WEB_SOCKET_OPERATION
300         {
301             WINHTTP_WEB_SOCKET_SEND_OPERATION = 0,
302             WINHTTP_WEB_SOCKET_RECEIVE_OPERATION = 1,
303             WINHTTP_WEB_SOCKET_CLOSE_OPERATION = 2,
304             WINHTTP_WEB_SOCKET_SHUTDOWN_OPERATION = 3
305         }
306 
307         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
308         public struct WINHTTP_WEB_SOCKET_STATUS
309         {
310             public uint dwBytesTransferred;
311             public WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType;
312         }
313     }
314 }
315