1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifndef __HTTP_H__
7 #define __HTTP_H__
8 
9 #include <winsock2.h>
10 #include <ws2tcpip.h>
11 
12 #define SECURITY_WIN32
13 #include <sspi.h>
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 #define HTTP_INITIALIZE_SERVER 0x00000001
20 #define HTTP_INITIALIZE_CONFIG 0x00000002
21 
22 #define HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY 0x00000001
23 #define HTTP_RECEIVE_REQUEST_ENTITY_BODY_FLAG_FILL_BUFFER 0x00000001
24 
25 #define HTTP_SEND_RESPONSE_FLAG_DISCONNECT 0x00000001
26 #define HTTP_SEND_RESPONSE_FLAG_MORE_DATA 0x00000002
27 #define HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA 0x00000004
28 
29 #define HTTP_FLUSH_RESPONSE_FLAG_RECURSIVE 0x00000001
30 
31   typedef ULONGLONG HTTP_OPAQUE_ID,*PHTTP_OPAQUE_ID;
32 
33   typedef HTTP_OPAQUE_ID HTTP_REQUEST_ID,*PHTTP_REQUEST_ID;
34   typedef HTTP_OPAQUE_ID HTTP_CONNECTION_ID,*PHTTP_CONNECTION_ID;
35   typedef HTTP_OPAQUE_ID HTTP_RAW_CONNECTION_ID,*PHTTP_RAW_CONNECTION_ID;
36   typedef HTTP_OPAQUE_ID HTTP_URL_GROUP_ID, *PHTTP_URL_GROUP_ID;
37   typedef HTTP_OPAQUE_ID HTTP_SERVER_SESSION_ID, *PHTTP_SERVER_SESSION_ID;
38 
39 #define HTTP_NULL_ID (0ull)
40 #define HTTP_IS_NULL_ID(pid) (HTTP_NULL_ID==*(pid))
41 #define HTTP_SET_NULL_ID(pid) (*(pid) = HTTP_NULL_ID)
42 
43 #define HTTP_BYTE_RANGE_TO_EOF ((ULONGLONG)-1)
44 
45   typedef struct _HTTP_BYTE_RANGE {
46     ULARGE_INTEGER StartingOffset;
47     ULARGE_INTEGER Length;
48   } HTTP_BYTE_RANGE,*PHTTP_BYTE_RANGE;
49 
50   typedef struct _HTTP_VERSION {
51     USHORT MajorVersion;
52     USHORT MinorVersion;
53   } HTTP_VERSION,*PHTTP_VERSION;
54 
55 #define HTTP_VERSION_UNKNOWN { 0,0 }
56 #define HTTP_VERSION_0_9 { 0,9 }
57 #define HTTP_VERSION_1_0 { 1,0 }
58 #define HTTP_VERSION_1_1 { 1,1 }
59 
60 #define HTTP_SET_VERSION(version,major,minor) do { (version).MajorVersion = (major); (version).MinorVersion = (minor); } while (0,0)
61 #define HTTP_EQUAL_VERSION(version,major,minor) ((version).MajorVersion==(major) && (version).MinorVersion==(minor))
62 #define HTTP_GREATER_VERSION(version,major,minor) ((version).MajorVersion > (major) || ((version).MajorVersion==(major) && (version).MinorVersion > (minor)))
63 #define HTTP_LESS_VERSION(version,major,minor) ((version).MajorVersion < (major) || ((version).MajorVersion==(major) && (version).MinorVersion < (minor)))
64 #define HTTP_NOT_EQUAL_VERSION(version,major,minor) (!HTTP_EQUAL_VERSION(version,major,minor))
65 #define HTTP_GREATER_EQUAL_VERSION(version,major,minor) (!HTTP_LESS_VERSION(version,major,minor))
66 #define HTTP_LESS_EQUAL_VERSION(version,major,minor) (!HTTP_GREATER_VERSION(version,major,minor))
67 
68   typedef enum _HTTP_VERB {
69     HttpVerbUnparsed = 0,
70     HttpVerbUnknown,HttpVerbInvalid,HttpVerbOPTIONS,HttpVerbGET,HttpVerbHEAD,HttpVerbPOST,HttpVerbPUT,HttpVerbDELETE,
71     HttpVerbTRACE,HttpVerbCONNECT,HttpVerbTRACK,HttpVerbMOVE,HttpVerbCOPY,HttpVerbPROPFIND,HttpVerbPROPPATCH,HttpVerbMKCOL,HttpVerbLOCK,
72     HttpVerbUNLOCK,HttpVerbSEARCH,HttpVerbMaximum
73   } HTTP_VERB,*PHTTP_VERB;
74 
75   typedef enum _HTTP_HEADER_ID {
76     HttpHeaderCacheControl = 0,HttpHeaderConnection = 1,HttpHeaderDate = 2,HttpHeaderKeepAlive = 3,HttpHeaderPragma = 4,HttpHeaderTrailer = 5,
77     HttpHeaderTransferEncoding = 6,HttpHeaderUpgrade = 7,HttpHeaderVia = 8,HttpHeaderWarning = 9,HttpHeaderAllow = 10,HttpHeaderContentLength = 11,
78     HttpHeaderContentType = 12,HttpHeaderContentEncoding = 13,HttpHeaderContentLanguage = 14,HttpHeaderContentLocation = 15,HttpHeaderContentMd5 = 16,
79     HttpHeaderContentRange = 17,HttpHeaderExpires = 18,HttpHeaderLastModified = 19,HttpHeaderAccept = 20,HttpHeaderAcceptCharset = 21,
80     HttpHeaderAcceptEncoding = 22,HttpHeaderAcceptLanguage = 23,HttpHeaderAuthorization = 24,HttpHeaderCookie = 25,HttpHeaderExpect = 26,
81     HttpHeaderFrom = 27,HttpHeaderHost = 28,HttpHeaderIfMatch = 29,HttpHeaderIfModifiedSince = 30,HttpHeaderIfNoneMatch = 31,HttpHeaderIfRange = 32,
82     HttpHeaderIfUnmodifiedSince = 33,HttpHeaderMaxForwards = 34,HttpHeaderProxyAuthorization = 35,HttpHeaderReferer = 36,HttpHeaderRange = 37,
83     HttpHeaderTe = 38,HttpHeaderTranslate = 39,HttpHeaderUserAgent = 40,HttpHeaderRequestMaximum = 41,HttpHeaderAcceptRanges = 20,HttpHeaderAge = 21,
84     HttpHeaderEtag = 22,HttpHeaderLocation = 23,HttpHeaderProxyAuthenticate = 24,HttpHeaderRetryAfter = 25,HttpHeaderServer = 26,
85     HttpHeaderSetCookie = 27,HttpHeaderVary = 28,HttpHeaderWwwAuthenticate = 29,HttpHeaderResponseMaximum = 30,HttpHeaderMaximum = 41
86   } HTTP_HEADER_ID,*PHTTP_HEADER_ID;
87 
88   typedef struct _HTTP_KNOWN_HEADER {
89     USHORT RawValueLength;
90     PCSTR pRawValue;
91   } HTTP_KNOWN_HEADER,*PHTTP_KNOWN_HEADER;
92 
93   typedef struct _HTTP_UNKNOWN_HEADER {
94     USHORT NameLength;
95     USHORT RawValueLength;
96     PCSTR pName;
97     PCSTR pRawValue;
98   } HTTP_UNKNOWN_HEADER,*PHTTP_UNKNOWN_HEADER;
99 
100   typedef enum _HTTP_DATA_CHUNK_TYPE {
101     HttpDataChunkFromMemory = 0,
102     HttpDataChunkFromFileHandle,
103     HttpDataChunkFromFragmentCache,
104     HttpDataChunkFromFragmentCacheEx,
105     HttpDataChunkMaximum
106   } HTTP_DATA_CHUNK_TYPE,*PHTTP_DATA_CHUNK_TYPE;
107 
108   typedef struct _HTTP_DATA_CHUNK {
109     HTTP_DATA_CHUNK_TYPE DataChunkType;
110     __C89_NAMELESS union {
111       struct {
112 	PVOID pBuffer;
113 	ULONG BufferLength;
114       } FromMemory;
115       struct {
116 	HTTP_BYTE_RANGE ByteRange;
117 	HANDLE FileHandle;
118       } FromFileHandle;
119       struct {
120 	USHORT FragmentNameLength;
121 	PCWSTR pFragmentName;
122       } FromFragmentCache;
123     };
124   } HTTP_DATA_CHUNK,*PHTTP_DATA_CHUNK;
125 
126   typedef struct _HTTP_REQUEST_HEADERS {
127     USHORT UnknownHeaderCount;
128     PHTTP_UNKNOWN_HEADER pUnknownHeaders;
129     USHORT TrailerCount;
130     PHTTP_UNKNOWN_HEADER pTrailers;
131     HTTP_KNOWN_HEADER KnownHeaders[HttpHeaderRequestMaximum];
132   } HTTP_REQUEST_HEADERS,*PHTTP_REQUEST_HEADERS;
133 
134   typedef struct _HTTP_RESPONSE_HEADERS {
135     USHORT UnknownHeaderCount;
136     PHTTP_UNKNOWN_HEADER pUnknownHeaders;
137     USHORT TrailerCount;
138     PHTTP_UNKNOWN_HEADER pTrailers;
139     HTTP_KNOWN_HEADER KnownHeaders[HttpHeaderResponseMaximum];
140   } HTTP_RESPONSE_HEADERS,*PHTTP_RESPONSE_HEADERS;
141 
142   typedef struct _HTTP_TRANSPORT_ADDRESS {
143     PSOCKADDR pRemoteAddress;
144     PSOCKADDR pLocalAddress;
145   } HTTP_TRANSPORT_ADDRESS,*PHTTP_TRANSPORT_ADDRESS;
146 
147   typedef struct _HTTP_COOKED_URL {
148     USHORT FullUrlLength;
149     USHORT HostLength;
150     USHORT AbsPathLength;
151     USHORT QueryStringLength;
152     PCWSTR pFullUrl;
153     PCWSTR pHost;
154     PCWSTR pAbsPath;
155     PCWSTR pQueryString;
156   } HTTP_COOKED_URL,*PHTTP_COOKED_URL;
157 
158   typedef ULONGLONG HTTP_URL_CONTEXT;
159 
160   typedef struct _HTTP_SSL_CLIENT_CERT_INFO {
161     ULONG CertFlags;
162     ULONG CertEncodedSize;
163     PUCHAR pCertEncoded;
164     HANDLE Token;
165     BOOLEAN CertDeniedByMapper;
166   } HTTP_SSL_CLIENT_CERT_INFO,*PHTTP_SSL_CLIENT_CERT_INFO;
167 
168   typedef struct _HTTP_SSL_INFO {
169     USHORT ServerCertKeySize;
170     USHORT ConnectionKeySize;
171     ULONG ServerCertIssuerSize;
172     ULONG ServerCertSubjectSize;
173     PCSTR pServerCertIssuer;
174     PCSTR pServerCertSubject;
175     PHTTP_SSL_CLIENT_CERT_INFO pClientCertInfo;
176     ULONG SslClientCertNegotiated;
177   } HTTP_SSL_INFO,*PHTTP_SSL_INFO;
178 
179   typedef struct _HTTP_REQUEST_V1 {
180     ULONG Flags;
181     HTTP_CONNECTION_ID ConnectionId;
182     HTTP_REQUEST_ID RequestId;
183     HTTP_URL_CONTEXT UrlContext;
184     HTTP_VERSION Version;
185     HTTP_VERB Verb;
186     USHORT UnknownVerbLength;
187     USHORT RawUrlLength;
188     PCSTR pUnknownVerb;
189     PCSTR pRawUrl;
190     HTTP_COOKED_URL CookedUrl;
191     HTTP_TRANSPORT_ADDRESS Address;
192     HTTP_REQUEST_HEADERS Headers;
193     ULONGLONG BytesReceived;
194     USHORT EntityChunkCount;
195     PHTTP_DATA_CHUNK pEntityChunks;
196     HTTP_RAW_CONNECTION_ID RawConnectionId;
197     PHTTP_SSL_INFO pSslInfo;
198   } HTTP_REQUEST_V1, *PHTTP_REQUEST_V1;
199 
200   typedef enum _HTTP_REQUEST_INFO_TYPE {
201     HttpRequestInfoTypeAuth = 0
202   } HTTP_REQUEST_INFO_TYPE, *PHTTP_REQUEST_INFO_TYPE;
203 
204   typedef struct _HTTP_REQUEST_INFO {
205     HTTP_REQUEST_INFO_TYPE InfoType;
206     ULONG                  InfoLength;
207     PVOID                  pInfo;
208   } HTTP_REQUEST_INFO, *PHTTP_REQUEST_INFO;
209 
210 #ifdef __cplusplus
211   typedef struct _HTTP_REQUEST_V2 : HTTP_REQUEST_V1 {
212     USHORT             RequestInfoCount;
213     PHTTP_REQUEST_INFO pRequestInfo;
214   } HTTP_REQUEST_V2, *PHTTP_REQUEST_V2;
215 #else
216   typedef struct _HTTP_REQUEST_V2 {
217     /* struct HTTP_REQUEST_V1; */
218     __C89_NAMELESS struct {
219     ULONG Flags;
220     HTTP_CONNECTION_ID ConnectionId;
221     HTTP_REQUEST_ID RequestId;
222     HTTP_URL_CONTEXT UrlContext;
223     HTTP_VERSION Version;
224     HTTP_VERB Verb;
225     USHORT UnknownVerbLength;
226     USHORT RawUrlLength;
227     PCSTR pUnknownVerb;
228     PCSTR pRawUrl;
229     HTTP_COOKED_URL CookedUrl;
230     HTTP_TRANSPORT_ADDRESS Address;
231     HTTP_REQUEST_HEADERS Headers;
232     ULONGLONG BytesReceived;
233     USHORT EntityChunkCount;
234     PHTTP_DATA_CHUNK pEntityChunks;
235     HTTP_RAW_CONNECTION_ID RawConnectionId;
236     PHTTP_SSL_INFO pSslInfo;
237     };
238     USHORT             RequestInfoCount;
239     PHTTP_REQUEST_INFO pRequestInfo;
240   } HTTP_REQUEST_V2, *PHTTP_REQUEST_V2;
241 #endif
242 
243 #if (_WIN32_WINNT >= 0x0600)
244   typedef HTTP_REQUEST_V2 HTTP_REQUEST, *PHTTP_REQUEST;
245 #else
246   typedef HTTP_REQUEST_V1 HTTP_REQUEST, *PHTTP_REQUEST;
247 #endif
248 
249 #define HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS 0x00000001
250 
251   typedef struct _HTTP_RESPONSE_V1 {
252     ULONG Flags;
253     HTTP_VERSION Version;
254     USHORT StatusCode;
255     USHORT ReasonLength;
256     PCSTR pReason;
257     HTTP_RESPONSE_HEADERS Headers;
258     USHORT EntityChunkCount;
259     PHTTP_DATA_CHUNK pEntityChunks;
260   } HTTP_RESPONSE_V1,*PHTTP_RESPONSE_V1;
261 
262   typedef enum _HTTP_RESPONSE_INFO_TYPE {
263     HttpResponseInfoTypeMultipleKnownHeaders = 0,
264     HttpResponseInfoTypeAuthenticationProperty,
265     HttpResponseInfoTypeQosProperty,
266     HttpResponseInfoTypeChannelBind
267   } HTTP_RESPONSE_INFO_TYPE, *PHTTP_RESPONSE_INFO_TYPE;
268 
269   typedef struct _HTTP_RESPONSE_INFO {
270     HTTP_RESPONSE_INFO_TYPE Type;
271     ULONG                   Length;
272     PVOID                   pInfo;
273   } HTTP_RESPONSE_INFO, *PHTTP_RESPONSE_INFO;
274 
275 #ifdef __cplusplus
276   typedef struct _HTTP_RESPONSE_V2 : HTTP_RESPONSE_V1 {
277     USHORT              ResponseInfoCount;
278     PHTTP_RESPONSE_INFO pResponseInfo;
279   } HTTP_RESPONSE_V2, *PHTTP_RESPONSE_V2;
280 #else
281   typedef struct _HTTP_RESPONSE_V2 {
282     /* struct HTTP_RESPONSE_V1; */
283     __C89_NAMELESS struct {
284     ULONG Flags;
285     HTTP_VERSION Version;
286     USHORT StatusCode;
287     USHORT ReasonLength;
288     PCSTR pReason;
289     HTTP_RESPONSE_HEADERS Headers;
290     USHORT EntityChunkCount;
291     PHTTP_DATA_CHUNK pEntityChunks;
292     };
293     USHORT              ResponseInfoCount;
294     PHTTP_RESPONSE_INFO pResponseInfo;
295   } HTTP_RESPONSE_V2, *PHTTP_RESPONSE_V2;
296 #endif
297 
298 #if (_WIN32_WINNT >= 0x0600)
299   typedef HTTP_RESPONSE_V2 HTTP_RESPONSE, *PHTTP_RESPONSE;
300 #else
301   typedef HTTP_RESPONSE_V1 HTTP_RESPONSE, *PHTTP_RESPONSE;
302 #endif /* _WIN32_WINNT >= 0x0600 */
303 
304   typedef enum _HTTP_CACHE_POLICY_TYPE {
305     HttpCachePolicyNocache = 0,
306     HttpCachePolicyUserInvalidates,
307     HttpCachePolicyTimeToLive,
308     HttpCachePolicyMaximum
309   } HTTP_CACHE_POLICY_TYPE,*PHTTP_CACHE_POLICY_TYPE;
310 
311   typedef struct _HTTP_CACHE_POLICY {
312     HTTP_CACHE_POLICY_TYPE Policy;
313     ULONG SecondsToLive;
314   } HTTP_CACHE_POLICY, *PHTTP_CACHE_POLICY;
315 
316   typedef enum _HTTP_SERVICE_CONFIG_ID {
317     HttpServiceConfigIPListenList = 0,
318     HttpServiceConfigSSLCertInfo,
319     HttpServiceConfigUrlAclInfo,
320     HttpServiceConfigMax
321   } HTTP_SERVICE_CONFIG_ID, *PHTTP_SERVICE_CONFIG_ID;
322 
323   typedef enum _HTTP_SERVICE_CONFIG_QUERY_TYPE {
324     HttpServiceConfigQueryExact = 0,
325     HttpServiceConfigQueryNext,
326     HttpServiceConfigQueryMax
327   } HTTP_SERVICE_CONFIG_QUERY_TYPE,*PHTTP_SERVICE_CONFIG_QUERY_TYPE;
328 
329   typedef struct _HTTP_SERVICE_CONFIG_SSL_KEY {
330     PSOCKADDR pIpPort;
331   } HTTP_SERVICE_CONFIG_SSL_KEY,*PHTTP_SERVICE_CONFIG_SSL_KEY;
332 
333   typedef struct _HTTP_SERVICE_CONFIG_SSL_PARAM {
334     ULONG SslHashLength;
335     PVOID pSslHash;
336     GUID AppId;
337     PWSTR pSslCertStoreName;
338     DWORD DefaultCertCheckMode;
339     DWORD DefaultRevocationFreshnessTime;
340     DWORD DefaultRevocationUrlRetrievalTimeout;
341     PWSTR pDefaultSslCtlIdentifier;
342     PWSTR pDefaultSslCtlStoreName;
343     DWORD DefaultFlags;
344   } HTTP_SERVICE_CONFIG_SSL_PARAM,*PHTTP_SERVICE_CONFIG_SSL_PARAM;
345 
346 #define HTTP_SERVICE_CONFIG_SSL_FLAG_USE_DS_MAPPER 0x00000001
347 #define HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT 0x00000002
348 #define HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER 0x00000004
349 
350   typedef struct _HTTP_SERVICE_CONFIG_SSL_SET {
351     HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc;
352     HTTP_SERVICE_CONFIG_SSL_PARAM ParamDesc;
353   } HTTP_SERVICE_CONFIG_SSL_SET,*PHTTP_SERVICE_CONFIG_SSL_SET;
354 
355   typedef struct _HTTP_SERVICE_CONFIG_SSL_QUERY {
356     HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc;
357     HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc;
358     DWORD dwToken;
359   } HTTP_SERVICE_CONFIG_SSL_QUERY,*PHTTP_SERVICE_CONFIG_SSL_QUERY;
360 
361   typedef struct _HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM {
362     USHORT AddrLength;
363     PSOCKADDR pAddress;
364   } HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM,*PHTTP_SERVICE_CONFIG_IP_LISTEN_PARAM;
365 
366   typedef struct _HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY {
367     ULONG AddrCount;
368     SOCKADDR_STORAGE AddrList[ANYSIZE_ARRAY];
369   } HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY,*PHTTP_SERVICE_CONFIG_IP_LISTEN_QUERY;
370 
371   typedef struct _HTTP_SERVICE_CONFIG_URLACL_KEY {
372     PWSTR pUrlPrefix;
373   } HTTP_SERVICE_CONFIG_URLACL_KEY,*PHTTP_SERVICE_CONFIG_URLACL_KEY;
374 
375   typedef struct _HTTP_SERVICE_CONFIG_URLACL_PARAM {
376     PWSTR pStringSecurityDescriptor;
377   } HTTP_SERVICE_CONFIG_URLACL_PARAM,*PHTTP_SERVICE_CONFIG_URLACL_PARAM;
378 
379   typedef struct _HTTP_SERVICE_CONFIG_URLACL_SET {
380     HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc;
381     HTTP_SERVICE_CONFIG_URLACL_PARAM ParamDesc;
382   } HTTP_SERVICE_CONFIG_URLACL_SET,*PHTTP_SERVICE_CONFIG_URLACL_SET;
383 
384   typedef struct _HTTP_SERVICE_CONFIG_URLACL_QUERY {
385     HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc;
386     HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc;
387     DWORD dwToken;
388   } HTTP_SERVICE_CONFIG_URLACL_QUERY,*PHTTP_SERVICE_CONFIG_URLACL_QUERY;
389 
390 #if !defined(HTTPAPI_LINKAGE)
391 #ifdef HTTPAPI_LINKAGE_EXPORT
392 #define DECLSPEC_EXPORT __declspec(dllexport)
393 #define HTTPAPI_LINKAGE DECLSPEC_EXPORT
394 #else
395 #define HTTPAPI_LINKAGE DECLSPEC_IMPORT
396 #endif
397 #endif
398 
399   typedef struct _HTTPAPI_VERSION {
400     USHORT HttpApiMajorVersion;
401     USHORT HttpApiMinorVersion;
402   } HTTPAPI_VERSION,*PHTTPAPI_VERSION;
403 
404 #define HTTPAPI_VERSION_1 {1,0}
405 
406   HTTPAPI_LINKAGE ULONG WINAPI HttpInitialize(HTTPAPI_VERSION Version,ULONG Flags,PVOID pReserved);
407   HTTPAPI_LINKAGE ULONG WINAPI HttpTerminate(ULONG Flags,PVOID pReserved);
408   HTTPAPI_LINKAGE ULONG WINAPI HttpCreateHttpHandle(PHANDLE pReqQueueHandle,ULONG Options);
409   HTTPAPI_LINKAGE ULONG WINAPI HttpReceiveClientCertificate(HANDLE ReqQueueHandle,HTTP_CONNECTION_ID ConnectionId,ULONG Flags,PHTTP_SSL_CLIENT_CERT_INFO pSslClientCertInfo,ULONG SslClientCertInfoSize,PULONG pBytesReceived,LPOVERLAPPED pOverlapped);
410   HTTPAPI_LINKAGE ULONG WINAPI HttpAddUrl(HANDLE ReqQueueHandle,PCWSTR pUrlPrefix,PVOID pReserved);
411   HTTPAPI_LINKAGE ULONG WINAPI HttpRemoveUrl(HANDLE ReqQueueHandle,PCWSTR pUrlPrefix);
412   HTTPAPI_LINKAGE ULONG WINAPI HttpReceiveHttpRequest(HANDLE ReqQueueHandle,HTTP_REQUEST_ID RequestId,ULONG Flags,PHTTP_REQUEST pRequestBuffer,ULONG RequestBufferLength,PULONG pBytesReceived,LPOVERLAPPED pOverlapped);
413   HTTPAPI_LINKAGE ULONG WINAPI HttpReceiveRequestEntityBody(HANDLE ReqQueueHandle,HTTP_REQUEST_ID RequestId,ULONG Flags,PVOID pBuffer,ULONG BufferLength,PULONG pBytesReceived,LPOVERLAPPED pOverlapped);
414   HTTPAPI_LINKAGE ULONG WINAPI HttpSendHttpResponse(HANDLE ReqQueueHandle,HTTP_REQUEST_ID RequestId,ULONG Flags,PHTTP_RESPONSE pHttpResponse,PVOID pReserved1,PULONG pBytesSent,PVOID pReserved2,ULONG Reserved3,LPOVERLAPPED pOverlapped,PVOID pReserved4);
415   HTTPAPI_LINKAGE ULONG WINAPI HttpSendResponseEntityBody(HANDLE ReqQueueHandle,HTTP_REQUEST_ID RequestId,ULONG Flags,USHORT EntityChunkCount,PHTTP_DATA_CHUNK pEntityChunks,PULONG pBytesSent,PVOID pReserved1,ULONG Reserved2,LPOVERLAPPED pOverlapped,PVOID pReserved3);
416   HTTPAPI_LINKAGE ULONG WINAPI HttpWaitForDisconnect(HANDLE ReqQueueHandle,HTTP_CONNECTION_ID ConnectionId,LPOVERLAPPED pOverlapped);
417   HTTPAPI_LINKAGE ULONG WINAPI HttpFlushResponseCache(HANDLE ReqQueueHandle,PCWSTR pUrlPrefix,ULONG Flags,LPOVERLAPPED pOverlapped);
418   HTTPAPI_LINKAGE ULONG WINAPI HttpAddFragmentToCache(HANDLE ReqQueueHandle,PCWSTR pUrlPrefix,PHTTP_DATA_CHUNK pDataChunk,PHTTP_CACHE_POLICY pCachePolicy,LPOVERLAPPED pOverlapped);
419   HTTPAPI_LINKAGE ULONG WINAPI HttpReadFragmentFromCache(HANDLE ReqQueueHandle,PCWSTR pUrlPrefix,PHTTP_BYTE_RANGE pByteRange,PVOID pBuffer,ULONG BufferLength,PULONG pBytesRead,LPOVERLAPPED pOverlapped);
420   HTTPAPI_LINKAGE ULONG WINAPI HttpSetServiceConfiguration(HANDLE ServiceHandle,HTTP_SERVICE_CONFIG_ID ConfigId,PVOID pConfigInformation,ULONG ConfigInformationLength,LPOVERLAPPED pOverlapped);
421   HTTPAPI_LINKAGE ULONG WINAPI HttpDeleteServiceConfiguration(HANDLE ServiceHandle,HTTP_SERVICE_CONFIG_ID ConfigId,PVOID pConfigInformation,ULONG ConfigInformationLength,LPOVERLAPPED pOverlapped);
422   HTTPAPI_LINKAGE ULONG WINAPI HttpQueryServiceConfiguration(HANDLE ServiceHandle,HTTP_SERVICE_CONFIG_ID ConfigId,PVOID pInputConfigInformation,ULONG InputConfigInformationLength,PVOID pOutputConfigInformation,ULONG OutputConfigInformationLength,PULONG pReturnLength,LPOVERLAPPED pOverlapped);
423 
424 #if (_WIN32_WINNT >= 0x0600)
425 #define HTTP_VERSION_2_0	{ 2, 0 }
426 #define HTTPAPI_VERSION_2	{ 2, 0 }
427 
428   typedef enum _HTTP_503_RESPONSE_VERBOSITY {
429     Http503ResponseVerbosityBasic = 0,
430     Http503ResponseVerbosityLimited,
431     Http503ResponseVerbosityFull
432   } HTTP_503_RESPONSE_VERBOSITY, *PHTTP_503_RESPONSE_VERBOSITY;
433 
434   typedef enum _HTTP_ENABLED_STATE {
435     HttpEnabledStateActive = 0,
436     HttpEnabledStateInactive
437   } HTTP_ENABLED_STATE, *PHTTP_ENABLED_STATE;
438 
439   typedef enum _HTTP_LOGGING_ROLLOVER_TYPE {
440     HttpLoggingRolloverSize = 0,
441     HttpLoggingRolloverDaily,
442     HttpLoggingRolloverWeekly,
443     HttpLoggingRolloverMonthly,
444     HttpLoggingRolloverHourly
445   } HTTP_LOGGING_ROLLOVER_TYPE, *PHTTP_LOGGING_ROLLOVER_TYPE;
446 
447   typedef enum _HTTP_LOGGING_TYPE {
448     HttpLoggingTypeW3C = 0,
449     HttpLoggingTypeIIS,
450     HttpLoggingTypeNCSA,
451     HttpLoggingTypeRaw
452   } HTTP_LOGGING_TYPE, *PHTTP_LOGGING_TYPE;
453 
454   typedef enum _HTTP_QOS_SETTING_TYPE {
455     HttpQosSettingTypeBandwidth = 0,
456     HttpQosSettingTypeConnectionLimit,
457     HttpQosSettingTypeFlowRate
458   } HTTP_QOS_SETTING_TYPE, *PHTTP_QOS_SETTING_TYPE;
459 
460   typedef enum _HTTP_SERVER_PROPERTY {
461     HttpServerAuthenticationProperty = 0,
462     HttpServerLoggingProperty,
463     HttpServerQosProperty,
464     HttpServerTimeoutsProperty,
465     HttpServerQueueLengthProperty,
466     HttpServerStateProperty,
467     HttpServer503VerbosityProperty,
468     HttpServerBindingProperty,
469     HttpServerExtendedAuthenticationProperty,
470     HttpServerListenEndpointProperty,
471     HttpServerChannelBindProperty
472   } HTTP_SERVER_PROPERTY, *PHTTP_SERVER_PROPERTY;
473 
474   typedef enum _HTTP_AUTHENTICATION_HARDENING_LEVELS {
475     HttpAuthenticationHardeningLegacy   = 0,
476     HttpAuthenticationHardeningMedium   = 1,
477     HttpAuthenticationHardeningStrict   = 2
478   } HTTP_AUTHENTICATION_HARDENING_LEVELS;
479 
480   typedef enum _HTTP_SERVICE_BINDING_TYPE {
481     HttpServiceBindingTypeNone   = 0,
482     HttpServiceBindingTypeW      = 1,
483     HttpServiceBindingTypeA      = 2
484   } HTTP_SERVICE_BINDING_TYPE;
485 
486   typedef enum _HTTP_LOG_DATA_TYPE {
487     HttpLogDataTypeFields   = 0
488   } HTTP_LOG_DATA_TYPE, *PHTTP_LOG_DATA_TYPE;
489 
490   typedef struct _HTTP_LOG_DATA {
491     HTTP_LOG_DATA_TYPE Type;
492   } HTTP_LOG_DATA, *PHTTP_LOG_DATA;
493 
494   typedef enum _HTTP_REQUEST_AUTH_TYPE {
495     HttpRequestAuthTypeNone = 0,
496     HttpRequestAuthTypeBasic,
497     HttpRequestAuthTypeDigest,
498     HttpRequestAuthTypeNTLM,
499     HttpRequestAuthTypeNegotiate,
500     HttpRequestAuthTypeKerberos
501   } HTTP_REQUEST_AUTH_TYPE, *PHTTP_REQUEST_AUTH_TYPE;
502 
503   typedef enum _HTTP_AUTH_STATUS {
504     HttpAuthStatusSuccess = 0,
505     HttpAuthStatusNotAuthenticated,
506     HttpAuthStatusFailure
507   } HTTP_AUTH_STATUS, *PHTTP_AUTH_STATUS;
508 
509   typedef enum _HTTP_SERVICE_CONFIG_TIMEOUT_KEY {
510     IdleConnectionTimeout = 0,
511     HeaderWaitTimeout
512   } HTTP_SERVICE_CONFIG_TIMEOUT_KEY, *PHTTP_SERVICE_CONFIG_TIMEOUT_KEY;
513 
514   typedef USHORT HTTP_SERVICE_CONFIG_TIMEOUT_PARAM, *PHTTP_SERVICE_CONFIG_TIMEOUT_PARAM;
515 
516   typedef struct _HTTP_PROPERTY_FLAGS {
517     ULONG Present:1;
518   } HTTP_PROPERTY_FLAGS, *PHTTP_PROPERTY_FLAGS;
519 
520   typedef struct _HTTP_CONNECTION_LIMIT_INFO {
521     HTTP_PROPERTY_FLAGS Flags;
522     ULONG               MaxConnections;
523   } HTTP_CONNECTION_LIMIT_INFO, *PHTTP_CONNECTION_LIMIT_INFO;
524 
525   typedef struct _HTTP_STATE_INFO {
526     HTTP_PROPERTY_FLAGS Flags;
527     HTTP_ENABLED_STATE  State;
528   } HTTP_STATE_INFO, *PHTTP_STATE_INFO;
529 
530   typedef struct _HTTP_QOS_SETTING_INFO {
531     HTTP_QOS_SETTING_TYPE  QosType;
532     PVOID               QosSetting;
533   } HTTP_QOS_SETTING_INFO, *PHTTP_QOS_SETTING_INFO;
534 
535   typedef struct _HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS {
536     USHORT DomainNameLength;
537     PWSTR  DomainName;
538     USHORT RealmLength;
539     PWSTR  Realm;
540   } HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS, *PHTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS;
541 
542   typedef struct _HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS {
543     USHORT RealmLength;
544     PWSTR  Realm;
545   } HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS, *PHTTP_SERVER_AUTHENTICATION_BASIC_PARAMS;
546 
547   typedef struct _HTTP_SERVER_AUTHENTICATION_INFO {
548     HTTP_PROPERTY_FLAGS                      Flags;
549     ULONG                                    AuthSchemes;
550     BOOLEAN                                  ReceiveMutualAuth;
551     BOOLEAN                                  ReceiveContextHandle;
552     BOOLEAN                                  DisableNTLMCredentialCaching;
553     UCHAR                                    ExFlags;
554     HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS DigestParams;
555     HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS  BasicParams;
556   } HTTP_SERVER_AUTHENTICATION_INFO, *PHTTP_SERVER_AUTHENTICATION_INFO;
557 
558   typedef struct _HTTP_LOGGING_INFO {
559     HTTP_PROPERTY_FLAGS        Flags;
560     ULONG                      LoggingFlags;
561     PCWSTR                     SoftwareName;
562     USHORT                     SoftwareNameLength;
563     USHORT                     DirectoryNameLength;
564     PCWSTR                     DirectoryName;
565     HTTP_LOGGING_TYPE          Format;
566     ULONG                      Fields;
567     PVOID                      pExtFields;
568     USHORT                     NumOfExtFields;
569     USHORT                     MaxRecordSize;
570     HTTP_LOGGING_ROLLOVER_TYPE RolloverType;
571     ULONG                      RolloverSize;
572     PSECURITY_DESCRIPTOR       pSecurityDescriptor;
573   } HTTP_LOGGING_INFO, *PHTTP_LOGGING_INFO;
574 
575   typedef struct _HTTP_TIMEOUT_LIMIT_INFO {
576     HTTP_PROPERTY_FLAGS Flags;
577     USHORT              EntityBody;
578     USHORT              DrainEntityBody;
579     USHORT              RequestQueue;
580     USHORT              IdleConnection;
581     USHORT              HeaderWait;
582     ULONG               MinSendRate;
583   } HTTP_TIMEOUT_LIMIT_INFO, *PHTTP_TIMEOUT_LIMIT_INFO;
584 
585   typedef struct _HTTP_SERVICE_BINDING_BASE {
586     HTTP_SERVICE_BINDING_TYPE Type;
587   } HTTP_SERVICE_BINDING_BASE, *PHTTP_SERVICE_BINDING_BASE;
588 
589   typedef struct _HTTP_CHANNEL_BIND_INFO {
590     HTTP_AUTHENTICATION_HARDENING_LEVELS Hardening;
591     ULONG                                Flags;
592     PHTTP_SERVICE_BINDING_BASE           *ServiceNames;
593     ULONG                                NumberOfServiceNames;
594   } HTTP_CHANNEL_BIND_INFO, *PHTTP_CHANNEL_BIND_INFO;
595 
596   typedef struct _HTTP_REQUEST_CHANNEL_BIND_STATUS {
597     PHTTP_SERVICE_BINDING_BASE ServiceName;
598     PUCHAR                     ChannelToken;
599     ULONG                      ChannelTokenSize;
600     ULONG                      Flags;
601   } HTTP_REQUEST_CHANNEL_BIND_STATUS, *PHTTP_REQUEST_CHANNEL_BIND_STATUS;
602 
603   typedef struct _HTTP_SERVICE_BINDING_A {
604     HTTP_SERVICE_BINDING_BASE Base;
605     PCHAR                     Buffer;
606     ULONG                     BufferSize;
607   } HTTP_SERVICE_BINDING_A, *PHTTP_SERVICE_BINDING_A;
608 
609   typedef struct _HTTP_SERVICE_BINDING_W {
610     HTTP_SERVICE_BINDING_BASE Base;
611     PWCHAR                    Buffer;
612     ULONG                     BufferSize;
613   } HTTP_SERVICE_BINDING_W, *PHTTP_SERVICE_BINDING_W;
614 
615   /* TODO: Is there the abstract unicode type HTTP_SERVICE_BINDING present, too? */
616 
617   typedef struct _HTTP_LOG_FIELDS_DATA {
618     HTTP_LOG_DATA Base;
619     USHORT        UserNameLength;
620     USHORT        UriStemLength;
621     USHORT        ClientIpLength;
622     USHORT        ServerNameLength;
623     USHORT        ServerIpLength;
624     USHORT        MethodLength;
625     USHORT        UriQueryLength;
626     USHORT        HostLength;
627     USHORT        UserAgentLength;
628     USHORT        CookieLength;
629     USHORT        ReferrerLength;
630     PWCHAR        UserName;
631     PWCHAR        UriStem;
632     PCHAR         ClientIp;
633     PCHAR         ServerName;
634     PCHAR         ServiceName;
635     PCHAR         ServerIp;
636     PCHAR         Method;
637     PCHAR         UriQuery;
638     PCHAR         Host;
639     PCHAR         UserAgent;
640     PCHAR         Cookie;
641     PCHAR         Referrer;
642     USHORT        ServerPort;
643     USHORT        ProtocolStatus;
644     ULONG         Win32Status;
645     HTTP_VERB     MethodNum;
646     USHORT        SubStatus;
647   } HTTP_LOG_FIELDS_DATA, *PHTTP_LOG_FIELDS_DATA;
648 
649   typedef struct _HTTP_REQUEST_AUTH_INFO {
650     HTTP_AUTH_STATUS       AuthStatus;
651     SECURITY_STATUS        SecStatus;
652     ULONG                  Flags;
653     HTTP_REQUEST_AUTH_TYPE AuthType;
654     HANDLE                 AccessToken;
655     ULONG                  ContextAttributes;
656     ULONG                  PackedContextLength;
657     ULONG                  PackedContextType;
658     PVOID                  PackedContext;
659     ULONG                  MutualAuthDataLength;
660     PCHAR                  pMutualAuthData;
661   } HTTP_REQUEST_AUTH_INFO, *PHTTP_REQUEST_AUTH_INFO;
662 
663   typedef struct _HTTP_MULTIPLE_KNOWN_HEADERS {
664     HTTP_HEADER_ID     HeaderId;
665     ULONG              Flags;
666     USHORT             KnownHeaderCount;
667     PHTTP_KNOWN_HEADER KnownHeaders;
668   } HTTP_MULTIPLE_KNOWN_HEADERS, *PHTTP_MULTIPLE_KNOWN_HEADERS;
669 
670   typedef struct _HTTP_SERVICE_CONFIG_TIMEOUT_SET {
671     HTTP_SERVICE_CONFIG_TIMEOUT_KEY   KeyDesc;
672     HTTP_SERVICE_CONFIG_TIMEOUT_PARAM ParamDesc;
673   } HTTP_SERVICE_CONFIG_TIMEOUT_SET, *PHTTP_SERVICE_CONFIG_TIMEOUT_SET;
674 
675   typedef struct _HTTP_BANDWIDTH_LIMIT_INFO {
676     HTTP_PROPERTY_FLAGS Flags;
677     ULONG               MaxBandwidth;
678   } HTTP_BANDWIDTH_LIMIT_INFO, *PHTTP_BANDWIDTH_LIMIT_INFO;
679 
680   typedef struct _HTTP_BINDING_INFO {
681     HTTP_PROPERTY_FLAGS Flags;
682     HANDLE              RequestQueueHandle;
683   } HTTP_BINDING_INFO, *PHTTP_BINDING_INFO;
684 
685   typedef struct _HTTP_LISTEN_ENDPOINT_INFO {
686     HTTP_PROPERTY_FLAGS Flags;
687     BOOLEAN             EnableSharing;
688   } HTTP_LISTEN_ENDPOINT_INFO, *PHTTP_LISTEN_ENDPOINT_INFO;
689 
690   HTTPAPI_LINKAGE ULONG WINAPI HttpSetRequestQueueProperty(HANDLE Handle,HTTP_SERVER_PROPERTY Property,PVOID pPropertyInformation,ULONG PropertyInformationLength,ULONG Reserved,PVOID pReserved);
691   HTTPAPI_LINKAGE ULONG WINAPI HttpQueryRequestQueueProperty(HANDLE Handle,HTTP_SERVER_PROPERTY Property,PVOID pPropertyInformation,ULONG PropertyInformationLength,ULONG Reserved,PULONG pReturnLength,PVOID pReserved);
692   HTTPAPI_LINKAGE ULONG WINAPI HttpCreateRequestQueue(HTTPAPI_VERSION Version,PCWSTR pName,PSECURITY_ATTRIBUTES pSecurityAttributes,ULONG Flags,PHANDLE pReqQueueHandle);
693   HTTPAPI_LINKAGE ULONG WINAPI HttpAddUrlToUrlGroup(HTTP_URL_GROUP_ID UrlGroupId,PCWSTR pFullyQualifiedUrl,HTTP_URL_CONTEXT UrlContext,ULONG Reserved);
694   HTTPAPI_LINKAGE ULONG WINAPI HttpCancelHttpRequest(HANDLE ReqQueueHandle,HTTP_REQUEST_ID RequestId,LPOVERLAPPED pOverlapped);
695   HTTPAPI_LINKAGE ULONG WINAPI HttpCloseRequestQueue(HANDLE ReqQueueHandle);
696   HTTPAPI_LINKAGE ULONG WINAPI HttpCloseServerSession(HTTP_SERVER_SESSION_ID ServerSessionId);
697   HTTPAPI_LINKAGE ULONG WINAPI HttpCloseUrlGroup(HTTP_URL_GROUP_ID UrlGroupId);
698   HTTPAPI_LINKAGE ULONG WINAPI HttpCreateServerSession(HTTPAPI_VERSION Version,PHTTP_SERVER_SESSION_ID pServerSessionId,ULONG Reserved);
699   HTTPAPI_LINKAGE ULONG WINAPI HttpCreateUrlGroup(HTTP_SERVER_SESSION_ID ServerSessionId,PHTTP_URL_GROUP_ID pUrlGroupId,ULONG Reserved);
700   HTTPAPI_LINKAGE ULONG WINAPI HttpQueryServerSessionProperty(HTTP_SERVER_SESSION_ID ServerSessionId,HTTP_SERVER_PROPERTY Property,PVOID pPropertyInformation,ULONG PropertyInformationLength,PULONG pReturnLength);
701   HTTPAPI_LINKAGE ULONG WINAPI HttpQueryUrlGroupProperty(HTTP_URL_GROUP_ID UrlGroupId,HTTP_SERVER_PROPERTY Property,PVOID pPropertyInformation,ULONG PropertyInformationLength,PULONG pReturnLength);
702   HTTPAPI_LINKAGE ULONG WINAPI HttpRemoveUrlFromUrlGroup(HTTP_URL_GROUP_ID UrlGroupId,PCWSTR pFullyQualifiedUrl,ULONG Flags);
703   HTTPAPI_LINKAGE ULONG WINAPI HttpSetServerSessionProperty(HTTP_SERVER_SESSION_ID ServerSessionId,HTTP_SERVER_PROPERTY Property,PVOID pPropertyInformation,ULONG PropertyInformationLength);
704   HTTPAPI_LINKAGE ULONG WINAPI HttpSetUrlGroupProperty(HTTP_URL_GROUP_ID UrlGroupId,HTTP_SERVER_PROPERTY Property,PVOID pPropertyInformation,ULONG PropertyInformationLength);
705   HTTPAPI_LINKAGE ULONG WINAPI HttpShutdownRequestQueue(HANDLE ReqQueueHandle);
706   HTTPAPI_LINKAGE ULONG WINAPI HttpWaitForDemandStart(HANDLE ReqQueueHandle,LPOVERLAPPED pOverlapped);
707 
708 #if (_WIN32_WINNT >= 0x0601)
709   typedef ULONG HTTP_SERVICE_CONFIG_CACHE_PARAM;
710 
711   typedef enum _HTTP_SERVICE_CONFIG_CACHE_KEY {
712     MaxCacheResponseSize  = 0,
713     CacheRangeChunkSize
714   } HTTP_SERVICE_CONFIG_CACHE_KEY;
715 
716   typedef struct _HTTP_FLOWRATE_INFO {
717     HTTP_PROPERTY_FLAGS  Flags;
718     ULONG                MaxBandwidth;
719     ULONG                MaxPeakBandwidth;
720     ULONG                BurstSize;
721   } HTTP_FLOWRATE_INFO, *PHTTP_FLOWRATE_INFO;
722 
723 typedef struct _HTTP_SERVICE_CONFIG_CACHE_SET {
724   HTTP_SERVICE_CONFIG_CACHE_KEY KeyDesc;
725   HTTP_SERVICE_CONFIG_CACHE_PARAM ParamDesc;
726 } HTTP_SERVICE_CONFIG_CACHE_SET, *PHTTP_SERVICE_CONFIG_CACHE_SET;
727 
728 #endif /*(_WIN32_WINNT >= 0x0601)*/
729 
730 #endif /*(_WIN32_WINNT >= 0x0600)*/
731 
732 #ifdef __cplusplus
733 }
734 #endif
735 
736 #endif /* __HTTP_H__ */
737