1{
2    This file is part of the Free Component Library (FCL)
3    Copyright (c) 2017-2018 by the Free Pascal development team
4
5    Windows HTTP Server API based TCustomWebApplication
6
7    See the file COPYING.FPC, included in this distribution,
8    for details about the copyright.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
14 **********************************************************************}
15
16{
17  Header of original file http.h:
18
19/*++
20
21Copyright (c) 1998-2002 Microsoft Corporation
22
23Module Name:
24
25    Http.h
26
27Abstract:
28
29    This header corresponds to the HTTP API specification
30
31Revision History:
32
33--*/
34
35}
36
37unit HttpApi;
38interface
39
40{
41  Automatically converted by H2Pas 1.0.0 from .\packages\fcl-web\examples\echo\httpsys\http.h
42  The following command line parameters were used:
43    -D
44    -w
45    -u
46    HttpApi
47    -l
48    httpapi.dll
49    -o
50    .\packages\fcl-web\examples\echo\httpsys\httpapi.pp
51    -s
52    .\packages\fcl-web\examples\echo\httpsys\http.h
53}
54
55{$MODE OBJFPC}
56
57  uses
58    Windows, WinSock2;
59
60  const
61    External_library='httpapi.dll'; {Setup as you need}
62
63{$IFDEF FPC}
64{$PACKRECORDS C}
65{$ENDIF}
66
67  const
68    HTTP_INITIALIZE_SERVER = $00000001;
69    HTTP_INITIALIZE_CONFIG = $00000002;
70    HTTP_DEMAND_CBT = $00000004;
71
72{%REGION Windows Vista and newer }
73
74  type
75    _HTTP_SERVER_PROPERTY = (HttpServerAuthenticationProperty := 0,
76      HttpServerLoggingProperty := 1,HttpServerQosProperty := 2,
77      HttpServerTimeoutsProperty := 3,HttpServerQueueLengthProperty := 4,
78      HttpServerStateProperty := 5,HttpServer503VerbosityProperty := 6,
79      HttpServerBindingProperty := 7,HttpServerExtendedAuthenticationProperty := 8,
80      HttpServerListenEndpointProperty := 9,
81      HttpServerChannelBindProperty := 10,
82      HttpServerProtectionLevelProperty := 11
83      );
84    HTTP_SERVER_PROPERTY = _HTTP_SERVER_PROPERTY;
85    PHTTP_SERVER_PROPERTY = ^_HTTP_SERVER_PROPERTY;
86
87  const
88    HTTP_MAX_SERVER_QUEUE_LENGTH = $7FFFFFFF;
89    HTTP_MIN_SERVER_QUEUE_LENGTH = 1;
90
91  type
92    _HTTP_PROPERTY_FLAGS = record
93        flag0 : word;
94      end;
95    HTTP_PROPERTY_FLAGS = _HTTP_PROPERTY_FLAGS;
96    PHTTP_PROPERTY_FLAGS = ^_HTTP_PROPERTY_FLAGS;
97
98  const
99    bm__HTTP_PROPERTY_FLAGS_Present = $1;
100    bp__HTTP_PROPERTY_FLAGS_Present = 0;
101
102  function Present(var a : _HTTP_PROPERTY_FLAGS) : ULONG;
103  procedure set_Present(var a : _HTTP_PROPERTY_FLAGS; __Present : ULONG);
104
105  type
106    _HTTP_ENABLED_STATE = (HttpEnabledStateActive,HttpEnabledStateInactive
107      );
108    HTTP_ENABLED_STATE = _HTTP_ENABLED_STATE;
109    PHTTP_ENABLED_STATE = ^_HTTP_ENABLED_STATE;
110
111    _HTTP_STATE_INFO = record
112        Flags : HTTP_PROPERTY_FLAGS;
113        State : HTTP_ENABLED_STATE;
114      end;
115    HTTP_STATE_INFO = _HTTP_STATE_INFO;
116    PHTTP_STATE_INFO = ^_HTTP_STATE_INFO;
117
118    _HTTP_503_RESPONSE_VERBOSITY = (Http503ResponseVerbosityBasic,Http503ResponseVerbosityLimited,
119      Http503ResponseVerbosityFull);
120    HTTP_503_RESPONSE_VERBOSITY = _HTTP_503_RESPONSE_VERBOSITY;
121    PHTTP_503_RESPONSE_VERBOSITY = ^_HTTP_503_RESPONSE_VERBOSITY;
122
123    _HTTP_QOS_SETTING_TYPE = (HttpQosSettingTypeBandwidth,HttpQosSettingTypeConnectionLimit,
124      HttpQosSettingTypeFlowRate);
125    HTTP_QOS_SETTING_TYPE = _HTTP_QOS_SETTING_TYPE;
126    PHTTP_QOS_SETTING_TYPE = ^_HTTP_QOS_SETTING_TYPE;
127
128    _HTTP_QOS_SETTING_INFO = record
129        QosType : HTTP_QOS_SETTING_TYPE;
130        QosSetting : PVOID;
131      end;
132    HTTP_QOS_SETTING_INFO = _HTTP_QOS_SETTING_INFO;
133    PHTTP_QOS_SETTING_INFO = ^_HTTP_QOS_SETTING_INFO;
134
135    _HTTP_CONNECTION_LIMIT_INFO = record
136        Flags : HTTP_PROPERTY_FLAGS;
137        MaxConnections : ULONG;
138      end;
139    HTTP_CONNECTION_LIMIT_INFO = _HTTP_CONNECTION_LIMIT_INFO;
140    PHTTP_CONNECTION_LIMIT_INFO = ^_HTTP_CONNECTION_LIMIT_INFO;
141
142    _HTTP_BANDWIDTH_LIMIT_INFO = record
143        Flags : HTTP_PROPERTY_FLAGS;
144        MaxBandwidth : ULONG;
145      end;
146    HTTP_BANDWIDTH_LIMIT_INFO = _HTTP_BANDWIDTH_LIMIT_INFO;
147    PHTTP_BANDWIDTH_LIMIT_INFO = ^_HTTP_BANDWIDTH_LIMIT_INFO;
148
149    _HTTP_FLOWRATE_INFO = record
150        Flags : HTTP_PROPERTY_FLAGS;
151        MaxBandwidth : ULONG;
152        MaxPeakBandwidth : ULONG;
153        BurstSize : ULONG;
154      end;
155    HTTP_FLOWRATE_INFO = _HTTP_FLOWRATE_INFO;
156    PHTTP_FLOWRATE_INFO = ^_HTTP_FLOWRATE_INFO;
157
158  const
159    HTTP_MIN_ALLOWED_BANDWIDTH_THROTTLING_RATE: ULONG = 1024;
160
161    HTTP_LIMIT_INFINITE: ULONG = ULONG(-1);
162
163
164  type
165    _HTTP_SERVICE_CONFIG_TIMEOUT_KEY = (IdleConnectionTimeout := 0,HeaderWaitTimeout
166      );
167    HTTP_SERVICE_CONFIG_TIMEOUT_KEY = _HTTP_SERVICE_CONFIG_TIMEOUT_KEY;
168    PHTTP_SERVICE_CONFIG_TIMEOUT_KEY = ^_HTTP_SERVICE_CONFIG_TIMEOUT_KEY;
169
170    HTTP_SERVICE_CONFIG_TIMEOUT_PARAM = USHORT;
171    PHTTP_SERVICE_CONFIG_TIMEOUT_PARAM = ^HTTP_SERVICE_CONFIG_TIMEOUT_PARAM;
172
173    _HTTP_SERVICE_CONFIG_TIMEOUT_SET = record
174        KeyDesc : HTTP_SERVICE_CONFIG_TIMEOUT_KEY;
175        ParamDesc : HTTP_SERVICE_CONFIG_TIMEOUT_PARAM;
176      end;
177    HTTP_SERVICE_CONFIG_TIMEOUT_SET = _HTTP_SERVICE_CONFIG_TIMEOUT_SET;
178    PHTTP_SERVICE_CONFIG_TIMEOUT_SET = ^_HTTP_SERVICE_CONFIG_TIMEOUT_SET;
179
180    _HTTP_TIMEOUT_LIMIT_INFO = record
181        Flags : HTTP_PROPERTY_FLAGS;
182        EntityBody : USHORT;
183        DrainEntityBody : USHORT;
184        RequestQueue : USHORT;
185        IdleConnection : USHORT;
186        HeaderWait : USHORT;
187        MinSendRate : ULONG;
188      end;
189    HTTP_TIMEOUT_LIMIT_INFO = _HTTP_TIMEOUT_LIMIT_INFO;
190    PHTTP_TIMEOUT_LIMIT_INFO = ^_HTTP_TIMEOUT_LIMIT_INFO;
191
192    _HTTP_LISTEN_ENDPOINT_INFO = record
193        Flags : HTTP_PROPERTY_FLAGS;
194        EnableSharing : BOOLEAN;
195      end;
196    HTTP_LISTEN_ENDPOINT_INFO = _HTTP_LISTEN_ENDPOINT_INFO;
197    PHTTP_LISTEN_ENDPOINT_INFO = ^_HTTP_LISTEN_ENDPOINT_INFO;
198
199    _HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS = record
200        DomainNameLength : USHORT;
201        DomainName : PWSTR;
202        RealmLength : USHORT;
203        Realm : PWSTR;
204      end;
205    HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS = _HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS;
206    PHTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS = ^_HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS;
207
208    _HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS = record
209        RealmLength : USHORT;
210        Realm : PWSTR;
211      end;
212    HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS = _HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS;
213    PHTTP_SERVER_AUTHENTICATION_BASIC_PARAMS = ^_HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS;
214
215  const
216    HTTP_AUTH_ENABLE_BASIC = $00000001;
217    HTTP_AUTH_ENABLE_DIGEST = $00000002;
218    HTTP_AUTH_ENABLE_NTLM = $00000004;
219    HTTP_AUTH_ENABLE_NEGOTIATE = $00000008;
220    HTTP_AUTH_ENABLE_KERBEROS = $00000010;
221    HTTP_AUTH_ENABLE_ALL = (((HTTP_AUTH_ENABLE_BASIC or HTTP_AUTH_ENABLE_DIGEST) or HTTP_AUTH_ENABLE_NTLM) or HTTP_AUTH_ENABLE_NEGOTIATE) or HTTP_AUTH_ENABLE_KERBEROS;
222
223    HTTP_AUTH_EX_FLAG_ENABLE_KERBEROS_CREDENTIAL_CACHING = $01;
224    HTTP_AUTH_EX_FLAG_CAPTURE_CREDENTIAL = $02;
225
226  type
227    _HTTP_SERVER_AUTHENTICATION_INFO = record
228        Flags : HTTP_PROPERTY_FLAGS;
229        AuthSchemes : ULONG;
230        ReceiveMutualAuth : BOOLEAN;
231        ReceiveContextHandle : BOOLEAN;
232        DisableNTLMCredentialCaching : BOOLEAN;
233        ExFlags : UCHAR;
234        DigestParams : HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS;
235        BasicParams : HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS;
236      end;
237    HTTP_SERVER_AUTHENTICATION_INFO = _HTTP_SERVER_AUTHENTICATION_INFO;
238    PHTTP_SERVER_AUTHENTICATION_INFO = ^_HTTP_SERVER_AUTHENTICATION_INFO;
239
240{%REGION Windows 7 and newer }
241
242  type
243    _HTTP_SERVICE_BINDING_TYPE = (HttpServiceBindingTypeNone := 0,HttpServiceBindingTypeW,
244      HttpServiceBindingTypeA);
245    HTTP_SERVICE_BINDING_TYPE = _HTTP_SERVICE_BINDING_TYPE;
246
247    _HTTP_SERVICE_BINDING_BASE = record
248        _Type : HTTP_SERVICE_BINDING_TYPE;
249      end;
250    HTTP_SERVICE_BINDING_BASE = _HTTP_SERVICE_BINDING_BASE;
251    PHTTP_SERVICE_BINDING_BASE = ^_HTTP_SERVICE_BINDING_BASE;
252
253    _HTTP_SERVICE_BINDING_A = record
254        Base : HTTP_SERVICE_BINDING_BASE;
255        Buffer : PCHAR;
256        BufferSize : ULONG;
257      end;
258    HTTP_SERVICE_BINDING_A = _HTTP_SERVICE_BINDING_A;
259    PHTTP_SERVICE_BINDING_A = ^_HTTP_SERVICE_BINDING_A;
260
261    _HTTP_SERVICE_BINDING_W = record
262        Base : HTTP_SERVICE_BINDING_BASE;
263        Buffer : PWCHAR;
264        BufferSize : ULONG;
265      end;
266    HTTP_SERVICE_BINDING_W = _HTTP_SERVICE_BINDING_W;
267    PHTTP_SERVICE_BINDING_W = ^_HTTP_SERVICE_BINDING_W;
268
269    _HTTP_AUTHENTICATION_HARDENING_LEVELS = (HttpAuthenticationHardeningLegacy := 0,
270      HttpAuthenticationHardeningMedium,HttpAuthenticationHardeningStrict
271      );
272    HTTP_AUTHENTICATION_HARDENING_LEVELS = _HTTP_AUTHENTICATION_HARDENING_LEVELS;
273
274  const
275    HTTP_CHANNEL_BIND_PROXY = $1;
276    HTTP_CHANNEL_BIND_PROXY_COHOSTING = $20;
277    HTTP_CHANNEL_BIND_NO_SERVICE_NAME_CHECK = $2;
278    HTTP_CHANNEL_BIND_DOTLESS_SERVICE = $4;
279    HTTP_CHANNEL_BIND_SECURE_CHANNEL_TOKEN = $8;
280    HTTP_CHANNEL_BIND_CLIENT_SERVICE = $10;
281
282  type
283    _HTTP_CHANNEL_BIND_INFO = record
284        Hardening : HTTP_AUTHENTICATION_HARDENING_LEVELS;
285        Flags : ULONG;
286        ServiceNames : ^PHTTP_SERVICE_BINDING_BASE;
287        NumberOfServiceNames : ULONG;
288      end;
289    HTTP_CHANNEL_BIND_INFO = _HTTP_CHANNEL_BIND_INFO;
290    PHTTP_CHANNEL_BIND_INFO = ^_HTTP_CHANNEL_BIND_INFO;
291
292    _HTTP_REQUEST_CHANNEL_BIND_STATUS = record
293        ServiceName : PHTTP_SERVICE_BINDING_BASE;
294        ChannelToken : PUCHAR;
295        ChannelTokenSize : ULONG;
296        Flags : ULONG;
297      end;
298    HTTP_REQUEST_CHANNEL_BIND_STATUS = _HTTP_REQUEST_CHANNEL_BIND_STATUS;
299    PHTTP_REQUEST_CHANNEL_BIND_STATUS = ^_HTTP_REQUEST_CHANNEL_BIND_STATUS;
300
301{%ENDREGION}
302
303  type
304    _HTTP_REQUEST_TOKEN_BINDING_INFO = record
305        TokenBinding : PUCHAR;
306        TokenBindingSize : ULONG;
307        TlsUnique : PUCHAR;
308        TlsUniqueSize : ULONG;
309        KeyType : PWSTR;
310      end;
311    HTTP_REQUEST_TOKEN_BINDING_INFO = _HTTP_REQUEST_TOKEN_BINDING_INFO;
312    PHTTP_REQUEST_TOKEN_BINDING_INFO = ^_HTTP_REQUEST_TOKEN_BINDING_INFO;
313
314  const
315    HTTP_LOG_FIELD_DATE = $00000001;
316    HTTP_LOG_FIELD_TIME = $00000002;
317    HTTP_LOG_FIELD_CLIENT_IP = $00000004;
318    HTTP_LOG_FIELD_USER_NAME = $00000008;
319    HTTP_LOG_FIELD_SITE_NAME = $00000010;
320    HTTP_LOG_FIELD_COMPUTER_NAME = $00000020;
321    HTTP_LOG_FIELD_SERVER_IP = $00000040;
322    HTTP_LOG_FIELD_METHOD = $00000080;
323    HTTP_LOG_FIELD_URI_STEM = $00000100;
324    HTTP_LOG_FIELD_URI_QUERY = $00000200;
325    HTTP_LOG_FIELD_STATUS = $00000400;
326    HTTP_LOG_FIELD_WIN32_STATUS = $00000800;
327    HTTP_LOG_FIELD_BYTES_SENT = $00001000;
328    HTTP_LOG_FIELD_BYTES_RECV = $00002000;
329    HTTP_LOG_FIELD_TIME_TAKEN = $00004000;
330    HTTP_LOG_FIELD_SERVER_PORT = $00008000;
331    HTTP_LOG_FIELD_USER_AGENT = $00010000;
332    HTTP_LOG_FIELD_COOKIE = $00020000;
333    HTTP_LOG_FIELD_REFERER = $00040000;
334    HTTP_LOG_FIELD_VERSION = $00080000;
335    HTTP_LOG_FIELD_HOST = $00100000;
336    HTTP_LOG_FIELD_SUB_STATUS = $00200000;
337    HTTP_LOG_FIELD_STREAM_ID = $08000000;
338    HTTP_LOG_FIELD_CLIENT_PORT = $00400000;
339    HTTP_LOG_FIELD_URI = $00800000;
340    HTTP_LOG_FIELD_SITE_ID = $01000000;
341    HTTP_LOG_FIELD_REASON = $02000000;
342    HTTP_LOG_FIELD_QUEUE_NAME = $04000000;
343
344  type
345    _HTTP_LOGGING_TYPE = (HttpLoggingTypeW3C,HttpLoggingTypeIIS,
346      HttpLoggingTypeNCSA,HttpLoggingTypeRaw
347      );
348    HTTP_LOGGING_TYPE = _HTTP_LOGGING_TYPE;
349    PHTTP_LOGGING_TYPE = ^_HTTP_LOGGING_TYPE;
350
351    _HTTP_LOGGING_ROLLOVER_TYPE = (HttpLoggingRolloverSize,HttpLoggingRolloverDaily,
352      HttpLoggingRolloverWeekly,HttpLoggingRolloverMonthly,
353      HttpLoggingRolloverHourly);
354    HTTP_LOGGING_ROLLOVER_TYPE = _HTTP_LOGGING_ROLLOVER_TYPE;
355    PHTTP_LOGGING_ROLLOVER_TYPE = ^_HTTP_LOGGING_ROLLOVER_TYPE;
356
357  const
358    HTTP_MIN_ALLOWED_LOG_FILE_ROLLOVER_SIZE : ULONG = ULONG((1*1024)*1024);
359
360    HTTP_LOGGING_FLAG_LOCAL_TIME_ROLLOVER = $00000001;
361    HTTP_LOGGING_FLAG_USE_UTF8_CONVERSION = $00000002;
362    HTTP_LOGGING_FLAG_LOG_ERRORS_ONLY = $00000004;
363    HTTP_LOGGING_FLAG_LOG_SUCCESS_ONLY = $00000008;
364
365  type
366    _HTTP_LOGGING_INFO = record
367        Flags : HTTP_PROPERTY_FLAGS;
368        LoggingFlags : ULONG;
369        SoftwareName : PCWSTR;
370        SoftwareNameLength : USHORT;
371        DirectoryNameLength : USHORT;
372        DirectoryName : PCWSTR;
373        Format : HTTP_LOGGING_TYPE;
374        Fields : ULONG;
375        pExtFields : PVOID;
376        NumOfExtFields : USHORT;
377        MaxRecordSize : USHORT;
378        RolloverType : HTTP_LOGGING_ROLLOVER_TYPE;
379        RolloverSize : ULONG;
380        pSecurityDescriptor : PSECURITY_DESCRIPTOR;
381      end;
382    HTTP_LOGGING_INFO = _HTTP_LOGGING_INFO;
383    PHTTP_LOGGING_INFO = ^_HTTP_LOGGING_INFO;
384
385    _HTTP_BINDING_INFO = record
386        Flags : HTTP_PROPERTY_FLAGS;
387        RequestQueueHandle : HANDLE;
388      end;
389    HTTP_BINDING_INFO = _HTTP_BINDING_INFO;
390    PHTTP_BINDING_INFO = ^_HTTP_BINDING_INFO;
391
392{%ENDREGION}
393
394{%REGION Windows 7 and newer}
395
396  type
397    _HTTP_PROTECTION_LEVEL_TYPE = (HttpProtectionLevelUnrestricted,HttpProtectionLevelEdgeRestricted,
398      HttpProtectionLevelRestricted);
399    HTTP_PROTECTION_LEVEL_TYPE = _HTTP_PROTECTION_LEVEL_TYPE;
400    PHTTP_PROTECTION_LEVEL_TYPE = ^_HTTP_PROTECTION_LEVEL_TYPE;
401
402    _HTTP_PROTECTION_LEVEL_INFO = record
403        Flags : HTTP_PROPERTY_FLAGS;
404        Level : HTTP_PROTECTION_LEVEL_TYPE;
405      end;
406    HTTP_PROTECTION_LEVEL_INFO = _HTTP_PROTECTION_LEVEL_INFO;
407    PHTTP_PROTECTION_LEVEL_INFO = ^_HTTP_PROTECTION_LEVEL_INFO;
408{%ENDREGION}
409
410{%REGION Windows Vista and newer }
411
412  const
413    HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING = $00000001;
414    HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER = $00000002;
415
416{%ENDREGION}
417
418  const
419    HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY = $00000001;
420    HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY = $00000002;
421
422{%REGION Windows Vista and newer}
423
424  const
425    HTTP_RECEIVE_REQUEST_ENTITY_BODY_FLAG_FILL_BUFFER = $00000001;
426
427{%ENDREGION}
428
429  const
430    HTTP_SEND_RESPONSE_FLAG_DISCONNECT = $00000001;
431    HTTP_SEND_RESPONSE_FLAG_MORE_DATA = $00000002;
432    HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA = $00000004;
433    HTTP_SEND_RESPONSE_FLAG_ENABLE_NAGLING = $00000008;
434    HTTP_SEND_RESPONSE_FLAG_PROCESS_RANGES = $00000020;
435    HTTP_SEND_RESPONSE_FLAG_OPAQUE = $00000040;
436    HTTP_FLUSH_RESPONSE_FLAG_RECURSIVE = $00000001;
437
438  type
439    HTTP_OPAQUE_ID = ULONGLONG;
440    PHTTP_OPAQUE_ID = ^HTTP_OPAQUE_ID;
441
442    HTTP_REQUEST_ID = HTTP_OPAQUE_ID;
443    PHTTP_REQUEST_ID = ^HTTP_REQUEST_ID;
444
445    HTTP_CONNECTION_ID = HTTP_OPAQUE_ID;
446    PHTTP_CONNECTION_ID = ^HTTP_CONNECTION_ID;
447
448    HTTP_RAW_CONNECTION_ID = HTTP_OPAQUE_ID;
449    PHTTP_RAW_CONNECTION_ID = ^HTTP_RAW_CONNECTION_ID;
450
451{%REGION Windows Vista and newer}
452
453  type
454    HTTP_URL_GROUP_ID = HTTP_OPAQUE_ID;
455    PHTTP_URL_GROUP_ID = ^HTTP_URL_GROUP_ID;
456
457    HTTP_SERVER_SESSION_ID = HTTP_OPAQUE_ID;
458    PHTTP_SERVER_SESSION_ID = ^HTTP_SERVER_SESSION_ID;
459
460{%ENDREGION}
461
462  const
463    HTTP_NULL_ID = QWord(0);
464
465function HTTP_IS_NULL_ID(pid: HTTP_OPAQUE_ID): Boolean; inline;
466procedure HTTP_SET_NULL_ID(var pid: HTTP_OPAQUE_ID); inline;
467(* error
468#define HTTP_NULL_ID            (0ui64)
469in define line 892 *)
470(* error
471#define HTTP_IS_NULL_ID(pid)    (HTTP_NULL_ID == *(pid))
472in define line 893 *)
473(* error
474#define HTTP_SET_NULL_ID(pid)   ( *(pid) = HTTP_NULL_ID)
475in define line 894 *)
476
477    { was #define dname def_expr }
478  const
479    HTTP_BYTE_RANGE_TO_EOF : ULONGLONG = ULONGLONG(-(1));
480
481
482  type
483    _HTTP_BYTE_RANGE = record
484        StartingOffset : ULARGE_INTEGER;
485        Length : ULARGE_INTEGER;
486      end;
487    HTTP_BYTE_RANGE = _HTTP_BYTE_RANGE;
488    PHTTP_BYTE_RANGE = ^_HTTP_BYTE_RANGE;
489
490    _HTTP_VERSION = record
491        MajorVersion : USHORT;
492        MinorVersion : USHORT;
493      end;
494    HTTP_VERSION = _HTTP_VERSION;
495    PHTTP_VERSION = ^_HTTP_VERSION;
496
497const
498  HTTP_VERSION_UNKNOWN: HTTP_VERSION = ( MajorVersion: 0; MinorVersion: 0 );
499  HTTP_VERSION_0_9: HTTP_VERSION = ( MajorVersion: 0; MinorVersion: 9 );
500  HTTP_VERSION_1_0: HTTP_VERSION = ( MajorVersion: 1; MinorVersion: 0 );
501  HTTP_VERSION_1_1: HTTP_VERSION = ( MajorVersion: 1; MinorVersion: 1 );
502  HTTP_VERSION_2_0: HTTP_VERSION = ( MajorVersion: 2; MinorVersion: 0 );
503
504procedure HTTP_SET_VERSION(out version: HTTP_VERSION; major, minor: USHORT); inline;
505function HTTP_EQUAL_VERSION(constref version: HTTP_VERSION; major, minor: USHORT): Boolean; inline;
506function HTTP_GREATER_VERSION(constref version: HTTP_VERSION; major, minor: USHORT): Boolean; inline;
507function HTTP_LESS_VERSION(constref version: HTTP_VERSION; major, minor: USHORT): Boolean; inline;
508function HTTP_NOT_EQUAL_VERSION(constref version: HTTP_VERSION; major, minor: USHORT): Boolean; inline;
509function HTTP_GREATER_EQUAL_VERSION(constref version: HTTP_VERSION; major, minor : USHORT) : Boolean;
510function HTTP_LESS_EQUAL_VERSION(constref version: HTTP_VERSION; major, minor : USHORT) : Boolean;
511
512type
513  _HTTP_VERB = (HttpVerbUnparsed,HttpVerbUnknown,HttpVerbInvalid,
514    HttpVerbOPTIONS,HttpVerbGET,HttpVerbHEAD,
515    HttpVerbPOST,HttpVerbPUT,HttpVerbDELETE,
516    HttpVerbTRACE,HttpVerbCONNECT,HttpVerbTRACK,
517    HttpVerbMOVE,HttpVerbCOPY,HttpVerbPROPFIND,
518    HttpVerbPROPPATCH,HttpVerbMKCOL,HttpVerbLOCK,
519    HttpVerbUNLOCK,HttpVerbSEARCH,HttpVerbMaximum
520    );
521  HTTP_VERB = _HTTP_VERB;
522  PHTTP_VERB = ^_HTTP_VERB;
523
524  _HTTP_HEADER_ID = (HttpHeaderCacheControl := 0,HttpHeaderConnection := 1,
525    HttpHeaderDate := 2,HttpHeaderKeepAlive := 3,
526    HttpHeaderPragma := 4,HttpHeaderTrailer := 5,
527    HttpHeaderTransferEncoding := 6,HttpHeaderUpgrade := 7,
528    HttpHeaderVia := 8,HttpHeaderWarning := 9,
529    HttpHeaderAllow := 10,HttpHeaderContentLength := 11,
530    HttpHeaderContentType := 12,HttpHeaderContentEncoding := 13,
531    HttpHeaderContentLanguage := 14,HttpHeaderContentLocation := 15,
532    HttpHeaderContentMd5 := 16,HttpHeaderContentRange := 17,
533    HttpHeaderExpires := 18,HttpHeaderLastModified := 19,
534    HttpHeaderAccept := 20,HttpHeaderAcceptCharset := 21,
535    HttpHeaderAcceptEncoding := 22,HttpHeaderAcceptLanguage := 23,
536    HttpHeaderAuthorization := 24,HttpHeaderCookie := 25,
537    HttpHeaderExpect := 26,HttpHeaderFrom := 27,
538    HttpHeaderHost := 28,HttpHeaderIfMatch := 29,
539    HttpHeaderIfModifiedSince := 30,HttpHeaderIfNoneMatch := 31,
540    HttpHeaderIfRange := 32,HttpHeaderIfUnmodifiedSince := 33,
541    HttpHeaderMaxForwards := 34,HttpHeaderProxyAuthorization := 35,
542    HttpHeaderReferer := 36,HttpHeaderRange := 37,
543    HttpHeaderTe := 38,HttpHeaderTranslate := 39,
544    HttpHeaderUserAgent := 40,HttpHeaderRequestMaximum := 41
545    );
546  HTTP_HEADER_ID = _HTTP_HEADER_ID;
547  PHTTP_HEADER_ID = ^_HTTP_HEADER_ID;
548
549const
550  HttpHeaderAcceptRanges = HttpHeaderAccept;
551  HttpHeaderAge = HttpHeaderAcceptCharset;
552  HttpHeaderEtag = HttpHeaderAcceptEncoding;
553  HttpHeaderLocation = HttpHeaderAcceptLanguage;
554  HttpHeaderProxyAuthenticate = HttpHeaderAuthorization;
555  HttpHeaderRetryAfter = HttpHeaderCookie;
556  HttpHeaderServer = HttpHeaderExpect;
557  HttpHeaderSetCookie = HttpHeaderFrom;
558  HttpHeaderVary = HttpHeaderHost;
559  HttpHeaderWwwAuthenticate = HttpHeaderIfMatch;
560  HttpHeaderResponseMaximum = HttpHeaderIfModifiedSince;
561  HttpHeaderMaximum = HttpHeaderRequestMaximum;
562
563type
564  _HTTP_KNOWN_HEADER = record
565      RawValueLength : USHORT;
566      pRawValue : PCSTR;
567    end;
568  HTTP_KNOWN_HEADER = _HTTP_KNOWN_HEADER;
569  PHTTP_KNOWN_HEADER = ^_HTTP_KNOWN_HEADER;
570
571  _HTTP_UNKNOWN_HEADER = record
572      NameLength : USHORT;
573      RawValueLength : USHORT;
574      pName : PCSTR;
575      pRawValue : PCSTR;
576    end;
577  HTTP_UNKNOWN_HEADER = _HTTP_UNKNOWN_HEADER;
578  PHTTP_UNKNOWN_HEADER = ^_HTTP_UNKNOWN_HEADER;
579
580{%REGION Windows Vista and newer}
581
582type
583  _HTTP_LOG_DATA_TYPE = (HttpLogDataTypeFields := 0);
584  HTTP_LOG_DATA_TYPE = _HTTP_LOG_DATA_TYPE;
585  PHTTP_LOG_DATA_TYPE = ^_HTTP_LOG_DATA_TYPE;
586
587  _HTTP_LOG_DATA = record
588      _Type : HTTP_LOG_DATA_TYPE;
589    end;
590  HTTP_LOG_DATA = _HTTP_LOG_DATA;
591  PHTTP_LOG_DATA = ^_HTTP_LOG_DATA;
592
593  _HTTP_LOG_FIELDS_DATA = record
594      Base : HTTP_LOG_DATA;
595      UserNameLength : USHORT;
596      UriStemLength : USHORT;
597      ClientIpLength : USHORT;
598      ServerNameLength : USHORT;
599      ServiceNameLength : USHORT;
600      ServerIpLength : USHORT;
601      MethodLength : USHORT;
602      UriQueryLength : USHORT;
603      HostLength : USHORT;
604      UserAgentLength : USHORT;
605      CookieLength : USHORT;
606      ReferrerLength : USHORT;
607      UserName : PWCHAR;
608      UriStem : PWCHAR;
609      ClientIp : PCHAR;
610      ServerName : PCHAR;
611      ServiceName : PCHAR;
612      ServerIp : PCHAR;
613      Method : PCHAR;
614      UriQuery : PCHAR;
615      Host : PCHAR;
616      UserAgent : PCHAR;
617      Cookie : PCHAR;
618      Referrer : PCHAR;
619      ServerPort : USHORT;
620      ProtocolStatus : USHORT;
621      Win32Status : ULONG;
622      MethodNum : HTTP_VERB;
623      SubStatus : USHORT;
624    end;
625  HTTP_LOG_FIELDS_DATA = _HTTP_LOG_FIELDS_DATA;
626  PHTTP_LOG_FIELDS_DATA = ^_HTTP_LOG_FIELDS_DATA;
627
628{%ENDREGION}
629
630type
631  _HTTP_DATA_CHUNK_TYPE = (HttpDataChunkFromMemory,HttpDataChunkFromFileHandle,
632    HttpDataChunkFromFragmentCache,HttpDataChunkFromFragmentCacheEx,
633    HttpDataChunkMaximum);
634  HTTP_DATA_CHUNK_TYPE = _HTTP_DATA_CHUNK_TYPE;
635  PHTTP_DATA_CHUNK_TYPE = ^_HTTP_DATA_CHUNK_TYPE;
636
637  HTTP_DATA_CHUNK_FROM_MEMORY = record
638    pBuffer : PVOID;
639    BufferLength : ULONG;
640  end;
641
642  HTTP_DATA_CHUNK_FROM_FILE_HANDLE = record
643    ByteRange : HTTP_BYTE_RANGE;
644    FileHandle : HANDLE;
645  end;
646
647  HTTP_DATA_CHUNK_FROM_FRAGMENT_CACHE = record
648    FragmentNameLength : USHORT;
649    pFragmentName : PCWSTR;
650  end;
651
652  HTTP_DATA_CHUNK_FROM_FRAGMENT_CACHE_EX = record
653    ByteRange : HTTP_BYTE_RANGE;
654    pFragmentName : PCWSTR;
655  end;
656
657  _HTTP_DATA_CHUNK = record
658      DataChunkType : HTTP_DATA_CHUNK_TYPE;
659      case LongInt of
660        1: (FromMemory : HTTP_DATA_CHUNK_FROM_MEMORY);
661        2: (FromFileHandle : HTTP_DATA_CHUNK_FROM_FILE_HANDLE);
662        3: (FromFragmentCache : HTTP_DATA_CHUNK_FROM_FRAGMENT_CACHE);
663        4: (FromFragmentCacheEx : HTTP_DATA_CHUNK_FROM_FRAGMENT_CACHE_EX);
664    end;
665  HTTP_DATA_CHUNK = _HTTP_DATA_CHUNK;
666  PHTTP_DATA_CHUNK = ^_HTTP_DATA_CHUNK;
667
668  _HTTP_REQUEST_HEADERS = record
669      UnknownHeaderCount : USHORT;
670      pUnknownHeaders : PHTTP_UNKNOWN_HEADER;
671      TrailerCount : USHORT;
672      pTrailers : PHTTP_UNKNOWN_HEADER;
673      KnownHeaders : array[0..Ord(HttpHeaderRequestMaximum)-1] of HTTP_KNOWN_HEADER;
674    end;
675  HTTP_REQUEST_HEADERS = _HTTP_REQUEST_HEADERS;
676  PHTTP_REQUEST_HEADERS = ^_HTTP_REQUEST_HEADERS;
677
678  _HTTP_RESPONSE_HEADERS = record
679      UnknownHeaderCount : USHORT;
680      pUnknownHeaders : PHTTP_UNKNOWN_HEADER;
681      TrailerCount : USHORT;
682      pTrailers : PHTTP_UNKNOWN_HEADER;
683      KnownHeaders : array[0..Ord(HttpHeaderResponseMaximum)-1] of HTTP_KNOWN_HEADER;
684    end;
685  HTTP_RESPONSE_HEADERS = _HTTP_RESPONSE_HEADERS;
686  PHTTP_RESPONSE_HEADERS = ^_HTTP_RESPONSE_HEADERS;
687
688  _HTTP_TRANSPORT_ADDRESS = record
689      pRemoteAddress : PSOCKADDR;
690      pLocalAddress : PSOCKADDR;
691    end;
692  HTTP_TRANSPORT_ADDRESS = _HTTP_TRANSPORT_ADDRESS;
693  PHTTP_TRANSPORT_ADDRESS = ^_HTTP_TRANSPORT_ADDRESS;
694
695  _HTTP_COOKED_URL = record
696      FullUrlLength : USHORT;
697      HostLength : USHORT;
698      AbsPathLength : USHORT;
699      QueryStringLength : USHORT;
700      pFullUrl : PCWSTR;
701      pHost : PCWSTR;
702      pAbsPath : PCWSTR;
703      pQueryString : PCWSTR;
704    end;
705  HTTP_COOKED_URL = _HTTP_COOKED_URL;
706  PHTTP_COOKED_URL = ^_HTTP_COOKED_URL;
707
708  HTTP_URL_CONTEXT = ULONGLONG;
709
710{%REGION Windows Vista and newer}
711
712const
713  HTTP_URL_FLAG_REMOVE_ALL = $00000001;
714
715type
716  _HTTP_AUTH_STATUS = (HttpAuthStatusSuccess,HttpAuthStatusNotAuthenticated,
717    HttpAuthStatusFailure);
718  HTTP_AUTH_STATUS = _HTTP_AUTH_STATUS;
719  PHTTP_AUTH_STATUS = ^_HTTP_AUTH_STATUS;
720
721  _HTTP_REQUEST_AUTH_TYPE = (HttpRequestAuthTypeNone := 0,HttpRequestAuthTypeBasic,
722    HttpRequestAuthTypeDigest,HttpRequestAuthTypeNTLM,
723    HttpRequestAuthTypeNegotiate,HttpRequestAuthTypeKerberos
724    );
725  HTTP_REQUEST_AUTH_TYPE = _HTTP_REQUEST_AUTH_TYPE;
726  PHTTP_REQUEST_AUTH_TYPE = ^_HTTP_REQUEST_AUTH_TYPE;
727
728{%ENDREGION}
729
730type
731  _HTTP_SSL_CLIENT_CERT_INFO = record
732      CertFlags : ULONG;
733      CertEncodedSize : ULONG;
734      pCertEncoded : PUCHAR;
735      Token : HANDLE;
736      CertDeniedByMapper : BOOLEAN;
737    end;
738  HTTP_SSL_CLIENT_CERT_INFO = _HTTP_SSL_CLIENT_CERT_INFO;
739  PHTTP_SSL_CLIENT_CERT_INFO = ^_HTTP_SSL_CLIENT_CERT_INFO;
740
741{%REGION Windows 7 and newer }
742
743const
744  HTTP_RECEIVE_SECURE_CHANNEL_TOKEN = $1;
745
746{%ENDREGION}
747
748type
749  _HTTP_SSL_INFO = record
750      ServerCertKeySize : USHORT;
751      ConnectionKeySize : USHORT;
752      ServerCertIssuerSize : ULONG;
753      ServerCertSubjectSize : ULONG;
754      pServerCertIssuer : PCSTR;
755      pServerCertSubject : PCSTR;
756      pClientCertInfo : PHTTP_SSL_CLIENT_CERT_INFO;
757      SslClientCertNegotiated : ULONG;
758    end;
759  HTTP_SSL_INFO = _HTTP_SSL_INFO;
760  PHTTP_SSL_INFO = ^_HTTP_SSL_INFO;
761
762  _HTTP_SSL_PROTOCOL_INFO = record
763      Protocol : ULONG;
764      CipherType : ULONG;
765      CipherStrength : ULONG;
766      HashType : ULONG;
767      HashStrength : ULONG;
768      KeyExchangeType : ULONG;
769      KeyExchangeStrength : ULONG;
770    end;
771  HTTP_SSL_PROTOCOL_INFO = _HTTP_SSL_PROTOCOL_INFO;
772  PHTTP_SSL_PROTOCOL_INFO = ^_HTTP_SSL_PROTOCOL_INFO;
773
774{%REGION Windows Vista and newer }
775
776type
777  _HTTP_REQUEST_INFO_TYPE = (HttpRequestInfoTypeAuth,HttpRequestInfoTypeChannelBind,
778    HttpRequestInfoTypeSslProtocol,HttpRequestInfoTypeSslTokenBinding
779    );
780  HTTP_REQUEST_INFO_TYPE = _HTTP_REQUEST_INFO_TYPE;
781  PHTTP_REQUEST_INFO_TYPE = ^_HTTP_REQUEST_INFO_TYPE;
782
783  _HTTP_REQUEST_INFO = record
784      InfoType : HTTP_REQUEST_INFO_TYPE;
785      InfoLength : ULONG;
786      pInfo : PVOID;
787    end;
788  HTTP_REQUEST_INFO = _HTTP_REQUEST_INFO;
789  PHTTP_REQUEST_INFO = ^_HTTP_REQUEST_INFO;
790{$ifndef __SECSTATUS_DEFINED__}
791
792type
793  SECURITY_STATUS = LONG;
794{$define __SECSTATUS_DEFINED__}
795{$endif}
796
797const
798  HTTP_REQUEST_AUTH_FLAG_TOKEN_FOR_CACHED_CRED = $00000001;
799
800type
801  _HTTP_REQUEST_AUTH_INFO = record
802      AuthStatus : HTTP_AUTH_STATUS;
803      SecStatus : SECURITY_STATUS;
804      Flags : ULONG;
805      AuthType : HTTP_REQUEST_AUTH_TYPE;
806      AccessToken : HANDLE;
807      ContextAttributes : ULONG;
808      PackedContextLength : ULONG;
809      PackedContextType : ULONG;
810      PackedContext : PVOID;
811      MutualAuthDataLength : ULONG;
812      pMutualAuthData : PCHAR;
813      PackageNameLength : USHORT;
814      pPackageName : PWSTR;
815    end;
816  HTTP_REQUEST_AUTH_INFO = _HTTP_REQUEST_AUTH_INFO;
817  PHTTP_REQUEST_AUTH_INFO = ^_HTTP_REQUEST_AUTH_INFO;
818
819{%ENDREGION}
820
821type
822  _HTTP_REQUEST_V1 = object
823      Flags : ULONG;
824      ConnectionId : HTTP_CONNECTION_ID;
825      RequestId : HTTP_REQUEST_ID;
826      UrlContext : HTTP_URL_CONTEXT;
827      Version : HTTP_VERSION;
828      Verb : HTTP_VERB;
829      UnknownVerbLength : USHORT;
830      RawUrlLength : USHORT;
831      pUnknownVerb : PCSTR;
832      pRawUrl : PCSTR;
833      CookedUrl : HTTP_COOKED_URL;
834      Address : HTTP_TRANSPORT_ADDRESS;
835      Headers : HTTP_REQUEST_HEADERS;
836      BytesReceived : ULONGLONG;
837      EntityChunkCount : USHORT;
838      pEntityChunks : PHTTP_DATA_CHUNK;
839      RawConnectionId : HTTP_RAW_CONNECTION_ID;
840      pSslInfo : PHTTP_SSL_INFO;
841    end;
842  HTTP_REQUEST_V1 = _HTTP_REQUEST_V1;
843  PHTTP_REQUEST_V1 = ^_HTTP_REQUEST_V1;
844
845{%REGION Windows Vista and newer }
846
847type
848  { the C code uses an anonymous struct here to avoid duplication... :/ }
849  _HTTP_REQUEST_V2 = object(_HTTP_REQUEST_V1)
850      RequestInfoCount : USHORT;
851      pRequestInfo : PHTTP_REQUEST_INFO;
852    end;
853  HTTP_REQUEST_V2 = _HTTP_REQUEST_V2;
854  PHTTP_REQUEST_V2 = ^_HTTP_REQUEST_V2;
855
856  HTTP_REQUEST = HTTP_REQUEST_V2;
857{%ENDREGION}
858
859{%REGION Older than Windows Vista }
860
861{type
862  HTTP_REQUEST = HTTP_REQUEST_V1;}
863
864{%ENDREGION}
865
866type
867  PHTTP_REQUEST = ^HTTP_REQUEST;
868
869const
870  HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS = $00000001;
871  HTTP_REQUEST_FLAG_IP_ROUTED = $00000002;
872  HTTP_REQUEST_FLAG_HTTP2 = $00000004;
873
874type
875  _HTTP_RESPONSE_V1 = object
876      Flags : ULONG;
877      Version : HTTP_VERSION;
878      StatusCode : USHORT;
879      ReasonLength : USHORT;
880      pReason : PCSTR;
881      Headers : HTTP_RESPONSE_HEADERS;
882      EntityChunkCount : USHORT;
883      pEntityChunks : PHTTP_DATA_CHUNK;
884    end;
885  HTTP_RESPONSE_V1 = _HTTP_RESPONSE_V1;
886  PHTTP_RESPONSE_V1 = ^_HTTP_RESPONSE_V1;
887
888{%REGION Windows Vista and newer }
889
890const
891  HTTP_RESPONSE_FLAG_MULTIPLE_ENCODINGS_AVAILABLE = $00000001;
892
893type
894  _HTTP_RESPONSE_INFO_TYPE = (HttpResponseInfoTypeMultipleKnownHeaders,
895    HttpResponseInfoTypeAuthenticationProperty,
896    HttpResponseInfoTypeQoSProperty,HttpResponseInfoTypeChannelBind
897    );
898  HTTP_RESPONSE_INFO_TYPE = _HTTP_RESPONSE_INFO_TYPE;
899  PHTTP_RESPONSE_INFO_TYPE = _HTTP_RESPONSE_INFO_TYPE;
900
901  _HTTP_RESPONSE_INFO = record
902      _Type : HTTP_RESPONSE_INFO_TYPE;
903      Length : ULONG;
904      pInfo : PVOID;
905    end;
906  HTTP_RESPONSE_INFO = _HTTP_RESPONSE_INFO;
907  PHTTP_RESPONSE_INFO = ^_HTTP_RESPONSE_INFO;
908
909const
910  HTTP_RESPONSE_INFO_FLAGS_PRESERVE_ORDER = $00000001;
911
912type
913  _HTTP_MULTIPLE_KNOWN_HEADERS = record
914      HeaderId : HTTP_HEADER_ID;
915      Flags : ULONG;
916      KnownHeaderCount : USHORT;
917      KnownHeaders : PHTTP_KNOWN_HEADER;
918    end;
919  HTTP_MULTIPLE_KNOWN_HEADERS = _HTTP_MULTIPLE_KNOWN_HEADERS;
920  PHTTP_MULTIPLE_KNOWN_HEADERS = ^_HTTP_MULTIPLE_KNOWN_HEADERS;
921
922  { the C code uses an anonymous struct here to avoid duplication... :/ }
923  _HTTP_RESPONSE_V2 = object(_HTTP_RESPONSE_V1)
924      ResponseInfoCount : USHORT;
925      pResponseInfo : PHTTP_RESPONSE_INFO;
926    end;
927  HTTP_RESPONSE_V2 = _HTTP_RESPONSE_V2;
928  PHTTP_RESPONSE_V2 = ^_HTTP_RESPONSE_V2;
929
930  HTTP_RESPONSE = HTTP_RESPONSE_V2;
931
932{%ENDREGION}
933
934{%REGION Older than Windows Vista}
935
936{type
937  HTTP_RESPONSE = HTTP_RESPONSE_V1;}
938
939{%ENDREGION}
940
941type
942  PHTTP_RESPONSE = ^HTTP_RESPONSE;
943
944  _HTTPAPI_VERSION = record
945      HttpApiMajorVersion : USHORT;
946      HttpApiMinorVersion : USHORT;
947    end;
948  HTTPAPI_VERSION = _HTTPAPI_VERSION;
949  PHTTPAPI_VERSION = ^_HTTPAPI_VERSION;
950
951const
952  HTTPAPI_VERSION_2: HTTPAPI_VERSION = ( HttpApiMajorVersion: 2; HttpApiMinorVersion: 0 );
953  HTTPAPI_VERSION_1: HTTPAPI_VERSION = ( HttpApiMajorVersion: 1; HttpApiMinorVersion: 0 );
954
955    function HTTPAPI_EQUAL_VERSION(constref version: HTTPAPI_VERSION; major, minor: USHORT): Boolean; inline;
956    function HTTPAPI_GREATER_VERSION(constref version: HTTPAPI_VERSION; major, minor: USHORT): Boolean; inline;
957    function HTTPAPI_LESS_VERSION(constref version: HTTPAPI_VERSION; major, minor: USHORT): Boolean; inline;
958    function HTTPAPI_VERSION_GREATER_OR_EQUAL(constref version: HTTPAPI_VERSION; major, minor: USHORT) : Boolean; inline;
959
960
961  type
962    _HTTP_CACHE_POLICY_TYPE = (HttpCachePolicyNocache,HttpCachePolicyUserInvalidates,
963      HttpCachePolicyTimeToLive,HttpCachePolicyMaximum
964      );
965    HTTP_CACHE_POLICY_TYPE = _HTTP_CACHE_POLICY_TYPE;
966    PHTTP_CACHE_POLICY_TYPE = ^_HTTP_CACHE_POLICY_TYPE;
967
968    _HTTP_CACHE_POLICY = record
969        Policy : HTTP_CACHE_POLICY_TYPE;
970        SecondsToLive : ULONG;
971      end;
972    HTTP_CACHE_POLICY = _HTTP_CACHE_POLICY;
973    PHTTP_CACHE_POLICY = ^_HTTP_CACHE_POLICY;
974
975  type
976    _HTTP_SERVICE_CONFIG_ID = (
977      HttpServiceConfigIPListenList,
978      HttpServiceConfigSSLCertInfo,
979      HttpServiceConfigUrlAclInfo,
980      HttpServiceConfigTimeout,
981      HttpServiceConfigCache,
982{%REGION Windows 8 and newer }
983      HttpServiceConfigSslSniCertInfo,
984      HttpServiceConfigSslCcsCertInfo,
985{%ENDREGION}
986      HttpServiceConfigMax
987      );
988    HTTP_SERVICE_CONFIG_ID = _HTTP_SERVICE_CONFIG_ID;
989    PHTTP_SERVICE_CONFIG_ID = ^_HTTP_SERVICE_CONFIG_ID;
990
991    _HTTP_SERVICE_CONFIG_QUERY_TYPE = (HttpServiceConfigQueryExact,HttpServiceConfigQueryNext,
992      HttpServiceConfigQueryMax);
993    HTTP_SERVICE_CONFIG_QUERY_TYPE = _HTTP_SERVICE_CONFIG_QUERY_TYPE;
994    PHTTP_SERVICE_CONFIG_QUERY_TYPE = ^_HTTP_SERVICE_CONFIG_QUERY_TYPE;
995
996    _HTTP_SERVICE_CONFIG_SSL_KEY = record
997        pIpPort : PSOCKADDR;
998      end;
999    HTTP_SERVICE_CONFIG_SSL_KEY = _HTTP_SERVICE_CONFIG_SSL_KEY;
1000    PHTTP_SERVICE_CONFIG_SSL_KEY = ^_HTTP_SERVICE_CONFIG_SSL_KEY;
1001
1002{%REGION Windows 8 and newer }
1003
1004  type
1005    _HTTP_SERVICE_CONFIG_SSL_SNI_KEY = record
1006        IpPort : SOCKADDR_STORAGE;
1007        Host : PWSTR;
1008      end;
1009    HTTP_SERVICE_CONFIG_SSL_SNI_KEY = _HTTP_SERVICE_CONFIG_SSL_SNI_KEY;
1010    PHTTP_SERVICE_CONFIG_SSL_SNI_KEY = ^_HTTP_SERVICE_CONFIG_SSL_SNI_KEY;
1011
1012    _HTTP_SERVICE_CONFIG_SSL_CCS_KEY = record
1013        LocalAddress : SOCKADDR_STORAGE;
1014      end;
1015    HTTP_SERVICE_CONFIG_SSL_CCS_KEY = _HTTP_SERVICE_CONFIG_SSL_CCS_KEY;
1016    PHTTP_SERVICE_CONFIG_SSL_CCS_KEY = ^_HTTP_SERVICE_CONFIG_SSL_CCS_KEY;
1017
1018{%ENDREGION}
1019
1020  type
1021    _HTTP_SERVICE_CONFIG_SSL_PARAM = record
1022        SslHashLength : ULONG;
1023        pSslHash : PVOID;
1024        AppId : GUID;
1025        pSslCertStoreName : PWSTR;
1026        DefaultCertCheckMode : DWORD;
1027        DefaultRevocationFreshnessTime : DWORD;
1028        DefaultRevocationUrlRetrievalTimeout : DWORD;
1029        pDefaultSslCtlIdentifier : PWSTR;
1030        pDefaultSslCtlStoreName : PWSTR;
1031        DefaultFlags : DWORD;
1032      end;
1033    HTTP_SERVICE_CONFIG_SSL_PARAM = _HTTP_SERVICE_CONFIG_SSL_PARAM;
1034    PHTTP_SERVICE_CONFIG_SSL_PARAM = ^_HTTP_SERVICE_CONFIG_SSL_PARAM;
1035
1036  const
1037    HTTP_SERVICE_CONFIG_SSL_FLAG_USE_DS_MAPPER = $00000001;
1038    HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT = $00000002;
1039
1040{%REGION Older than Windows Vista }
1041
1042  const
1043    HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER = $00000004;
1044
1045{%ENDREGION}
1046
1047  const
1048    HTTP_SERVICE_CONFIG_SSL_FLAG_REJECT = $00000008;
1049
1050  type
1051    _HTTP_SERVICE_CONFIG_SSL_SET = record
1052        KeyDesc : HTTP_SERVICE_CONFIG_SSL_KEY;
1053        ParamDesc : HTTP_SERVICE_CONFIG_SSL_PARAM;
1054      end;
1055    HTTP_SERVICE_CONFIG_SSL_SET = _HTTP_SERVICE_CONFIG_SSL_SET;
1056    PHTTP_SERVICE_CONFIG_SSL_SET = ^_HTTP_SERVICE_CONFIG_SSL_SET;
1057
1058{%REGION Windows 8 and newer}
1059
1060  type
1061    _HTTP_SERVICE_CONFIG_SSL_SNI_SET = record
1062        KeyDesc : HTTP_SERVICE_CONFIG_SSL_SNI_KEY;
1063        ParamDesc : HTTP_SERVICE_CONFIG_SSL_PARAM;
1064      end;
1065    HTTP_SERVICE_CONFIG_SSL_SNI_SET = _HTTP_SERVICE_CONFIG_SSL_SNI_SET;
1066    PHTTP_SERVICE_CONFIG_SSL_SNI_SET = ^_HTTP_SERVICE_CONFIG_SSL_SNI_SET;
1067
1068    _HTTP_SERVICE_CONFIG_SSL_CCS_SET = record
1069        KeyDesc : HTTP_SERVICE_CONFIG_SSL_CCS_KEY;
1070        ParamDesc : HTTP_SERVICE_CONFIG_SSL_PARAM;
1071      end;
1072    HTTP_SERVICE_CONFIG_SSL_CCS_SET = _HTTP_SERVICE_CONFIG_SSL_CCS_SET;
1073    PHTTP_SERVICE_CONFIG_SSL_CCS_SET = ^_HTTP_SERVICE_CONFIG_SSL_CCS_SET;
1074
1075{%ENDREGION}
1076
1077  type
1078    _HTTP_SERVICE_CONFIG_SSL_QUERY = record
1079        QueryDesc : HTTP_SERVICE_CONFIG_QUERY_TYPE;
1080        KeyDesc : HTTP_SERVICE_CONFIG_SSL_KEY;
1081        dwToken : DWORD;
1082      end;
1083    HTTP_SERVICE_CONFIG_SSL_QUERY = _HTTP_SERVICE_CONFIG_SSL_QUERY;
1084    PHTTP_SERVICE_CONFIG_SSL_QUERY = ^_HTTP_SERVICE_CONFIG_SSL_QUERY;
1085
1086{%REGION Windows 8 and newer }
1087
1088  type
1089    _HTTP_SERVICE_CONFIG_SSL_SNI_QUERY = record
1090        QueryDesc : HTTP_SERVICE_CONFIG_QUERY_TYPE;
1091        KeyDesc : HTTP_SERVICE_CONFIG_SSL_SNI_KEY;
1092        dwToken : DWORD;
1093      end;
1094    HTTP_SERVICE_CONFIG_SSL_SNI_QUERY = _HTTP_SERVICE_CONFIG_SSL_SNI_QUERY;
1095    PHTTP_SERVICE_CONFIG_SSL_SNI_QUERY = ^_HTTP_SERVICE_CONFIG_SSL_SNI_QUERY;
1096
1097    _HTTP_SERVICE_CONFIG_SSL_CCS_QUERY = record
1098        QueryDesc : HTTP_SERVICE_CONFIG_QUERY_TYPE;
1099        KeyDesc : HTTP_SERVICE_CONFIG_SSL_CCS_KEY;
1100        dwToken : DWORD;
1101      end;
1102    HTTP_SERVICE_CONFIG_SSL_CCS_QUERY = _HTTP_SERVICE_CONFIG_SSL_CCS_QUERY;
1103    PHTTP_SERVICE_CONFIG_SSL_CCS_QUERY = ^_HTTP_SERVICE_CONFIG_SSL_CCS_QUERY;
1104
1105{%ENDREGION}
1106
1107  type
1108    _HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM = record
1109        AddrLength : USHORT;
1110        pAddress : PSOCKADDR;
1111      end;
1112    HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM = _HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM;
1113    PHTTP_SERVICE_CONFIG_IP_LISTEN_PARAM = ^_HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM;
1114
1115    _HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY = record
1116        AddrCount : ULONG;
1117        AddrList : array[0..(ANYSIZE_ARRAY)-1] of SOCKADDR_STORAGE;
1118      end;
1119    HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY = _HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY;
1120    PHTTP_SERVICE_CONFIG_IP_LISTEN_QUERY = ^_HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY;
1121
1122    _HTTP_SERVICE_CONFIG_URLACL_KEY = record
1123        pUrlPrefix : PWSTR;
1124      end;
1125    HTTP_SERVICE_CONFIG_URLACL_KEY = _HTTP_SERVICE_CONFIG_URLACL_KEY;
1126    PHTTP_SERVICE_CONFIG_URLACL_KEY = ^_HTTP_SERVICE_CONFIG_URLACL_KEY;
1127
1128    _HTTP_SERVICE_CONFIG_URLACL_PARAM = record
1129        pStringSecurityDescriptor : PWSTR;
1130      end;
1131    HTTP_SERVICE_CONFIG_URLACL_PARAM = _HTTP_SERVICE_CONFIG_URLACL_PARAM;
1132    PHTTP_SERVICE_CONFIG_URLACL_PARAM = ^_HTTP_SERVICE_CONFIG_URLACL_PARAM;
1133
1134    _HTTP_SERVICE_CONFIG_URLACL_SET = record
1135        KeyDesc : HTTP_SERVICE_CONFIG_URLACL_KEY;
1136        ParamDesc : HTTP_SERVICE_CONFIG_URLACL_PARAM;
1137      end;
1138    HTTP_SERVICE_CONFIG_URLACL_SET = _HTTP_SERVICE_CONFIG_URLACL_SET;
1139    PHTTP_SERVICE_CONFIG_URLACL_SET = ^_HTTP_SERVICE_CONFIG_URLACL_SET;
1140
1141    _HTTP_SERVICE_CONFIG_URLACL_QUERY = record
1142        QueryDesc : HTTP_SERVICE_CONFIG_QUERY_TYPE;
1143        KeyDesc : HTTP_SERVICE_CONFIG_URLACL_KEY;
1144        dwToken : DWORD;
1145      end;
1146    HTTP_SERVICE_CONFIG_URLACL_QUERY = _HTTP_SERVICE_CONFIG_URLACL_QUERY;
1147    PHTTP_SERVICE_CONFIG_URLACL_QUERY = ^_HTTP_SERVICE_CONFIG_URLACL_QUERY;
1148
1149    _HTTP_SERVICE_CONFIG_CACHE_KEY = (MaxCacheResponseSize := 0,CacheRangeChunkSize
1150      );
1151    HTTP_SERVICE_CONFIG_CACHE_KEY = _HTTP_SERVICE_CONFIG_CACHE_KEY;
1152    PHTTP_SERVICE_CONFIG_CACHE_KEY = ^_HTTP_SERVICE_CONFIG_CACHE_KEY;
1153
1154    HTTP_SERVICE_CONFIG_CACHE_PARAM = ULONG;
1155    PHTTP_SERVICE_CONFIG_CACHE_PARAM = ^HTTP_SERVICE_CONFIG_CACHE_PARAM;
1156
1157    HTTP_SERVICE_CONFIG_CACHE_SET = record
1158        KeyDesc : HTTP_SERVICE_CONFIG_CACHE_KEY;
1159        ParamDesc : HTTP_SERVICE_CONFIG_CACHE_PARAM;
1160      end;
1161    PHTTP_SERVICE_CONFIG_CACHE_SET = ^HTTP_SERVICE_CONFIG_CACHE_SET;
1162
1163{$ifdef InLazIDE}
1164{$macro on}
1165{$define winapi:=stdcall}
1166{$endif}
1167
1168function HttpInitialize(Version: HTTPAPI_VERSION; Flags: ULONG; pReserved: PVOID): ULONG; WinApi; external External_library name 'HttpInitialize';
1169function HttpTerminate(Flags: ULONG; pReserved: PVOID): ULONG; WinApi; external External_library name 'HttpTerminate';
1170function HttpCreateHttpHandle(RequestQueueHandle: PHANDLE; Reserved: ULONG): ULONG; WinApi; external External_library name 'HttpCreateHttpHandle';
1171function HttpCreateHttpHandle(out RequestQueueHandle: HANDLE; Reserved: ULONG): ULONG; WinApi; external External_library name 'HttpCreateHttpHandle';
1172
1173{%REGION Windows Vista and newer }
1174
1175function HttpCreateRequestQueue(Version: HTTPAPI_VERSION; Name: PCWSTR; SecurityAttributes: PSECURITYATTRIBUTES; Flags: ULONG; RequestQueueHandle: PHANDLE): ULONG; WinApi; external External_library name 'HttpCreateRequestQueue';
1176function HttpCreateRequestQueue(Version: HTTPAPI_VERSION; Name: PCWSTR; SecurityAttributes: PSECURITYATTRIBUTES; Flags: ULONG; out RequestQueueHandle: HANDLE): ULONG; WinApi; external External_library name 'HttpCreateRequestQueue';
1177function HttpCloseRequestQueue(RequestQueueHandle: HANDLE): ULONG; WinApi; external External_library name 'HttpCloseRequestQueue';
1178function HttpSetRequestQueueProperty(RequestQueueHandle: HANDLE; _Property: HTTP_SERVER_PROPERTY; PropertyInformation: PVOID; PropertyInformationLength: ULONG; Reserved1: ULONG; Reserved2: PVOID): ULONG; WinApi; external External_library name 'HttpSetRequestQueueProperty';
1179function HttpQueryRequestQueueProperty(RequestQueueProperty: HANDLE; _Property: HTTP_SERVER_PROPERTY; PropertyInformation: PVOID; PropertyInformationLength: ULONG; Reserved1: ULONG; ReturnLength: PULONG; Reserved2: PVOID): ULONG; WinApi; external External_library name 'HttpQueryRequestQueueProperty';
1180function HttpShutdownRequestQueue(RequestQueueHandle: HANDLE): ULONG; WinApi; external External_library name 'HttpShutdownRequestQueue';
1181
1182{%ENDREGION}
1183
1184function HttpReceiveClientCertificate(RequestQueueHandle: HANDLE; ConnectionId: HTTP_CONNECTION_ID; Flags: ULONG; SslClientCertInfo: PHTTP_SSL_CLIENT_CERT_INFO; SslClientCertInfoSize: ULONG; BytesReceived: PULONG; Overlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpReceiveClientCertificate';
1185
1186{%REGION Windows Vista and newer }
1187
1188function HttpCreateServerSession(Version: HTTPAPI_VERSION; ServerSessionId: PHTTP_SERVER_SESSION_ID; Reserved: ULONG): ULONG; WinApi; external External_library name 'HttpCreateServerSession';
1189function HttpCreateServerSession(Version: HTTPAPI_VERSION; out ServerSessionId: HTTP_SERVER_SESSION_ID; Reserved: ULONG): ULONG; WinApi; external External_library name 'HttpCreateServerSession';
1190function HttpCloseServerSession(ServerSessionId: HTTP_SERVER_SESSION_ID): ULONG; WinApi; external External_library name 'HttpCloseServerSession';
1191function HttpQueryServerSessionProperty(ServerSessionId: HTTP_SERVER_SESSION_ID; _Property: HTTP_SERVER_PROPERTY; PropertyInformation: PVOID; PropertyInformationLength: ULONG; ReturnLength: PULONG): ULONG; WinApi; external External_library name 'HttpQueryServerSessionProperty';
1192function HttpSetServerSessionProperty(ServerSessionId: HTTP_SERVER_SESSION_ID; _Property: HTTP_SERVER_PROPERTY; PropertyInformation: PVOID; PropertyInformationLength: ULONG): ULONG; WinApi; external External_library name 'HttpSetServerSessionProperty';
1193
1194{%ENDREGION}
1195
1196function HttpAddUrl(RequestQueueHandle: HANDLE; FullyQualifiedUrl: PCWSTR; Reserved: PVOID): ULONG; WinApi; external External_library name 'HttpAddUrl';
1197function HttpRemoveUrl(RequestQueueHandle: HANDLE; FullyQualifiedUrl: PCWSTR): ULONG; WinApi; external External_library name 'HttpRemoveUrl';
1198
1199{%REGION Windows Vista and newer }
1200
1201function HttpCreateUrlGroup(ServerSessionId: HTTP_SERVER_SESSION_ID; pUrlGroupId: PHTTP_URL_GROUP_ID; Reserved: ULONG): ULONG; WinApi; external External_library name 'HttpCreateUrlGroup';
1202function HttpCreateUrlGroup(ServerSessionId: HTTP_SERVER_SESSION_ID; out pUrlGroupId: HTTP_URL_GROUP_ID; Reserved: ULONG): ULONG; WinApi; external External_library name 'HttpCreateUrlGroup';
1203function HttpCloseUrlGroup(UrlGroupId: HTTP_URL_GROUP_ID): ULONG; WinApi; external External_library name 'HttpCloseUrlGroup';
1204function HttpAddUrlToUrlGroup(UrlGroupId: HTTP_URL_GROUP_ID; pFullyQualifiedUrl: PCWSTR; UrlContext: HTTP_URL_CONTEXT; Reserved: ULONG): ULONG; WinApi; external External_library name 'HttpAddUrlToUrlGroup';
1205function HttpRemoveUrlFromUrlGroup(UrlGroupId: HTTP_URL_GROUP_ID; pFullyQualifiedUrl: PCWSTR; Flags: ULONG): ULONG; WinApi; external External_library name 'HttpRemoveUrlFromUrlGroup';
1206function HttpSetUrlGroupProperty(UrlGroupId: HTTP_URL_GROUP_ID; _Property: HTTP_SERVER_PROPERTY; PropertyInformation: PVOID; PropertyInformationLength: ULONG): ULONG; WinApi; external External_library name 'HttpSetUrlGroupProperty';
1207function HttpQueryUrlGroupProperty(UrlGroupId: HTTP_URL_GROUP_ID; _Property: HTTP_SERVER_PROPERTY; PropertyInformation: PVOID; PropertyInformationLength: ULONG; ReturnLength: PULONG): ULONG; WinApi; external External_library name 'HttpQueryUrlGroupProperty';
1208
1209{%ENDREGION}
1210
1211{%REGION Windows 8 and newer }
1212
1213function HttpPrepareUrl(Reserved: PVOID; Flags: ULONG; Url: PCWSTR; out PreparedUrl: PWSTR): ULONG; WinApi; external External_library name 'HttpPrepareUrl';
1214
1215{%ENDREGION}
1216
1217function HttpReceiveHttpRequest(RequestQueueHandle: HANDLE; RequestId: HTTP_REQUEST_ID; Flags: ULONG; RequestBuffer: PHTTP_REQUEST; RequestBufferLength: ULONG; BytesReturned: PULONG; Overlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpReceiveHttpRequest';
1218function HttpReceiveRequestEntityBody(RequestQueueHandle: HANDLE; RequestId: HTTP_REQUEST_ID; Flags: ULONG; EntityBuffer: PVOID; EntityBufferLength: ULONG; BytesReturned: PULONG; Overlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpReceiveRequestEntityBody';
1219
1220{%REGION Windows Vista and newer }
1221
1222function HttpSendHttpResponse(RequestQueueHandle: HANDLE; RequestId: HTTP_REQUEST_ID; Flags: ULONG; HttpResponse: PHTTP_RESPONSE; CachePolicy: PHTTP_CACHE_POLICY; BytesSent: PULONG; Reserved1: PVOID; Reserved2: ULONG; Overlapped: LPOVERLAPPED; LogData: PHTTP_LOG_DATA): ULONG; WinApi; external External_library name 'HttpSendHttpResponse';
1223
1224{%ENDREGION}
1225
1226{%REGION Older than Windows Vista }
1227
1228//function HttpSendHttpResponse(ReqQueueHandle: HANDLE; RequestId: HTTP_REQUEST_ID; Flags: ULONG; pHttpResponse: PHTTP_RESPONSE; pReserved1: PVOID; pBytesSent: PULONG; pReserved2: PVOID; Reserved3: ULONG; Overlapped: LPOVERLAPPED; pReserved4: PVOID): ULONG; WinApi; external External_library name 'HttpSendHttpResponse';
1229
1230{%ENDREGION}
1231
1232{%REGION Windows Vista and newer }
1233
1234function HttpSendResponseEntityBody(RequestQueueHandle: HANDLE; RequestId: HTTP_REQUEST_ID; Flags: ULONG; EntityChunkCount: USHORT; EntityChunks: PHTTP_DATA_CHUNK; BytesSent: PULONG; Reserved1: PVOID; Reserved2: PULONG; Overlapped: LPOVERLAPPED; LogData: PHTTP_LOG_DATA): ULONG; WinApi; external External_library name 'HttpSendResponseEntityBody';
1235
1236{%ENDREGION}
1237
1238{%REGION Older than Windows Vista }
1239
1240//function HttpSendResponseEntityBody(ReqQueueHandle: HANDLE; RequestId: HTTP_REQUEST_ID; Flags: ULONG; EntityChunkCount: USHORT; pEntityChunks: PHTTP_DATA_CHUNK; pBytesSent: PULONG; pReserved1: PVOID; Reserved2: PULONG; Overlapped: LPOVERLAPPED; pReserved3: PVOID): ULONG; WinApi; external External_library name 'HttpSendResponseEntityBody';
1241
1242{%ENDREGION}
1243
1244function HttpDeclarePush(RequestQueueHandle: HANDLE; RequestId: HTTP_REQUEST_ID; Verb: HTTP_VERB; Path: PCWSTR; Query: PCSTR; Headers: PHTTP_REQUEST_HEADERS): ULONG; WinApi; external External_library name 'HttpDeclarePush';
1245function HttpWaitForDisconnect(RequestQueueHandle: HANDLE; ConnectionId: HTTP_CONNECTION_ID; Overlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpWaitForDisconnect';
1246
1247{%REGION Windows Vista and newer }
1248
1249function HttpWaitForDisconnectEx(RequestQueueHandle: HANDLE; ConnectionId: HTTP_CONNECTION_ID; Reserved: ULONG; Overlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpWaitForDisconnectEx';
1250function HttpCancelHttpRequest(RequestQueueHandle: HANDLE; RequestId: HTTP_REQUEST_ID; Overlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpCancelHttpRequest';
1251function HttpWaitForDemandStart(RequestQueueHandle: HANDLE; Overlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpWaitForDemandStart';
1252
1253{%ENDREGION}
1254
1255function HttpFlushResponseCache(RequestQueueHandle: HANDLE; UrlPrefix: PCWSTR; Flags: ULONG; Overlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpFlushResponseCache';
1256function HttpAddFragmentToCache(RequestQueueHandle: HANDLE; UrlPrefix: PCWSTR; DataChunk: PHTTP_DATA_CHUNK; CachePolicy: PHTTP_CACHE_POLICY; Overlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpAddFragmentToCache';
1257function HttpReadFragmentFromCache(RequestQueueHandle: HANDLE; UrlPrefix: PCWSTR; ByteRange: PHTTP_BYTE_RANGE; Buffer: PVOID; BufferLength: ULONG; BytesRead: PULONG; Overlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpReadFragmentFromCache';
1258
1259function HttpSetServiceConfiguration(ServiceHandle: HANDLE; ConfigId: HTTP_SERVICE_CONFIG_ID; pConfigInformation: PVOID; ConfigInformationLength: ULONG; pOverlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpSetServiceConfiguration';
1260function HttpDeleteServiceConfiguration(ServiceHandle: HANDLE; ConfigId: HTTP_SERVICE_CONFIG_ID; pConfigInformation: PVOID; ConfigInformationLength: ULONG; pOverlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpDeleteServiceConfiguration';
1261function HttpQueryServiceConfiguration(ServiceHandle: HANDLE; ConfigId: HTTP_SERVICE_CONFIG_ID; pInput: PVOID; InputLength: ULONG; pOutput: PVOID; OutputLength: ULONg; pReturnLength: PULONG; pOverlapped: LPOVERLAPPED): ULONG; WinApi; external External_library name 'HttpQueryServiceConfiguration';
1262{ this is only available from Windows 10 version 1703 on, so handle that in the
1263  implementation; ideally this would be marked with "delayed" }
1264function HttpUpdateServiceConfiguration(ServiceHandle: HANDLE; ConfigId: HTTP_SERVICE_CONFIG_ID; ConfigInfo: PVOID; ConfigInfoLength: ULONG; Overlapped: LPOVERLAPPED): ULONG; WinApi;
1265
1266implementation
1267
1268  uses
1269    SysUtils;
1270
1271  function Present(var a : _HTTP_PROPERTY_FLAGS) : ULONG;
1272    begin
1273      Present:=(a.flag0 and bm__HTTP_PROPERTY_FLAGS_Present) shr bp__HTTP_PROPERTY_FLAGS_Present;
1274    end;
1275
1276  procedure set_Present(var a : _HTTP_PROPERTY_FLAGS; __Present : ULONG);
1277    begin
1278      a.flag0:=a.flag0 or ((__Present shl bp__HTTP_PROPERTY_FLAGS_Present) and bm__HTTP_PROPERTY_FLAGS_Present);
1279    end;
1280
1281  function HTTP_IS_NULL_ID(pid: HTTP_OPAQUE_ID): Boolean;
1282    begin
1283      HTTP_IS_NULL_ID := pid = HTTP_NULL_ID;
1284    end;
1285
1286  procedure HTTP_SET_NULL_ID(var pid: HTTP_OPAQUE_ID);
1287    begin
1288      pid := HTTP_NULL_ID;
1289    end;
1290
1291  procedure HTTP_SET_VERSION(out version: HTTP_VERSION; major, minor: USHORT);
1292    begin
1293      version.MajorVersion := major;
1294      version.MinorVersion := minor;
1295    end;
1296
1297  function HTTP_EQUAL_VERSION(constref version: HTTP_VERSION; major, minor: USHORT): Boolean;
1298    begin
1299      HTTP_EQUAL_VERSION := (version.MajorVersion = major) and (version.MinorVersion = minor);
1300    end;
1301
1302  function HTTP_GREATER_VERSION(constref version: HTTP_VERSION; major, minor: USHORT): Boolean;
1303    begin
1304      HTTP_GREATER_VERSION := (version.MajorVersion > major) or ((version.MajorVersion = major) and (version.MinorVersion > minor));
1305    end;
1306
1307  function HTTP_LESS_VERSION(constref version: HTTP_VERSION; major, minor: USHORT): Boolean;
1308    begin
1309      HTTP_LESS_VERSION := (version.MajorVersion < major) or ((version.MajorVersion = major) and (version.MinorVersion < minor));
1310    end;
1311
1312  function HTTP_NOT_EQUAL_VERSION(constref version: HTTP_VERSION; major, minor : USHORT) : Boolean;
1313    begin
1314      HTTP_NOT_EQUAL_VERSION := not (HTTP_EQUAL_VERSION(version, major, minor));
1315    end;
1316
1317  function HTTP_GREATER_EQUAL_VERSION(constref version: HTTP_VERSION; major, minor : USHORT) : Boolean;
1318    begin
1319      HTTP_GREATER_EQUAL_VERSION := not (HTTP_LESS_VERSION(version, major, minor));
1320    end;
1321
1322  function HTTP_LESS_EQUAL_VERSION(constref version: HTTP_VERSION; major, minor : USHORT) : Boolean;
1323    begin
1324      HTTP_LESS_EQUAL_VERSION := not (HTTP_GREATER_VERSION(version, major, minor));
1325    end;
1326
1327  function HTTPAPI_EQUAL_VERSION(constref version: HTTPAPI_VERSION; major, minor : USHORT) : Boolean;
1328    begin
1329      HTTPAPI_EQUAL_VERSION := (version.HttpApiMajorVersion = major) and (version.HttpApiMinorVersion = minor);
1330    end;
1331
1332  function HTTPAPI_GREATER_VERSION(constref version: HTTPAPI_VERSION; major, minor: USHORT): Boolean;
1333    begin
1334      HTTPAPI_GREATER_VERSION := (version.HttpApiMajorVersion > major) or ((version.HttpApiMajorVersion = major) and (version.HttpApiMinorVersion > minor));
1335    end;
1336
1337  function HTTPAPI_LESS_VERSION(constref version: HTTPAPI_VERSION; major, minor: USHORT): Boolean;
1338    begin
1339      HTTPAPI_LESS_VERSION := (version.HttpApiMajorVersion < major) or ((version.HttpApiMajorVersion = major) and (version.HttpApiMinorVersion < minor));
1340    end;
1341
1342  function HTTPAPI_VERSION_GREATER_OR_EQUAL(constref version: HTTPAPI_VERSION; major, minor : USHORT) : Boolean;
1343    begin
1344      HTTPAPI_VERSION_GREATER_OR_EQUAL := not (HTTPAPI_LESS_VERSION(version,major,minor));
1345    end;
1346
1347  type
1348    TUpdateServiceConfigurationFunc = function(ServiceHandle: HANDLE; ConfigId: HTTP_SERVICE_CONFIG_ID; ConfigInfo: PVOID; ConfigInfoLength: ULONG; Overlapped: LPOVERLAPPED): ULONG; WinApi;
1349
1350  var
1351    gLibCS: CRITICAL_SECTION;
1352    gLibHandle: THandle = NilHandle;
1353    gUpdateServiceConfigurationChecked: Boolean = False;
1354    gUpdateServiceConfigurationFunc: TUpdateServiceConfigurationFunc = Nil;
1355
1356  function HttpUpdateServiceConfiguration(ServiceHandle: HANDLE; ConfigId: HTTP_SERVICE_CONFIG_ID; ConfigInfo: PVOID; ConfigInfoLength: ULONG; Overlapped: LPOVERLAPPED): ULONG; WinApi;
1357    begin
1358      if not gUpdateServiceConfigurationChecked then begin
1359        EnterCriticalSection(gLibCS);
1360        try
1361          if not gUpdateServiceConfigurationChecked then begin
1362            gLibHandle := LoadLibrary(External_library);
1363            if gLibHandle <> NilHandle then
1364              gUpdateServiceConfigurationFunc := TUpdateServiceConfigurationFunc(GetProcAddress(gLibHandle, 'HttpUpdateServiceConfiguration'))
1365            else begin
1366              FreeLibrary(gLibHandle);
1367              gLibHandle := NilHandle;
1368            end;
1369            gUpdateServiceConfigurationChecked := True;
1370          end;
1371        finally
1372          LeaveCriticalSection(gLibCS);
1373        end;
1374      end;
1375      if not Assigned(gUpdateServiceConfigurationFunc) then
1376        raise EOSError.Create(SysErrorMessage(ERROR_PROC_NOT_FOUND));
1377      Result := gUpdateServiceConfigurationFunc(ServiceHandle, ConfigId, ConfigInfo, ConfigInfoLength, Overlapped);
1378    end;
1379
1380initialization
1381  InitializeCriticalSection(gLibCS);
1382finalization
1383  DoneCriticalSection(gLibCS);
1384  if gLibHandle <> NilHandle then
1385    FreeLibrary(gLibHandle);
1386end.
1387