winapi_ui_automation/um/
http.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! HTTP API specification
7use shared::guiddef::GUID;
8use shared::minwindef::{DWORD, PUCHAR, PULONG, UCHAR, ULONG, USHORT};
9use shared::sspi::SECURITY_STATUS;
10use shared::ws2def::{PSOCKADDR, SOCKADDR_STORAGE};
11use um::minwinbase::{LPOVERLAPPED, PSECURITY_ATTRIBUTES};
12use um::winnt::{
13    ANYSIZE_ARRAY, BOOLEAN, HANDLE, PCHAR, PCSTR, PCWSTR, PHANDLE, PSECURITY_DESCRIPTOR, PVOID,
14    PWCHAR, PWSTR, ULARGE_INTEGER, ULONGLONG,
15};
16pub const HTTP_INITIALIZE_SERVER: ULONG = 0x00000001;
17pub const HTTP_INITIALIZE_CONFIG: ULONG = 0x00000002;
18pub const HTTP_DEMAND_CBT: ULONG = 0x00000004;
19ENUM!{enum HTTP_SERVER_PROPERTY {
20    HttpServerAuthenticationProperty,
21    HttpServerLoggingProperty,
22    HttpServerQosProperty,
23    HttpServerTimeoutsProperty,
24    HttpServerQueueLengthProperty,
25    HttpServerStateProperty,
26    HttpServer503VerbosityProperty,
27    HttpServerBindingProperty,
28    HttpServerExtendedAuthenticationProperty,
29    HttpServerListenEndpointProperty,
30    HttpServerChannelBindProperty,
31    HttpServerProtectionLevelProperty,
32}}
33pub type PHTTP_SERVER_PROPERTY = *mut HTTP_SERVER_PROPERTY;
34STRUCT!{struct HTTP_PROPERTY_FLAGS {
35    BitFields: ULONG,
36}}
37BITFIELD!{HTTP_PROPERTY_FLAGS BitFields: ULONG [
38    Present set_Present[0..1],
39]}
40pub type PHTTP_PROPERTY_FLAGS = *mut HTTP_PROPERTY_FLAGS;
41ENUM!{enum HTTP_ENABLED_STATE {
42    HttpEnabledStateActive,
43    HttpEnabledStateInactive,
44}}
45pub type PHTTP_ENABLED_STATE = *mut HTTP_ENABLED_STATE;
46STRUCT!{struct HTTP_STATE_INFO {
47    Flags: HTTP_PROPERTY_FLAGS,
48    State: HTTP_ENABLED_STATE,
49}}
50pub type PHTTP_STATE_INFO = *mut HTTP_STATE_INFO;
51ENUM!{enum HTTP_503_RESPONSE_VERBOSITY {
52    Http503ResponseVerbosityBasic,
53    Http503ResponseVerbosityLimited,
54    Http503ResponseVerbosityFull,
55}}
56pub type PHTTP_503_RESPONSE_VERBOSITY = *mut HTTP_503_RESPONSE_VERBOSITY;
57ENUM!{enum HTTP_QOS_SETTING_TYPE {
58    HttpQosSettingTypeBandwidth,
59    HttpQosSettingTypeConnectionLimit,
60    HttpQosSettingTypeFlowRate,
61}}
62pub type PHTTP_QOS_SETTING_TYPE = *mut HTTP_QOS_SETTING_TYPE;
63STRUCT!{struct HTTP_QOS_SETTING_INFO {
64    QosType: HTTP_QOS_SETTING_TYPE,
65    QosSetting: PVOID,
66}}
67pub type PHTTP_QOS_SETTING_INFO = *mut HTTP_QOS_SETTING_INFO;
68STRUCT!{struct HTTP_CONNECTION_LIMIT_INFO {
69    Flags: HTTP_PROPERTY_FLAGS,
70    MaxConnections: ULONG,
71}}
72pub type PHTTP_CONNECTION_LIMIT_INFO = *mut HTTP_CONNECTION_LIMIT_INFO;
73STRUCT!{struct HTTP_BANDWIDTH_LIMIT_INFO {
74    Flags: HTTP_PROPERTY_FLAGS,
75    MaxBandwidth: ULONG,
76}}
77pub type PHTTP_BANDWIDTH_LIMIT_INFO = *mut HTTP_BANDWIDTH_LIMIT_INFO;
78STRUCT!{struct HTTP_FLOWRATE_INFO {
79    Flags: HTTP_PROPERTY_FLAGS,
80    MaxBandwidth: ULONG,
81    MaxPeakBandwidth: ULONG,
82    BurstSize: ULONG,
83}}
84pub type PHTTP_FLOWRATE_INFO = *mut HTTP_FLOWRATE_INFO;
85pub const HTTP_MIN_ALLOWED_BANDWIDTH_THROTTLING_RATE: ULONG = 1024;
86pub const HTTP_LIMIT_INFINITE: ULONG = !0;
87ENUM!{enum HTTP_SERVICE_CONFIG_TIMEOUT_KEY {
88    IdleConnectionTimeout = 0,
89    HeaderWaitTimeout,
90}}
91pub type PHTTP_SERVICE_CONFIG_TIMEOUT_KEY = *mut HTTP_SERVICE_CONFIG_TIMEOUT_KEY;
92pub type HTTP_SERVICE_CONFIG_TIMEOUT_PARAM = USHORT;
93pub type PHTTP_SERVICE_CONFIG_TIMEOUT_PARAM = *mut USHORT;
94STRUCT!{struct HTTP_SERVICE_CONFIG_TIMEOUT_SET {
95    KeyDesc: HTTP_SERVICE_CONFIG_TIMEOUT_KEY,
96    ParamDesc: HTTP_SERVICE_CONFIG_TIMEOUT_PARAM,
97}}
98pub type PHTTP_SERVICE_CONFIG_TIMEOUT_SET = *mut HTTP_SERVICE_CONFIG_TIMEOUT_SET;
99STRUCT!{struct HTTP_TIMEOUT_LIMIT_INFO {
100    Flags: HTTP_PROPERTY_FLAGS,
101    EntityBody: USHORT,
102    DrainEntityBody: USHORT,
103    RequestQueue: USHORT,
104    IdleConnection: USHORT,
105    HeaderWait: USHORT,
106    MinSendRate: ULONG,
107}}
108pub type PHTTP_TIMEOUT_LIMIT_INFO = *mut HTTP_TIMEOUT_LIMIT_INFO;
109STRUCT!{struct HTTP_LISTEN_ENDPOINT_INFO {
110    Flags: HTTP_PROPERTY_FLAGS,
111    EnableSharing: BOOLEAN,
112}}
113pub type PHTTP_LISTEN_ENDPOINT_INFO = *mut HTTP_LISTEN_ENDPOINT_INFO;
114STRUCT!{struct HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS {
115    DomainNameLength: USHORT,
116    DomainName: PWSTR,
117    RealmLength: USHORT,
118    Realm: PWSTR,
119}}
120pub type PHTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS = *mut HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS;
121STRUCT!{struct HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS {
122    RealmLength: USHORT,
123    Realm: PWSTR,
124}}
125pub type PHTTP_SERVER_AUTHENTICATION_BASIC_PARAMS = *mut HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS;
126pub const HTTP_AUTH_ENABLE_BASIC: ULONG = 0x00000001;
127pub const HTTP_AUTH_ENABLE_DIGEST: ULONG = 0x00000002;
128pub const HTTP_AUTH_ENABLE_NTLM: ULONG = 0x00000004;
129pub const HTTP_AUTH_ENABLE_NEGOTIATE: ULONG = 0x00000008;
130pub const HTTP_AUTH_ENABLE_KERBEROS: ULONG = 0x00000010;
131pub const HTTP_AUTH_ENABLE_ALL: ULONG = HTTP_AUTH_ENABLE_BASIC | HTTP_AUTH_ENABLE_DIGEST |
132    HTTP_AUTH_ENABLE_NTLM | HTTP_AUTH_ENABLE_NEGOTIATE | HTTP_AUTH_ENABLE_KERBEROS;
133pub const HTTP_AUTH_EX_FLAG_ENABLE_KERBEROS_CREDENTIAL_CACHING: UCHAR = 0x01;
134pub const HTTP_AUTH_EX_FLAG_CAPTURE_CREDENTIAL: UCHAR = 0x02;
135STRUCT!{struct HTTP_SERVER_AUTHENTICATION_INFO {
136    Flags: HTTP_PROPERTY_FLAGS,
137    AuthSchemes: ULONG,
138    ReceiveMutualAuth: BOOLEAN,
139    ReceiveContextHandle: BOOLEAN,
140    DisableNTLMCredentialCaching: BOOLEAN,
141    ExFlags: UCHAR,
142    DigestParams: HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS,
143    BasicParams: HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS,
144}}
145pub type PHTTP_SERVER_AUTHENTICATION_INFO = *mut HTTP_SERVER_AUTHENTICATION_INFO;
146ENUM!{enum HTTP_SERVICE_BINDING_TYPE {
147    HttpServiceBindingTypeNone = 0,
148    HttpServiceBindingTypeW,
149    HttpServiceBindingTypeA,
150}}
151STRUCT!{struct HTTP_SERVICE_BINDING_BASE {
152    Type: HTTP_SERVICE_BINDING_TYPE,
153}}
154pub type PHTTP_SERVICE_BINDING_BASE = *mut HTTP_SERVICE_BINDING_BASE;
155STRUCT!{struct HTTP_SERVICE_BINDING_A {
156    Base: HTTP_SERVICE_BINDING_BASE,
157    Buffer: PCHAR,
158    BufferSize: ULONG,
159}}
160pub type PHTTP_SERVICE_BINDING_A = *mut HTTP_SERVICE_BINDING_A;
161STRUCT!{struct HTTP_SERVICE_BINDING_W {
162    Base: HTTP_SERVICE_BINDING_BASE,
163    Buffer: PWCHAR,
164    BufferSize: ULONG,
165}}
166pub type PHTTP_SERVICE_BINDING_W = *mut HTTP_SERVICE_BINDING_W;
167ENUM!{enum HTTP_AUTHENTICATION_HARDENING_LEVELS {
168    HttpAuthenticationHardeningLegacy = 0,
169    HttpAuthenticationHardeningMedium,
170    HttpAuthenticationHardeningStrict,
171}}
172pub const HTTP_CHANNEL_BIND_PROXY: ULONG = 0x1;
173pub const HTTP_CHANNEL_BIND_PROXY_COHOSTING: ULONG = 0x20;
174pub const HTTP_CHANNEL_BIND_NO_SERVICE_NAME_CHECK: ULONG = 0x2;
175pub const HTTP_CHANNEL_BIND_DOTLESS_SERVICE: ULONG = 0x4;
176pub const HTTP_CHANNEL_BIND_SECURE_CHANNEL_TOKEN: ULONG = 0x8;
177pub const HTTP_CHANNEL_BIND_CLIENT_SERVICE: ULONG = 0x10;
178STRUCT!{struct HTTP_CHANNEL_BIND_INFO {
179    Hardening: HTTP_AUTHENTICATION_HARDENING_LEVELS,
180    Flags: ULONG,
181    ServiceNames: *mut PHTTP_SERVICE_BINDING_BASE,
182    NumberOfServiceNames: ULONG,
183}}
184pub type PHTTP_CHANNEL_BIND_INFO = *mut HTTP_CHANNEL_BIND_INFO;
185STRUCT!{struct HTTP_REQUEST_CHANNEL_BIND_STATUS {
186    ServiceName: PHTTP_SERVICE_BINDING_BASE,
187    ChannelToken: PUCHAR,
188    ChannelTokenSize: ULONG,
189    Flags: ULONG,
190}}
191pub type PHTTP_REQUEST_CHANNEL_BIND_STATUS = *mut HTTP_REQUEST_CHANNEL_BIND_STATUS;
192pub const HTTP_LOG_FIELD_DATE: ULONG = 0x00000001;
193pub const HTTP_LOG_FIELD_TIME: ULONG = 0x00000002;
194pub const HTTP_LOG_FIELD_CLIENT_IP: ULONG = 0x00000004;
195pub const HTTP_LOG_FIELD_USER_NAME: ULONG = 0x00000008;
196pub const HTTP_LOG_FIELD_SITE_NAME: ULONG = 0x00000010;
197pub const HTTP_LOG_FIELD_COMPUTER_NAME: ULONG = 0x00000020;
198pub const HTTP_LOG_FIELD_SERVER_IP: ULONG = 0x00000040;
199pub const HTTP_LOG_FIELD_METHOD: ULONG = 0x00000080;
200pub const HTTP_LOG_FIELD_URI_STEM: ULONG = 0x00000100;
201pub const HTTP_LOG_FIELD_URI_QUERY: ULONG = 0x00000200;
202pub const HTTP_LOG_FIELD_STATUS: ULONG = 0x00000400;
203pub const HTTP_LOG_FIELD_WIN32_STATUS: ULONG = 0x00000800;
204pub const HTTP_LOG_FIELD_BYTES_SENT: ULONG = 0x00001000;
205pub const HTTP_LOG_FIELD_BYTES_RECV: ULONG = 0x00002000;
206pub const HTTP_LOG_FIELD_TIME_TAKEN: ULONG = 0x00004000;
207pub const HTTP_LOG_FIELD_SERVER_PORT: ULONG = 0x00008000;
208pub const HTTP_LOG_FIELD_USER_AGENT: ULONG = 0x00010000;
209pub const HTTP_LOG_FIELD_COOKIE: ULONG = 0x00020000;
210pub const HTTP_LOG_FIELD_REFERER: ULONG = 0x00040000;
211pub const HTTP_LOG_FIELD_VERSION: ULONG = 0x00080000;
212pub const HTTP_LOG_FIELD_HOST: ULONG = 0x00100000;
213pub const HTTP_LOG_FIELD_SUB_STATUS: ULONG = 0x00200000;
214pub const HTTP_LOG_FIELD_CLIENT_PORT: ULONG = 0x00400000;
215pub const HTTP_LOG_FIELD_URI: ULONG = 0x00800000;
216pub const HTTP_LOG_FIELD_SITE_ID: ULONG = 0x01000000;
217pub const HTTP_LOG_FIELD_REASON: ULONG = 0x02000000;
218pub const HTTP_LOG_FIELD_QUEUE_NAME: ULONG = 0x04000000;
219ENUM!{enum HTTP_LOGGING_TYPE {
220    HttpLoggingTypeW3C,
221    HttpLoggingTypeIIS,
222    HttpLoggingTypeNCSA,
223    HttpLoggingTypeRaw,
224}}
225ENUM!{enum HTTP_LOGGING_ROLLOVER_TYPE {
226    HttpLoggingRolloverSize,
227    HttpLoggingRolloverDaily,
228    HttpLoggingRolloverWeekly,
229    HttpLoggingRolloverMonthly,
230    HttpLoggingRolloverHourly,
231}}
232pub const HTTP_MIN_ALLOWED_LOG_FILE_ROLLOVER_SIZE: ULONG = 1 * 1024 * 1024;
233pub const HTTP_LOGGING_FLAG_LOCAL_TIME_ROLLOVER: ULONG = 0x00000001;
234pub const HTTP_LOGGING_FLAG_USE_UTF8_CONVERSION: ULONG = 0x00000002;
235pub const HTTP_LOGGING_FLAG_LOG_ERRORS_ONLY: ULONG = 0x00000004;
236pub const HTTP_LOGGING_FLAG_LOG_SUCCESS_ONLY: ULONG = 0x00000008;
237STRUCT!{struct HTTP_LOGGING_INFO {
238    Flags: HTTP_PROPERTY_FLAGS,
239    LoggingFlags: ULONG,
240    SoftwareName: PCWSTR,
241    SoftwareNameLength: USHORT,
242    DirectoryNameLength: USHORT,
243    DirectoryName: PCWSTR,
244    Format: HTTP_LOGGING_TYPE,
245    Fields: ULONG,
246    pExtFields: PVOID,
247    NumOfExtFields: USHORT,
248    MaxRecordSize: USHORT,
249    RolloverType: HTTP_LOGGING_ROLLOVER_TYPE,
250    RolloverSize: ULONG,
251    pSecurityDescriptor: PSECURITY_DESCRIPTOR,
252}}
253pub type PHTTP_LOGGING_INFO = *mut HTTP_LOGGING_INFO;
254STRUCT!{struct HTTP_BINDING_INFO {
255    Flags: HTTP_PROPERTY_FLAGS,
256    RequestQueueHandle: HANDLE,
257}}
258pub type PHTTP_BINDING_INFO = *mut HTTP_BINDING_INFO;
259ENUM!{enum HTTP_PROTECTION_LEVEL_TYPE {
260    HttpProtectionLevelUnrestricted,
261    HttpProtectionLevelEdgeRestricted,
262    HttpProtectionLevelRestricted,
263}}
264pub type PHTTP_PROTECTION_LEVEL_TYPE = *mut HTTP_PROTECTION_LEVEL_TYPE;
265STRUCT!{struct HTTP_PROTECTION_LEVEL_INFO {
266    Flags: HTTP_PROPERTY_FLAGS,
267    Level: HTTP_PROTECTION_LEVEL_TYPE,
268}}
269pub type PHTTP_PROTECTION_LEVEL_INFO = *mut HTTP_PROTECTION_LEVEL_INFO;
270pub const HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING: ULONG = 0x00000001;
271pub const HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER: ULONG = 0x00000002;
272pub const HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY: ULONG = 0x00000001;
273pub const HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY: ULONG = 0x00000002;
274pub const HTTP_RECEIVE_REQUEST_ENTITY_BODY_FLAG_FILL_BUFFER: ULONG = 0x00000001;
275pub const HTTP_SEND_RESPONSE_FLAG_DISCONNECT: ULONG = 0x00000001;
276pub const HTTP_SEND_RESPONSE_FLAG_MORE_DATA: ULONG = 0x00000002;
277pub const HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA: ULONG = 0x00000004;
278pub const HTTP_SEND_RESPONSE_FLAG_ENABLE_NAGLING: ULONG = 0x00000008;
279pub const HTTP_SEND_RESPONSE_FLAG_PROCESS_RANGES: ULONG = 0x00000020;
280pub const HTTP_SEND_RESPONSE_FLAG_OPAQUE: ULONG = 0x00000040;
281pub const HTTP_FLUSH_RESPONSE_FLAG_RECURSIVE: ULONG = 0x00000001;
282pub type HTTP_OPAQUE_ID = ULONGLONG;
283pub type PHTTP_OPAQUE_ID = *mut ULONGLONG;
284pub type HTTP_REQUEST_ID = HTTP_OPAQUE_ID;
285pub type PHTTP_REQUEST_ID = *mut HTTP_OPAQUE_ID;
286pub type HTTP_CONNECTION_ID = HTTP_OPAQUE_ID;
287pub type PHTTP_CONNECTION_ID = *mut HTTP_OPAQUE_ID;
288pub type HTTP_RAW_CONNECTION_ID = HTTP_OPAQUE_ID;
289pub type PHTTP_RAW_CONNECTION_ID = *mut HTTP_OPAQUE_ID;
290pub type HTTP_URL_GROUP_ID = HTTP_OPAQUE_ID;
291pub type PHTTP_URL_GROUP_ID = *mut HTTP_OPAQUE_ID;
292pub type HTTP_SERVER_SESSION_ID = HTTP_OPAQUE_ID;
293pub type PHTTP_SERVER_SESSION_ID = *mut HTTP_OPAQUE_ID;
294pub const HTTP_BYTE_RANGE_TO_EOF: ULONGLONG = !0;
295STRUCT!{struct HTTP_BYTE_RANGE {
296    StartingOffset: ULARGE_INTEGER,
297    Length: ULARGE_INTEGER,
298}}
299pub type PHTTP_BYTE_RANGE = *mut HTTP_BYTE_RANGE;
300STRUCT!{struct HTTP_VERSION {
301    MajorVersion: USHORT,
302    MinorVersion: USHORT,
303}}
304pub type PHTTP_VERSION = *mut HTTP_VERSION;
305pub const HTTP_VERSION_UNKNOWN: HTTP_VERSION = HTTP_VERSION { MajorVersion: 0, MinorVersion: 0 };
306pub const HTTP_VERSION_0_9: HTTP_VERSION = HTTP_VERSION { MajorVersion: 0, MinorVersion: 9 };
307pub const HTTP_VERSION_1_0: HTTP_VERSION = HTTP_VERSION { MajorVersion: 1, MinorVersion: 0 };
308pub const HTTP_VERSION_1_1: HTTP_VERSION = HTTP_VERSION { MajorVersion: 1, MinorVersion: 1 };
309#[inline]
310pub fn HTTP_SET_VERSION(mut version: HTTP_VERSION, major: USHORT, minor: USHORT) {
311    version.MajorVersion = major;
312    version.MinorVersion = minor;
313}
314#[inline]
315pub fn HTTP_EQUAL_VERSION(version: HTTP_VERSION, major: USHORT, minor: USHORT) -> bool {
316    version.MajorVersion == major && version.MinorVersion == minor
317}
318#[inline]
319pub fn HTTP_GREATER_VERSION(version: HTTP_VERSION, major: USHORT, minor: USHORT) -> bool {
320    version.MajorVersion > major || (version.MajorVersion == major && version.MinorVersion > minor)
321}
322#[inline]
323pub fn HTTP_LESS_VERSION(version: HTTP_VERSION, major: USHORT, minor: USHORT) -> bool {
324    version.MajorVersion < major || (version.MajorVersion == major && version.MinorVersion < minor)
325}
326#[inline]
327pub fn HTTP_NOT_EQUAL_VERSION(version: HTTP_VERSION, major: USHORT, minor: USHORT) -> bool {
328    !HTTP_EQUAL_VERSION(version, major, minor)
329}
330#[inline]
331pub fn HTTP_GREATER_EQUAL_VERSION(version: HTTP_VERSION, major: USHORT, minor: USHORT) -> bool {
332    !HTTP_LESS_VERSION(version, major, minor)
333}
334#[inline]
335pub fn HTTP_LESS_EQUAL_VERSION(version: HTTP_VERSION, major: USHORT, minor: USHORT) -> bool {
336    !HTTP_GREATER_VERSION(version, major, minor)
337}
338ENUM!{enum HTTP_VERB {
339    HttpVerbUnparsed,
340    HttpVerbUnknown,
341    HttpVerbInvalid,
342    HttpVerbOPTIONS,
343    HttpVerbGET,
344    HttpVerbHEAD,
345    HttpVerbPOST,
346    HttpVerbPUT,
347    HttpVerbDELETE,
348    HttpVerbTRACE,
349    HttpVerbCONNECT,
350    HttpVerbTRACK,
351    HttpVerbMOVE,
352    HttpVerbCOPY,
353    HttpVerbPROPFIND,
354    HttpVerbPROPPATCH,
355    HttpVerbMKCOL,
356    HttpVerbLOCK,
357    HttpVerbUNLOCK,
358    HttpVerbSEARCH,
359    HttpVerbMaximum,
360}}
361pub type PHTTP_VERB = *mut HTTP_VERB;
362ENUM!{enum HTTP_HEADER_ID {
363    HttpHeaderCacheControl = 0,
364    HttpHeaderConnection = 1,
365    HttpHeaderDate = 2,
366    HttpHeaderKeepAlive = 3,
367    HttpHeaderPragma = 4,
368    HttpHeaderTrailer = 5,
369    HttpHeaderTransferEncoding = 6,
370    HttpHeaderUpgrade = 7,
371    HttpHeaderVia = 8,
372    HttpHeaderWarning = 9,
373    HttpHeaderAllow = 10,
374    HttpHeaderContentLength = 11,
375    HttpHeaderContentType = 12,
376    HttpHeaderContentEncoding = 13,
377    HttpHeaderContentLanguage = 14,
378    HttpHeaderContentLocation = 15,
379    HttpHeaderContentMd5 = 16,
380    HttpHeaderContentRange = 17,
381    HttpHeaderExpires = 18,
382    HttpHeaderLastModified = 19,
383    HttpHeaderAccept = 20,
384    HttpHeaderAcceptCharset = 21,
385    HttpHeaderAcceptEncoding = 22,
386    HttpHeaderAcceptLanguage = 23,
387    HttpHeaderAuthorization = 24,
388    HttpHeaderCookie = 25,
389    HttpHeaderExpect = 26,
390    HttpHeaderFrom = 27,
391    HttpHeaderHost = 28,
392    HttpHeaderIfMatch = 29,
393    HttpHeaderIfModifiedSince = 30,
394    HttpHeaderIfNoneMatch = 31,
395    HttpHeaderIfRange = 32,
396    HttpHeaderIfUnmodifiedSince = 33,
397    HttpHeaderMaxForwards = 34,
398    HttpHeaderProxyAuthorization = 35,
399    HttpHeaderReferer = 36,
400    HttpHeaderRange = 37,
401    HttpHeaderTe = 38,
402    HttpHeaderTranslate = 39,
403    HttpHeaderUserAgent = 40,
404    HttpHeaderRequestMaximum = 41,
405    HttpHeaderAcceptRanges = 20,
406    HttpHeaderAge = 21,
407    HttpHeaderEtag = 22,
408    HttpHeaderLocation = 23,
409    HttpHeaderProxyAuthenticate = 24,
410    HttpHeaderRetryAfter = 25,
411    HttpHeaderServer = 26,
412    HttpHeaderSetCookie = 27,
413    HttpHeaderVary = 28,
414    HttpHeaderWwwAuthenticate = 29,
415    HttpHeaderResponseMaximum = 30,
416    HttpHeaderMaximum = 41,
417}}
418pub type PHTTP_HEADER_ID = *mut HTTP_HEADER_ID;
419STRUCT!{struct HTTP_KNOWN_HEADER {
420    RawValueLength: USHORT,
421    pRawValue: PCSTR,
422}}
423pub type PHTTP_KNOWN_HEADER = *mut HTTP_KNOWN_HEADER;
424STRUCT!{struct HTTP_UNKNOWN_HEADER {
425    NameLength: USHORT,
426    RawValueLength: USHORT,
427    pName: PCSTR,
428    pRawValue: PCSTR,
429}}
430pub type PHTTP_UNKNOWN_HEADER = *mut HTTP_UNKNOWN_HEADER;
431ENUM!{enum HTTP_LOG_DATA_TYPE {
432    HttpLogDataTypeFields = 0,
433}}
434pub type PHTTP_LOG_DATA_TYPE = *mut HTTP_LOG_DATA_TYPE;
435STRUCT!{struct HTTP_LOG_DATA {
436    Type: HTTP_LOG_DATA_TYPE,
437}}
438pub type PHTTP_LOG_DATA = *mut HTTP_LOG_DATA;
439STRUCT!{struct HTTP_LOG_FIELDS_DATA {
440    Base: HTTP_LOG_DATA,
441    UserNameLength: USHORT,
442    UriStemLength: USHORT,
443    ClientIpLength: USHORT,
444    ServerNameLength: USHORT,
445    ServiceNameLength: USHORT,
446    ServerIpLength: USHORT,
447    MethodLength: USHORT,
448    UriQueryLength: USHORT,
449    HostLength: USHORT,
450    UserAgentLength: USHORT,
451    CookieLength: USHORT,
452    ReferrerLength: USHORT,
453    UserName: PWCHAR,
454    UriStem: PWCHAR,
455    ClientIp: PCHAR,
456    ServerName: PCHAR,
457    ServiceName: PCHAR,
458    ServerIp: PCHAR,
459    Method: PCHAR,
460    UriQuery: PCHAR,
461    Host: PCHAR,
462    UserAgent: PCHAR,
463    Cookie: PCHAR,
464    Referrer: PCHAR,
465    ServerPort: USHORT,
466    ProtocolStatus: USHORT,
467    Win32Status: ULONG,
468    MethodNum: HTTP_VERB,
469    SubStatus: USHORT,
470}}
471pub type PHTTP_LOG_FIELDS_DATA = *mut HTTP_LOG_FIELDS_DATA;
472ENUM!{enum HTTP_DATA_CHUNK_TYPE {
473    HttpDataChunkFromMemory,
474    HttpDataChunkFromFileHandle,
475    HttpDataChunkFromFragmentCache,
476    HttpDataChunkFromFragmentCacheEx,
477    HttpDataChunkMaximum,
478}}
479pub type PHTTP_DATA_CHUNK_TYPE = *mut HTTP_DATA_CHUNK_TYPE;
480STRUCT!{struct HTTP_DATA_CHUNK_FromMemory {
481    pBuffer: PVOID,
482    BufferLength: ULONG,
483}}
484STRUCT!{struct HTTP_DATA_CHUNK_FromFileHandle {
485    ByteRange: HTTP_BYTE_RANGE,
486    FileHandle: HANDLE,
487}}
488STRUCT!{struct HTTP_DATA_CHUNK_FromFragmentCache {
489    FragmentNameLength: USHORT,
490    pFragmentName: PCWSTR,
491}}
492STRUCT!{struct HTTP_DATA_CHUNK_FromFragmentCacheEx {
493    ByteRange: HTTP_BYTE_RANGE,
494    pFragmentName: PCWSTR,
495}}
496UNION!{union HTTP_DATA_CHUNK_u {
497    [u64; 3],
498    FromMemory FromMemory_mut: HTTP_DATA_CHUNK_FromMemory,
499    FromFileHandle FromFileHandle_mut: HTTP_DATA_CHUNK_FromFileHandle,
500    FromFragmentCache FromFragmentCache_mut: HTTP_DATA_CHUNK_FromFragmentCache,
501    FromFragmentCacheEx FromFragmentCacheEx_mut: HTTP_DATA_CHUNK_FromFragmentCacheEx,
502}}
503STRUCT!{struct HTTP_DATA_CHUNK {
504    DataChunkType: HTTP_DATA_CHUNK_TYPE,
505    u: HTTP_DATA_CHUNK_u,
506}}
507pub type PHTTP_DATA_CHUNK = *mut HTTP_DATA_CHUNK;
508STRUCT!{struct HTTP_REQUEST_HEADERS {
509    UnknownHeaderCount: USHORT,
510    pUnknownHeaders: PHTTP_UNKNOWN_HEADER,
511    TrailerCount: USHORT,
512    pTrailers: PHTTP_UNKNOWN_HEADER,
513    KnownHeaders: [HTTP_KNOWN_HEADER; 41], // FIXME HttpHeaderRequestMaximum
514}}
515pub type PHTTP_REQUEST_HEADERS = *mut HTTP_REQUEST_HEADERS;
516STRUCT!{struct HTTP_RESPONSE_HEADERS {
517    UnknownHeaderCount: USHORT,
518    pUnknownHeaders: PHTTP_UNKNOWN_HEADER,
519    TrailerCount: USHORT,
520    pTrailers: PHTTP_UNKNOWN_HEADER,
521    KnownHeaders: [HTTP_KNOWN_HEADER; 30], // FIXME HttpHeaderResponseMaximum
522}}
523pub type PHTTP_RESPONSE_HEADERS = *mut HTTP_RESPONSE_HEADERS;
524STRUCT!{struct HTTP_TRANSPORT_ADDRESS {
525    pRemoteAddress: PSOCKADDR,
526    pLocalAddress: PSOCKADDR,
527}}
528pub type PHTTP_TRANSPORT_ADDRESS = *mut HTTP_TRANSPORT_ADDRESS;
529STRUCT!{struct HTTP_COOKED_URL {
530    FullUrlLength: USHORT,
531    HostLength: USHORT,
532    AbsPathLength: USHORT,
533    QueryStringLength: USHORT,
534    pFullUrl: PCWSTR,
535    pHost: PCWSTR,
536    pAbsPath: PCWSTR,
537    pQueryString: PCWSTR,
538}}
539pub type PHTTP_COOKED_URL = *mut HTTP_COOKED_URL;
540pub type HTTP_URL_CONTEXT = ULONGLONG;
541pub const HTTP_URL_FLAG_REMOVE_ALL: ULONG = 0x00000001;
542ENUM!{enum HTTP_AUTH_STATUS {
543    HttpAuthStatusSuccess,
544    HttpAuthStatusNotAuthenticated,
545    HttpAuthStatusFailure,
546}}
547pub type PHTTP_AUTH_STATUS = *mut HTTP_AUTH_STATUS;
548ENUM!{enum HTTP_REQUEST_AUTH_TYPE {
549    HttpRequestAuthTypeNone = 0,
550    HttpRequestAuthTypeBasic,
551    HttpRequestAuthTypeDigest,
552    HttpRequestAuthTypeNTLM,
553    HttpRequestAuthTypeNegotiate,
554    HttpRequestAuthTypeKerberos,
555}}
556pub type PHTTP_REQUEST_AUTH_TYPE = *mut HTTP_REQUEST_AUTH_TYPE;
557STRUCT!{struct HTTP_SSL_CLIENT_CERT_INFO {
558    CertFlags: ULONG,
559    CertEncodedSize: ULONG,
560    pCertEncoded: PUCHAR,
561    Token: HANDLE,
562    CertDeniedByMapper: BOOLEAN,
563}}
564pub type PHTTP_SSL_CLIENT_CERT_INFO = *mut HTTP_SSL_CLIENT_CERT_INFO;
565pub const HTTP_RECEIVE_SECURE_CHANNEL_TOKEN: ULONG = 0x1;
566STRUCT!{struct HTTP_SSL_INFO {
567    ServerCertKeySize: USHORT,
568    ConnectionKeySize: USHORT,
569    ServerCertIssuerSize: ULONG,
570    ServerCertSubjectSize: ULONG,
571    pServerCertIssuer: PCSTR,
572    pServerCertSubject: PCSTR,
573    pClientCertInfo: PHTTP_SSL_CLIENT_CERT_INFO,
574    SslClientCertNegotiated: ULONG,
575}}
576pub type PHTTP_SSL_INFO = *mut HTTP_SSL_INFO;
577ENUM!{enum HTTP_REQUEST_INFO_TYPE {
578    HttpRequestInfoTypeAuth,
579    HttpRequestInfoTypeChannelBind,
580}}
581STRUCT!{struct HTTP_REQUEST_INFO {
582    InfoType: HTTP_REQUEST_INFO_TYPE,
583    InfoLength: ULONG,
584    pInfo: PVOID,
585}}
586pub type PHTTP_REQUEST_INFO = *mut HTTP_REQUEST_INFO;
587pub const HTTP_REQUEST_AUTH_FLAG_TOKEN_FOR_CACHED_CRED: ULONG = 0x00000001;
588STRUCT!{struct HTTP_REQUEST_AUTH_INFO {
589    AuthStatus: HTTP_AUTH_STATUS,
590    SecStatus: SECURITY_STATUS,
591    Flags: ULONG,
592    AuthType: HTTP_REQUEST_AUTH_TYPE,
593    AccessToken: HANDLE,
594    ContextAttributes: ULONG,
595    PackedContextLength: ULONG,
596    PackedContextType: ULONG,
597    PackedContext: PVOID,
598    MutualAuthDataLength: ULONG,
599    pMutualAuthData: PCHAR,
600    PackageNameLength: USHORT,
601    pPackageName: PWSTR,
602}}
603pub type PHTTP_REQUEST_AUTH_INFO = *mut HTTP_REQUEST_AUTH_INFO;
604STRUCT!{struct HTTP_REQUEST_V1 {
605    Flags: ULONG,
606    ConnectionId: HTTP_CONNECTION_ID,
607    RequestId: HTTP_REQUEST_ID,
608    UrlContext: HTTP_URL_CONTEXT,
609    Version: HTTP_VERSION,
610    Verb: HTTP_VERB,
611    UnknownVerbLength: USHORT,
612    RawUrlLength: USHORT,
613    pUnknownVerb: PCSTR,
614    pRawUrl: PCSTR,
615    CookedUrl: HTTP_COOKED_URL,
616    Address: HTTP_TRANSPORT_ADDRESS,
617    Headers: HTTP_REQUEST_HEADERS,
618    BytesReceived: ULONGLONG,
619    EntityChunkCount: USHORT,
620    pEntityChunks: PHTTP_DATA_CHUNK,
621    RawConnectionId: HTTP_RAW_CONNECTION_ID,
622    pSslInfo: PHTTP_SSL_INFO,
623}}
624pub type PHTTP_REQUEST_V1 = *mut HTTP_REQUEST_V1;
625STRUCT!{struct HTTP_REQUEST_V2 {
626    Base: HTTP_REQUEST_V1,
627    RequestInfoCount: USHORT,
628    pRequestInfo: PHTTP_REQUEST_INFO,
629}}
630pub type PHTTP_REQUEST_V2 = *mut HTTP_REQUEST_V2;
631pub type HTTP_REQUEST = HTTP_REQUEST_V2;
632pub type PHTTP_REQUEST = *mut HTTP_REQUEST;
633pub const HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS: ULONG = 0x00000001;
634pub const HTTP_REQUEST_FLAG_IP_ROUTED: ULONG = 0x00000002;
635STRUCT!{struct HTTP_RESPONSE_V1 {
636    Flags: ULONG,
637    Version: HTTP_VERSION,
638    StatusCode: USHORT,
639    ReasonLength: USHORT,
640    pReason: PCSTR,
641    Headers: HTTP_RESPONSE_HEADERS,
642    EntityChunkCount: USHORT,
643    pEntityChunks: PHTTP_DATA_CHUNK,
644}}
645pub type PHTTP_RESPONSE_V1 = *mut HTTP_RESPONSE_V1;
646pub const HTTP_RESPONSE_FLAG_MULTIPLE_ENCODINGS_AVAILABLE: ULONG = 0x00000001;
647ENUM!{enum HTTP_RESPONSE_INFO_TYPE {
648    HttpResponseInfoTypeMultipleKnownHeaders,
649    HttpResponseInfoTypeAuthenticationProperty,
650    HttpResponseInfoTypeQoSProperty,
651    HttpResponseInfoTypeChannelBind,
652}}
653pub type PHTTP_RESPONSE_INFO_TYPE = *mut HTTP_RESPONSE_INFO_TYPE;
654STRUCT!{struct HTTP_RESPONSE_INFO {
655    Type: HTTP_RESPONSE_INFO_TYPE,
656    Length: ULONG,
657    pInfo: PVOID,
658}}
659pub type PHTTP_RESPONSE_INFO = *mut HTTP_RESPONSE_INFO;
660pub const HTTP_RESPONSE_INFO_FLAGS_PRESERVE_ORDER: ULONG = 0x00000001;
661STRUCT!{struct HTTP_MULTIPLE_KNOWN_HEADERS {
662    HeaderId: HTTP_HEADER_ID,
663    Flags: ULONG,
664    KnownHeaderCount: USHORT,
665    KnownHeaders: PHTTP_KNOWN_HEADER,
666}}
667pub type PHTTP_MULTIPLE_KNOWN_HEADERS = *mut HTTP_MULTIPLE_KNOWN_HEADERS;
668STRUCT!{struct HTTP_RESPONSE_V2 {
669    Base: HTTP_RESPONSE_V1,
670    ResponseInfoCount: USHORT,
671    pResponseInfo: PHTTP_RESPONSE_INFO,
672}}
673pub type PHTTP_RESPONSE_V2 = *mut HTTP_RESPONSE_V2;
674pub type HTTP_RESPONSE = HTTP_RESPONSE_V2;
675pub type PHTTP_RESPONSE = *mut HTTP_RESPONSE;
676STRUCT!{struct HTTPAPI_VERSION {
677    HttpApiMajorVersion: USHORT,
678    HttpApiMinorVersion: USHORT,
679}}
680pub type PHTTPAPI_VERSION = *mut HTTPAPI_VERSION;
681pub const HTTPAPI_VERSION_2: HTTPAPI_VERSION = HTTPAPI_VERSION {
682    HttpApiMajorVersion: 2,
683    HttpApiMinorVersion: 0,
684};
685pub const HTTPAPI_VERSION_1: HTTPAPI_VERSION = HTTPAPI_VERSION {
686    HttpApiMajorVersion: 1,
687    HttpApiMinorVersion: 0,
688};
689#[inline]
690pub fn HTTPAPI_EQUAL_VERSION(version: HTTPAPI_VERSION, major: USHORT, minor: USHORT) -> bool {
691    version.HttpApiMajorVersion == major && version.HttpApiMinorVersion == minor
692}
693#[inline]
694pub fn HTTPAPI_GREATER_VERSION(version: HTTPAPI_VERSION, major: USHORT, minor: USHORT) -> bool {
695    version.HttpApiMajorVersion > major ||
696    (version.HttpApiMajorVersion == major && version.HttpApiMinorVersion > minor)
697}
698#[inline]
699pub fn HTTPAPI_LESS_VERSION(version: HTTPAPI_VERSION, major: USHORT, minor: USHORT) -> bool {
700    version.HttpApiMajorVersion < major ||
701    (version.HttpApiMajorVersion == major && version.HttpApiMinorVersion < minor)
702}
703#[inline]
704pub fn HTTPAPI_VERSION_GREATER_OR_EQUAL(
705    version: HTTPAPI_VERSION,
706    major: USHORT,
707    minor: USHORT,
708) -> bool {
709    !HTTPAPI_LESS_VERSION(version, major, minor)
710}
711ENUM!{enum HTTP_CACHE_POLICY_TYPE {
712    HttpCachePolicyNocache,
713    HttpCachePolicyUserInvalidates,
714    HttpCachePolicyTimeToLive,
715    HttpCachePolicyMaximum,
716}}
717pub type PHTTP_CACHE_POLICY_TYPE = *mut HTTP_CACHE_POLICY_TYPE;
718STRUCT!{struct HTTP_CACHE_POLICY {
719    Policy: HTTP_CACHE_POLICY_TYPE,
720    SecondsToLive: ULONG,
721}}
722pub type PHTTP_CACHE_POLICY = *mut HTTP_CACHE_POLICY;
723ENUM!{enum HTTP_SERVICE_CONFIG_ID {
724    HttpServiceConfigIPListenList,
725    HttpServiceConfigSSLCertInfo,
726    HttpServiceConfigUrlAclInfo,
727    HttpServiceConfigTimeout,
728    HttpServiceConfigCache,
729    HttpServiceConfigSslSniCertInfo,
730    HttpServiceConfigSslCcsCertInfo,
731    HttpServiceConfigMax,
732}}
733pub type PHTTP_SERVICE_CONFIG_ID = *mut HTTP_SERVICE_CONFIG_ID;
734ENUM!{enum HTTP_SERVICE_CONFIG_QUERY_TYPE {
735    HttpServiceConfigQueryExact,
736    HttpServiceConfigQueryNext,
737    HttpServiceConfigQueryMax,
738}}
739pub type PHTTP_SERVICE_CONFIG_QUERY_TYPE = *mut HTTP_SERVICE_CONFIG_QUERY_TYPE;
740STRUCT!{struct HTTP_SERVICE_CONFIG_SSL_KEY {
741    pIpPort: PSOCKADDR,
742}}
743pub type PHTTP_SERVICE_CONFIG_SSL_KEY = *mut HTTP_SERVICE_CONFIG_SSL_KEY;
744STRUCT!{struct HTTP_SERVICE_CONFIG_SSL_SNI_KEY {
745    IpPort: SOCKADDR_STORAGE,
746    Host: PWSTR,
747}}
748pub type PHTTP_SERVICE_CONFIG_SSL_SNI_KEY = *mut HTTP_SERVICE_CONFIG_SSL_SNI_KEY;
749STRUCT!{struct HTTP_SERVICE_CONFIG_SSL_CCS_KEY {
750    LocalAddress: SOCKADDR_STORAGE,
751}}
752pub type PHTTP_SERVICE_CONFIG_SSL_CCS_KEY = *mut HTTP_SERVICE_CONFIG_SSL_CCS_KEY;
753STRUCT!{struct HTTP_SERVICE_CONFIG_SSL_PARAM {
754    SslHashLength: ULONG,
755    pSslHash: PVOID,
756    AppId: GUID,
757    pSslCertStoreName: PWSTR,
758    DefaultCertCheckMode: DWORD,
759    DefaultRevocationFreshnessTime: DWORD,
760    DefaultRevocationUrlRetrievalTimeout: DWORD,
761    pDefaultSslCtlIdentifier: PWSTR,
762    pDefaultSslCtlStoreName: PWSTR,
763    DefaultFlags: DWORD,
764}}
765pub type PHTTP_SERVICE_CONFIG_SSL_PARAM = *mut HTTP_SERVICE_CONFIG_SSL_PARAM;
766pub const HTTP_SERVICE_CONFIG_SSL_FLAG_USE_DS_MAPPER: DWORD = 0x00000001;
767pub const HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT: DWORD = 0x00000002;
768pub const HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER: DWORD = 0x00000004;
769STRUCT!{struct HTTP_SERVICE_CONFIG_SSL_SET {
770    KeyDesc: HTTP_SERVICE_CONFIG_SSL_KEY,
771    ParamDesc: HTTP_SERVICE_CONFIG_SSL_PARAM,
772}}
773pub type PHTTP_SERVICE_CONFIG_SSL_SET = *mut HTTP_SERVICE_CONFIG_SSL_SET;
774STRUCT!{struct HTTP_SERVICE_CONFIG_SSL_SNI_SET {
775    KeyDesc: HTTP_SERVICE_CONFIG_SSL_SNI_KEY,
776    ParamDesc: HTTP_SERVICE_CONFIG_SSL_PARAM,
777}}
778pub type PHTTP_SERVICE_CONFIG_SSL_SNI_SET = *mut HTTP_SERVICE_CONFIG_SSL_SNI_SET;
779STRUCT!{struct HTTP_SERVICE_CONFIG_SSL_CCS_SET {
780    KeyDesc: HTTP_SERVICE_CONFIG_SSL_CCS_KEY,
781    ParamDesc: HTTP_SERVICE_CONFIG_SSL_PARAM,
782}}
783pub type PHTTP_SERVICE_CONFIG_SSL_CCS_SET = *mut HTTP_SERVICE_CONFIG_SSL_CCS_SET;
784STRUCT!{struct HTTP_SERVICE_CONFIG_SSL_QUERY {
785    QueryDesc: HTTP_SERVICE_CONFIG_QUERY_TYPE,
786    KeyDesc: HTTP_SERVICE_CONFIG_SSL_KEY,
787    dwToken: DWORD,
788}}
789pub type PHTTP_SERVICE_CONFIG_SSL_QUERY = *mut HTTP_SERVICE_CONFIG_SSL_QUERY;
790STRUCT!{struct HTTP_SERVICE_CONFIG_SSL_SNI_QUERY {
791    QueryDesc: HTTP_SERVICE_CONFIG_QUERY_TYPE,
792    KeyDesc: HTTP_SERVICE_CONFIG_SSL_SNI_KEY,
793    dwToken: DWORD,
794}}
795pub type PHTTP_SERVICE_CONFIG_SSL_SNI_QUERY = *mut HTTP_SERVICE_CONFIG_SSL_SNI_QUERY;
796STRUCT!{struct HTTP_SERVICE_CONFIG_SSL_CCS_QUERY {
797    QueryDesc: HTTP_SERVICE_CONFIG_QUERY_TYPE,
798    KeyDesc: HTTP_SERVICE_CONFIG_SSL_CCS_KEY,
799    dwToken: DWORD,
800}}
801pub type PHTTP_SERVICE_CONFIG_SSL_CCS_QUERY = *mut HTTP_SERVICE_CONFIG_SSL_CCS_QUERY;
802STRUCT!{struct HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM {
803    AddrLength: USHORT,
804    pAddress: PSOCKADDR,
805}}
806pub type PHTTP_SERVICE_CONFIG_IP_LISTEN_PARAM = *mut HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM;
807STRUCT!{struct HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY {
808    AddrCount: ULONG,
809    AddrList: [SOCKADDR_STORAGE; ANYSIZE_ARRAY],
810}}
811pub type PHTTP_SERVICE_CONFIG_IP_LISTEN_QUERY = *mut HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY;
812STRUCT!{struct HTTP_SERVICE_CONFIG_URLACL_KEY {
813    pUrlPrefix: PWSTR,
814}}
815pub type PHTTP_SERVICE_CONFIG_URLACL_KEY = *mut HTTP_SERVICE_CONFIG_URLACL_KEY;
816STRUCT!{struct HTTP_SERVICE_CONFIG_URLACL_PARAM {
817    pStringSecurityDescriptor: PWSTR,
818}}
819pub type PHTTP_SERVICE_CONFIG_URLACL_PARAM = *mut HTTP_SERVICE_CONFIG_URLACL_PARAM;
820STRUCT!{struct HTTP_SERVICE_CONFIG_URLACL_SET {
821    KeyDesc: HTTP_SERVICE_CONFIG_URLACL_KEY,
822    ParamDesc: HTTP_SERVICE_CONFIG_URLACL_PARAM,
823}}
824pub type PHTTP_SERVICE_CONFIG_URLACL_SET = *mut HTTP_SERVICE_CONFIG_URLACL_SET;
825STRUCT!{struct HTTP_SERVICE_CONFIG_URLACL_QUERY {
826    QueryDesc: HTTP_SERVICE_CONFIG_QUERY_TYPE,
827    KeyDesc: HTTP_SERVICE_CONFIG_URLACL_KEY,
828    dwToken: DWORD,
829}}
830pub type PHTTP_SERVICE_CONFIG_URLACL_QUERY = *mut HTTP_SERVICE_CONFIG_URLACL_QUERY;
831ENUM!{enum HTTP_SERVICE_CONFIG_CACHE_KEY {
832    MaxCacheResponseSize = 0,
833    CacheRangeChunkSize,
834}}
835pub type PHTTP_SERVICE_CONFIG_CACHE_KEY = *mut HTTP_SERVICE_CONFIG_CACHE_KEY;
836pub type HTTP_SERVICE_CONFIG_CACHE_PARAM = ULONG;
837pub type PHTTP_SERVICE_CONFIG_CACHE_PARAM = *mut ULONG;
838STRUCT!{struct HTTP_SERVICE_CONFIG_CACHE_SET {
839    KeyDesc: HTTP_SERVICE_CONFIG_CACHE_KEY,
840    ParamDesc: HTTP_SERVICE_CONFIG_CACHE_PARAM,
841}}
842pub type PHTTP_SERVICE_CONFIG_CACHE_SET = *mut HTTP_SERVICE_CONFIG_CACHE_SET;
843pub const HTTP_NULL_ID: ULONGLONG = 0;
844#[inline]
845pub unsafe fn HTTP_IS_NULL_ID(pid: PHTTP_OPAQUE_ID) -> bool {
846    HTTP_NULL_ID == *pid
847}
848#[inline]
849pub unsafe fn HTTP_SET_NULL_ID(pid: PHTTP_OPAQUE_ID) {
850    *pid = HTTP_NULL_ID
851}
852extern "system" {
853    pub fn HttpInitialize(
854        Version: HTTPAPI_VERSION,
855        Flags: ULONG,
856        pReserved: PVOID,
857    ) -> ULONG;
858    pub fn HttpTerminate(
859        Flags: ULONG,
860        pReserved: PVOID,
861    ) -> ULONG;
862    pub fn HttpCreateHttpHandle(
863        pReqQueueHandle: PHANDLE,
864        Reserved: ULONG,
865    ) -> ULONG;
866    pub fn HttpCreateRequestQueue(
867        Version: HTTPAPI_VERSION,
868        pName: PCWSTR,
869        pSecurityAttributes: PSECURITY_ATTRIBUTES,
870        Flags: ULONG,
871        pReqQueueHandle: PHANDLE,
872    ) -> ULONG;
873    pub fn HttpCloseRequestQueue(
874        ReqQueueHandle: HANDLE,
875    ) -> ULONG;
876    pub fn HttpSetRequestQueueProperty(
877        Handle: HANDLE,
878        Property: HTTP_SERVER_PROPERTY,
879        pPropertyInformation: PVOID,
880        PropertyInformationLength: ULONG,
881        Reserved: ULONG,
882        pReserved: PVOID,
883    ) -> ULONG;
884    pub fn HttpQueryRequestQueueProperty(
885        Handle: HANDLE,
886        Property: HTTP_SERVER_PROPERTY,
887        pPropertyInformation: PVOID,
888        PropertyInformationLength: ULONG,
889        Reserved: ULONG,
890        pReturnLength: PULONG,
891        pReserved: PVOID,
892    ) -> ULONG;
893    pub fn HttpShutdownRequestQueue(
894        ReqQueueHandle: HANDLE,
895    ) -> ULONG;
896    pub fn HttpReceiveClientCertificate(
897        ReqQueueHandle: HANDLE,
898        ConnectionId: HTTP_CONNECTION_ID,
899        Flags: ULONG,
900        pSslClientCertInfo: PHTTP_SSL_CLIENT_CERT_INFO,
901        SslClientCertInfoSize: ULONG,
902        pBytesReceived: PULONG,
903        pOverlapped: LPOVERLAPPED,
904    ) -> ULONG;
905    pub fn HttpCreateServerSession(
906        Version: HTTPAPI_VERSION,
907        pServerSessionId: PHTTP_SERVER_SESSION_ID,
908        Reserved: ULONG,
909    ) -> ULONG;
910    pub fn HttpCloseServerSession(
911        ServerSessionId: HTTP_SERVER_SESSION_ID,
912    ) -> ULONG;
913    pub fn HttpQueryServerSessionProperty(
914        ServerSessionId: HTTP_SERVER_SESSION_ID,
915        Property: HTTP_SERVER_PROPERTY,
916        pPropertyInformation: PVOID,
917        PropertyInformationLength: ULONG,
918        pReturnLength: PULONG,
919    ) -> ULONG;
920    pub fn HttpSetServerSessionProperty(
921        ServerSessionId: HTTP_SERVER_SESSION_ID,
922        Property: HTTP_SERVER_PROPERTY,
923        pPropertyInformation: PVOID,
924        PropertyInformationLength: ULONG,
925    ) -> ULONG;
926    pub fn HttpAddUrl(
927        ReqQueueHandle: HANDLE,
928        pFullyQualifiedUrl: PCWSTR,
929        pReserved: PVOID,
930    ) -> ULONG;
931    pub fn HttpRemoveUrl(
932        ReqQueueHandle: HANDLE,
933        pFullyQualifiedUrl: PCWSTR,
934    ) -> ULONG;
935    pub fn HttpCreateUrlGroup(
936        ServerSessionId: HTTP_SERVER_SESSION_ID,
937        pUrlGroupId: PHTTP_URL_GROUP_ID,
938        Reserved: ULONG,
939    ) -> ULONG;
940    pub fn HttpCloseUrlGroup(
941        UrlGroupId: HTTP_URL_GROUP_ID,
942    ) -> ULONG;
943    pub fn HttpAddUrlToUrlGroup(
944        UrlGroupId: HTTP_URL_GROUP_ID,
945        pFullyQualifiedUrl: PCWSTR,
946        UrlContext: HTTP_URL_CONTEXT,
947        Reserved: ULONG,
948    ) -> ULONG;
949    pub fn HttpRemoveUrlFromUrlGroup(
950        UrlGroupId: HTTP_URL_GROUP_ID,
951        pFullyQualifiedUrl: PCWSTR,
952        Flags: ULONG,
953    ) -> ULONG;
954    pub fn HttpSetUrlGroupProperty(
955        UrlGroupId: HTTP_URL_GROUP_ID,
956        Property: HTTP_SERVER_PROPERTY,
957        pPropertyInformation: PVOID,
958        PropertyInformationLength: ULONG,
959    ) -> ULONG;
960    pub fn HttpQueryUrlGroupProperty(
961        UrlGroupId: HTTP_URL_GROUP_ID,
962        Property: HTTP_SERVER_PROPERTY,
963        pPropertyInformation: PVOID,
964        PropertyInformationLength: ULONG,
965        pReturnLength: PULONG,
966    ) -> ULONG;
967    pub fn HttpPrepareUrl(
968        Reserved: PVOID,
969        Flags: ULONG,
970        Url: PCWSTR,
971        PreparedUrl: *mut PWSTR,
972    ) -> ULONG;
973    pub fn HttpReceiveHttpRequest(
974        ReqQueueHandle: HANDLE,
975        RequestId: HTTP_REQUEST_ID,
976        Flags: ULONG,
977        pRequestBuffer: PHTTP_REQUEST,
978        RequestBufferLength: ULONG,
979        pBytesReturned: PULONG,
980        pOverlapped: LPOVERLAPPED,
981    ) -> ULONG;
982    pub fn HttpReceiveRequestEntityBody(
983        ReqQueueHandle: HANDLE,
984        RequestId: HTTP_REQUEST_ID,
985        Flags: ULONG,
986        pBuffer: PVOID,
987        EntityBufferLength: ULONG,
988        pBytesReturned: PULONG,
989        pOverlapped: LPOVERLAPPED,
990    ) -> ULONG;
991    pub fn HttpSendHttpResponse(
992        ReqQueueHandle: HANDLE,
993        RequestId: HTTP_REQUEST_ID,
994        Flags: ULONG,
995        pHttpResponse: PHTTP_RESPONSE,
996        pCachePolicy: PHTTP_CACHE_POLICY,
997        pBytesSent: PULONG,
998        pReserved1: PVOID,
999        Reserved2: ULONG,
1000        pOverlapped: LPOVERLAPPED,
1001        pLogData: PHTTP_LOG_DATA,
1002    ) -> ULONG;
1003    pub fn HttpSendResponseEntityBody(
1004        ReqQueueHandle: HANDLE,
1005        RequestId: HTTP_REQUEST_ID,
1006        Flags: ULONG,
1007        EntityChunkCount: USHORT,
1008        pEntityChunks: PHTTP_DATA_CHUNK,
1009        pBytesSent: PULONG,
1010        pReserved1: PVOID,
1011        Reserved2: ULONG,
1012        pOverlapped: LPOVERLAPPED,
1013        pLogData: PHTTP_LOG_DATA,
1014    ) -> ULONG;
1015    pub fn HttpWaitForDisconnect(
1016        ReqQueueHandle: HANDLE,
1017        ConnectionId: HTTP_CONNECTION_ID,
1018        pOverlapped: LPOVERLAPPED,
1019    ) -> ULONG;
1020    pub fn HttpWaitForDisconnectEx(
1021        ReqQueueHandle: HANDLE,
1022        ConnectionId: HTTP_CONNECTION_ID,
1023        Reserved: ULONG,
1024        pOverlapped: LPOVERLAPPED,
1025    ) -> ULONG;
1026    pub fn HttpCancelHttpRequest(
1027        ReqQueueHandle: HANDLE,
1028        RequestId: HTTP_REQUEST_ID,
1029        pOverlapped: LPOVERLAPPED,
1030    ) -> ULONG;
1031    pub fn HttpWaitForDemandStart(
1032        ReqQueueHandle: HANDLE,
1033        pOverlapped: LPOVERLAPPED,
1034    ) -> ULONG;
1035    pub fn HttpFlushResponseCache(
1036        ReqQueueHandle: HANDLE,
1037        pUrlPrefix: PCWSTR,
1038        Flags: ULONG,
1039        pOverlapped: LPOVERLAPPED,
1040    ) -> ULONG;
1041    pub fn HttpAddFragmentToCache(
1042        ReqQueueHandle: HANDLE,
1043        pUrlPrefix: PCWSTR,
1044        pDataChunk: PHTTP_DATA_CHUNK,
1045        pCachePolicy: PHTTP_CACHE_POLICY,
1046        pOverlapped: LPOVERLAPPED,
1047    ) -> ULONG;
1048    pub fn HttpReadFragmentFromCache(
1049        ReqQueueHandle: HANDLE,
1050        pUrlPrefix: PCWSTR,
1051        pByteRange: PHTTP_BYTE_RANGE,
1052        pBuffer: PVOID,
1053        BufferLength: ULONG,
1054        pBytesRead: PULONG,
1055        pOverlapped: LPOVERLAPPED,
1056    ) -> ULONG;
1057    pub fn HttpSetServiceConfiguration(
1058        ServiceHandle: HANDLE,
1059        ConfigId: HTTP_SERVICE_CONFIG_ID,
1060        pConfigInformation: PVOID,
1061        ConfigInformationLength: ULONG,
1062        pOverlapped: LPOVERLAPPED,
1063    ) -> ULONG;
1064    pub fn HttpDeleteServiceConfiguration(
1065        ServiceHandle: HANDLE,
1066        ConfigId: HTTP_SERVICE_CONFIG_ID,
1067        pConfigInformation: PVOID,
1068        ConfigInformationLength: ULONG,
1069        pOverlapped: LPOVERLAPPED,
1070    ) -> ULONG;
1071    pub fn HttpQueryServiceConfiguration(
1072        ServiceHandle: HANDLE,
1073        ConfigId: HTTP_SERVICE_CONFIG_ID,
1074        pInput: PVOID,
1075        InputLength: ULONG,
1076        pOutput: PVOID,
1077        OutputLength: ULONG,
1078        pReturnLength: PULONG,
1079        pOverlapped: LPOVERLAPPED,
1080    ) -> ULONG;
1081    pub fn HttpDeclarePush(
1082        RequestQueueHandle: HANDLE,
1083        RequestId: HTTP_REQUEST_ID,
1084        Verb: HTTP_VERB,
1085        Path: PCWSTR,
1086        Query: PCSTR,
1087        Headers: PHTTP_REQUEST_HEADERS,
1088    ) -> ULONG;
1089    pub fn HttpUpdateServiceConfiguration(
1090        Handle: HANDLE,
1091        ConfigId: HTTP_SERVICE_CONFIG_ID,
1092        ConfigInfo: PVOID,
1093        ConfigInfoLength: ULONG,
1094        Overlapped: LPOVERLAPPED,
1095    ) -> ULONG;
1096}