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
 16extern "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
723typedef 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__ */