Reactos
1/*
2 * HTTP Server API definitions
3 *
4 * Copyright (C) 2009 Andrey Turkin
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#ifndef __WINE_HTTP_H
22#define __WINE_HTTP_H
23
24#include <winsock2.h>
25#include <ws2tcpip.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31typedef struct _HTTPAPI_VERSION
32{
33 USHORT HttpApiMajorVersion;
34 USHORT HttpApiMinorVersion;
35} HTTPAPI_VERSION, *PHTTPAPI_VERSION;
36
37#define HTTPAPI_VERSION_1 {1,0}
38#define HTTPAPI_VERSION_2 {2,0}
39
40#define HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING 0x00000001
41#define HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER 0x00000002
42
43#define HTTP_INITIALIZE_SERVER 0x00000001
44#define HTTP_INITIALIZE_CONFIG 0x00000002
45
46#define HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY 0x00000001
47#define HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY 0x00000002
48
49#define HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS 0x00000001
50#define HTTP_REQUEST_FLAG_IP_ROUTED 0x00000002
51#define HTTP_REQUEST_FLAG_HTTP2 0x00000004
52
53#define HTTP_SEND_RESPONSE_FLAG_DISCONNECT 0x00000001
54#define HTTP_SEND_RESPONSE_FLAG_MORE_DATA 0x00000002
55#define HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA 0x00000004
56#define HTTP_SEND_RESPONSE_FLAG_ENABLE_NAGLING 0x00000008
57#define HTTP_SEND_RESPONSE_FLAG_PROCESS_RANGES 0x00000020
58#define HTTP_SEND_RESPONSE_FLAG_OPAQUE 0x00000040
59
60#define HTTP_URL_FLAG_REMOVE_ALL 0x0000001
61
62typedef enum _HTTP_SERVICE_CONFIG_ID
63{
64 HttpServiceConfigIPListenList,
65 HttpServiceConfigSSLCertInfo,
66 HttpServiceConfigUrlAclInfo,
67 HttpServiceConfigTimeout,
68 HttpServiceConfigMax
69} HTTP_SERVICE_CONFIG_ID, *PHTTP_SERVICE_CONFIG_ID;
70
71#define HTTP_NULL_ID ((ULONGLONG)0)
72
73typedef ULONGLONG HTTP_OPAQUE_ID, *PHTTP_OPAQUE_ID;
74typedef HTTP_OPAQUE_ID HTTP_CONNECTION_ID, *PHTTP_CONNECTION_ID;
75typedef HTTP_OPAQUE_ID HTTP_RAW_CONNECTION_ID, *PHTTP_RAW_CONNECTION_ID;
76typedef HTTP_OPAQUE_ID HTTP_REQUEST_ID, *PHTTP_REQUEST_ID;
77typedef HTTP_OPAQUE_ID HTTP_SERVER_SESSION_ID, *PHTTP_SERVER_SESSION_ID;
78typedef HTTP_OPAQUE_ID HTTP_URL_GROUP_ID, *PHTTP_URL_GROUP_ID;
79typedef ULONGLONG HTTP_URL_CONTEXT;
80
81typedef struct _HTTP_VERSION
82{
83 USHORT MajorVersion;
84 USHORT MinorVersion;
85} HTTP_VERSION, *PHTTP_VERSION;
86
87typedef enum _HTTP_VERB
88{
89 HttpVerbUnparsed = 0,
90 HttpVerbUnknown,
91 HttpVerbInvalid,
92 HttpVerbOPTIONS,
93 HttpVerbGET,
94 HttpVerbHEAD,
95 HttpVerbPOST,
96 HttpVerbPUT,
97 HttpVerbDELETE,
98 HttpVerbTRACE,
99 HttpVerbCONNECT,
100 HttpVerbTRACK,
101 HttpVerbMOVE,
102 HttpVerbCOPY,
103 HttpVerbPROPFIND,
104 HttpVerbPROPPATCH,
105 HttpVerbMKCOL,
106 HttpVerbLOCK,
107 HttpVerbUNLOCK,
108 HttpVerbSEARCH,
109 HttpVerbMaximum,
110} HTTP_VERB, *PHTTP_VERB;
111
112typedef struct _HTTP_COOKED_URL
113{
114 USHORT FullUrlLength;
115 USHORT HostLength;
116 USHORT AbsPathLength;
117 USHORT QueryStringLength;
118 const WCHAR *pFullUrl;
119 const WCHAR *pHost;
120 const WCHAR *pAbsPath;
121 const WCHAR *pQueryString;
122} HTTP_COOKED_URL, *PHTTP_COOKED_URL;
123
124typedef struct _HTTP_TRANSPORT_ADDRESS
125{
126 SOCKADDR *pRemoteAddress;
127 SOCKADDR *pLocalAddress;
128} HTTP_TRANSPORT_ADDRESS, *PHTTP_TRANSPORT_ADDRESS;
129
130typedef struct _HTTP_UNKNOWN_HEADER
131{
132 USHORT NameLength;
133 USHORT RawValueLength;
134 const char *pName;
135 const char *pRawValue;
136} HTTP_UNKNOWN_HEADER, *PHTTP_UNKNOWN_HEADER;
137
138typedef struct _HTTP_KNOWN_HEADER
139{
140 USHORT RawValueLength;
141 const char *pRawValue;
142} HTTP_KNOWN_HEADER, *PHTTP_KNOWN_HEADER;
143
144typedef enum _HTTP_HEADER_ID
145{
146 HttpHeaderCacheControl = 0,
147 HttpHeaderConnection = 1,
148 HttpHeaderDate = 2,
149 HttpHeaderKeepAlive = 3,
150 HttpHeaderPragma = 4,
151 HttpHeaderTrailer = 5,
152 HttpHeaderTransferEncoding = 6,
153 HttpHeaderUpgrade = 7,
154 HttpHeaderVia = 8,
155 HttpHeaderWarning = 9,
156 HttpHeaderAllow = 10,
157 HttpHeaderContentLength = 11,
158 HttpHeaderContentType = 12,
159 HttpHeaderContentEncoding = 13,
160 HttpHeaderContentLanguage = 14,
161 HttpHeaderContentLocation = 15,
162 HttpHeaderContentMd5 = 16,
163 HttpHeaderContentRange = 17,
164 HttpHeaderExpires = 18,
165 HttpHeaderLastModified = 19,
166
167 HttpHeaderAccept = 20,
168 HttpHeaderAcceptCharset = 21,
169 HttpHeaderAcceptEncoding = 22,
170 HttpHeaderAcceptLanguage = 23,
171 HttpHeaderAuthorization = 24,
172 HttpHeaderCookie = 25,
173 HttpHeaderExpect = 26,
174 HttpHeaderFrom = 27,
175 HttpHeaderHost = 28,
176 HttpHeaderIfMatch = 29,
177 HttpHeaderIfModifiedSince = 30,
178 HttpHeaderIfNoneMatch = 31,
179 HttpHeaderIfRange = 32,
180 HttpHeaderIfUnmodifiedSince = 33,
181 HttpHeaderMaxForwards = 34,
182 HttpHeaderProxyAuthorization = 35,
183 HttpHeaderReferer = 36,
184 HttpHeaderRange = 37,
185 HttpHeaderTe = 38,
186 HttpHeaderTranslate = 39,
187 HttpHeaderUserAgent = 40,
188 HttpHeaderRequestMaximum = 41,
189
190 HttpHeaderAcceptRanges = 20,
191 HttpHeaderAge = 21,
192 HttpHeaderEtag = 22,
193 HttpHeaderLocation = 23,
194 HttpHeaderProxyAuthenticate = 24,
195 HttpHeaderRetryAfter = 25,
196 HttpHeaderServer = 26,
197 HttpHeaderSetCookie = 27,
198 HttpHeaderVary = 28,
199 HttpHeaderWwwAuthenticate = 29,
200 HttpHeaderResponseMaximum = 30,
201
202 HttpHeaderMaximum = 41,
203} HTTP_HEADER_ID, *PHTTP_HEADER_ID;
204
205typedef struct _HTTP_REQUEST_HEADERS
206{
207 USHORT UnknownHeaderCount;
208 HTTP_UNKNOWN_HEADER *pUnknownHeaders;
209 USHORT TrailerCount;
210 HTTP_UNKNOWN_HEADER *pTrailers;
211 HTTP_KNOWN_HEADER KnownHeaders[HttpHeaderRequestMaximum];
212} HTTP_REQUEST_HEADERS, *PHTTP_REQUEST_HEADERS;
213
214typedef enum _HTTP_DATA_CHUNK_TYPE
215{
216 HttpDataChunkFromMemory = 0,
217 HttpDataChunkFromFileHandle,
218 HttpDataChunkFromFragmentCache,
219 HttpDataChunkFromFragmentCacheEx,
220 HttpDataChunkMaximum,
221} HTTP_DATA_CHUNK_TYPE, *PHTTP_DATA_CHUNK_TYPE;
222
223#define HTTP_BYTE_RANGE_TO_EOF ((ULONGLONG)-1)
224
225typedef struct _HTTP_BYTE_RANGE
226{
227 ULARGE_INTEGER StartingOffset;
228 ULARGE_INTEGER Length;
229} HTTP_BYTE_RANGE, *PHTTP_BYTE_RANGE;
230
231typedef struct _HTTP_DATA_CHUNK
232{
233 HTTP_DATA_CHUNK_TYPE DataChunkType;
234 __C89_NAMELESS union
235 {
236 struct
237 {
238 void *pBuffer;
239 ULONG BufferLength;
240 } FromMemory;
241 struct
242 {
243 HTTP_BYTE_RANGE ByteRange;
244 HANDLE FileHandle;
245 } FromFileHandle;
246 struct
247 {
248 USHORT FragmentNameLength;
249 const WCHAR *pFragmentName;
250 } FromFragmentCache;
251 } DUMMYUNIONNAME;
252} HTTP_DATA_CHUNK, *PHTTP_DATA_CHUNK;
253
254typedef struct _HTTP_SSL_CLIENT_CERT_INFO
255{
256 ULONG CertFlags;
257 ULONG CertEncodedSize;
258 UCHAR *pCertEncoded;
259 HANDLE Token;
260 BOOLEAN CertDeniedByMapper;
261} HTTP_SSL_CLIENT_CERT_INFO, *PHTTP_SSL_CLIENT_CERT_INFO;
262
263typedef struct _HTTP_SSL_INFO
264{
265 USHORT ServerCertKeySize;
266 USHORT ConnectionKeySize;
267 ULONG ServerCertIssuerSize;
268 ULONG ServerCertSubjectSize;
269 const char *pServerCertIssuer;
270 const char *pServerCertSubject;
271 HTTP_SSL_CLIENT_CERT_INFO *pClientCertInfo;
272 ULONG SslClientCertNegotiated;
273} HTTP_SSL_INFO, *PHTTP_SSL_INFO;
274
275typedef struct _HTTP_REQUEST_V1
276{
277 ULONG Flags;
278 HTTP_CONNECTION_ID ConnectionId;
279 HTTP_REQUEST_ID RequestId;
280 HTTP_URL_CONTEXT UrlContext;
281 HTTP_VERSION Version;
282 HTTP_VERB Verb;
283 USHORT UnknownVerbLength;
284 USHORT RawUrlLength;
285 const char *pUnknownVerb;
286 const char *pRawUrl;
287 HTTP_COOKED_URL CookedUrl;
288 HTTP_TRANSPORT_ADDRESS Address;
289 HTTP_REQUEST_HEADERS Headers;
290 ULONGLONG BytesReceived;
291 USHORT EntityChunkCount;
292 HTTP_DATA_CHUNK *pEntityChunks;
293 HTTP_RAW_CONNECTION_ID RawConnectionId;
294 HTTP_SSL_INFO *pSslInfo;
295} HTTP_REQUEST_V1;
296
297typedef enum _HTTP_REQUEST_INFO_TYPE
298{
299 HttpRequestInfoTypeAuth = 0,
300} HTTP_REQUEST_INFO_TYPE, *PHTTP_REQUEST_INFO_TYPE;
301
302typedef struct _HTTP_REQUEST_INFO
303{
304 HTTP_REQUEST_INFO_TYPE InfoType;
305 ULONG InfoLength;
306 void *pInfo;
307} HTTP_REQUEST_INFO, *PHTTP_REQUEST_INFO;
308
309#ifdef __cplusplus
310typedef struct _HTTP_REQUEST_V2 : HTTP_REQUEST_V1
311{
312 USHORT RequestInfoCount;
313 HTTP_REQUEST_INFO *pRequestInfo;
314} HTTP_REQUEST_V2, *PHTTP_REQUEST_V2;
315#else
316typedef struct _HTTP_REQUEST_V2
317{
318 HTTP_REQUEST_V1 s;
319 USHORT RequestInfoCount;
320 HTTP_REQUEST_INFO *pRequestInfo;
321} HTTP_REQUEST_V2, *PHTTP_REQUEST_V2;
322#endif
323
324typedef HTTP_REQUEST_V2 HTTP_REQUEST, *PHTTP_REQUEST;
325
326typedef struct _HTTP_RESPONSE_HEADERS
327{
328 USHORT UnknownHeaderCount;
329 HTTP_UNKNOWN_HEADER *pUnknownHeaders;
330 USHORT TrailerCount;
331 HTTP_UNKNOWN_HEADER *pTrailers;
332 HTTP_KNOWN_HEADER KnownHeaders[HttpHeaderResponseMaximum];
333} HTTP_RESPONSE_HEADERS,*PHTTP_RESPONSE_HEADERS;
334
335typedef struct _HTTP_RESPONSE_V1
336{
337 ULONG Flags;
338 HTTP_VERSION Version;
339 USHORT StatusCode;
340 USHORT ReasonLength;
341 const char *pReason;
342 HTTP_RESPONSE_HEADERS Headers;
343 USHORT EntityChunkCount;
344 HTTP_DATA_CHUNK *pEntityChunks;
345} HTTP_RESPONSE_V1, *PHTTP_RESPONSE_V1;
346
347typedef enum _HTTP_RESPONSE_INFO_TYPE
348{
349 HttpResponseInfoTypeMultipleKnownHeaders = 0,
350 HttpResponseInfoTypeAuthenticationProperty,
351 HttpResponseInfoTypeQosProperty,
352 HttpResponseInfoTypeChannelBind,
353} HTTP_RESPONSE_INFO_TYPE, *PHTTP_RESPONSE_INFO_TYPE;
354
355typedef struct _HTTP_RESPONSE_INFO
356{
357 HTTP_RESPONSE_INFO_TYPE Type;
358 ULONG Length;
359 void *pInfo;
360} HTTP_RESPONSE_INFO, *PHTTP_RESPONSE_INFO;
361
362#ifdef __cplusplus
363typedef struct _HTTP_RESPONSE_V2 : HTTP_RESPONSE_V1
364{
365 USHORT ResponseInfoCount;
366 HTTP_RESPONSE_INFO *pResponseInfo;
367} HTTP_RESPONSE_V2, *PHTTP_RESPONSE_V2;
368#else
369typedef struct _HTTP_RESPONSE_V2
370{
371 HTTP_RESPONSE_V1 s;
372 USHORT ResponseInfoCount;
373 HTTP_RESPONSE_INFO *pResponseInfo;
374} HTTP_RESPONSE_V2, *PHTTP_RESPONSE_V2;
375#endif
376
377typedef HTTP_RESPONSE_V2 HTTP_RESPONSE, *PHTTP_RESPONSE;
378
379typedef enum _HTTP_CACHE_POLICY_TYPE
380{
381 HttpCachePolicyNocache,
382 HttpCachePolicyUserInvalidates,
383 HttpCachePolicyTimeToLive,
384 HttpCachePolicyMaximum,
385} HTTP_CACHE_POLICY_TYPE, *PHTTP_CACHE_POLICY_TYPE;
386
387typedef struct _HTTP_CACHE_POLICY
388{
389 HTTP_CACHE_POLICY_TYPE Policy;
390 ULONG SecondsToLive;
391} HTTP_CACHE_POLICY, *PHTTP_CACHE_POLICY;
392
393typedef enum _HTTP_LOG_DATA_TYPE
394{
395 HttpLogDataTypeFields = 0,
396} HTTP_LOG_DATA_TYPE, *PHTTP_LOG_DATA_TYPE;
397
398typedef struct _HTTP_LOG_DATA
399{
400 HTTP_LOG_DATA_TYPE Type;
401} HTTP_LOG_DATA, *PHTTP_LOG_DATA;
402
403typedef enum _HTTP_SERVER_PROPERTY
404{
405 HttpServerAuthenticationProperty,
406 HttpServerLoggingProperty,
407 HttpServerQosProperty,
408 HttpServerTimeoutsProperty,
409 HttpServerQueueLengthProperty,
410 HttpServerStateProperty,
411 HttpServer503VerbosityProperty,
412 HttpServerBindingProperty,
413 HttpServerExtendedAuthenticationProperty,
414 HttpServerListenEndpointProperty,
415 HttpServerChannelBindProperty,
416 HttpServerProtectionLevelProperty,
417} HTTP_SERVER_PROPERTY, *PHTTP_SERVER_PROPERTY;
418
419typedef struct _HTTP_PROPERTY_FLAGS
420{
421 ULONG Present : 1;
422} HTTP_PROPERTY_FLAGS, *PHTTP_PROPERTY_FLAGS;
423
424typedef struct _HTTP_BINDING_INFO
425{
426 HTTP_PROPERTY_FLAGS Flags;
427 HANDLE RequestQueueHandle;
428} HTTP_BINDING_INFO, *PHTTP_BINDING_INFO;
429
430ULONG WINAPI HttpAddUrl(HANDLE,PCWSTR,PVOID);
431ULONG WINAPI HttpAddUrlToUrlGroup(HTTP_URL_GROUP_ID id, const WCHAR *url, HTTP_URL_CONTEXT context, ULONG reserved);
432ULONG WINAPI HttpCloseRequestQueue(HANDLE handle);
433ULONG WINAPI HttpCloseServerSession(HTTP_SERVER_SESSION_ID id);
434ULONG WINAPI HttpCloseUrlGroup(HTTP_URL_GROUP_ID id);
435ULONG WINAPI HttpCreateHttpHandle(PHANDLE,ULONG);
436ULONG WINAPI HttpCreateRequestQueue(HTTPAPI_VERSION version, const WCHAR *name, SECURITY_ATTRIBUTES *sa, ULONG flags, HANDLE *handle);
437ULONG WINAPI HttpCreateServerSession(HTTPAPI_VERSION,PHTTP_SERVER_SESSION_ID,ULONG);
438ULONG WINAPI HttpCreateUrlGroup(HTTP_SERVER_SESSION_ID session_id, HTTP_URL_GROUP_ID *group_id, ULONG reserved);
439ULONG WINAPI HttpDeleteServiceConfiguration(HANDLE,HTTP_SERVICE_CONFIG_ID,PVOID,ULONG,LPOVERLAPPED);
440ULONG WINAPI HttpInitialize(HTTPAPI_VERSION version, ULONG flags, void *reserved);
441ULONG WINAPI HttpTerminate(ULONG flags, void *reserved);
442ULONG WINAPI HttpQueryServiceConfiguration(HANDLE,HTTP_SERVICE_CONFIG_ID,PVOID,ULONG,PVOID,ULONG,PULONG,LPOVERLAPPED);
443ULONG WINAPI HttpReceiveHttpRequest(HANDLE queue, HTTP_REQUEST_ID id, ULONG flags, HTTP_REQUEST *request, ULONG size, ULONG *ret_size, OVERLAPPED *ovl);
444ULONG WINAPI HttpRemoveUrl(HANDLE queue, const WCHAR *url);
445ULONG WINAPI HttpRemoveUrlFromUrlGroup(HTTP_URL_GROUP_ID id, const WCHAR *url, ULONG flags);
446ULONG WINAPI HttpSendHttpResponse(HANDLE queue, HTTP_REQUEST_ID id, ULONG flags, HTTP_RESPONSE *response, HTTP_CACHE_POLICY *cache_policy, ULONG *ret_size, void *reserved1, ULONG reserved2, OVERLAPPED *ovl, HTTP_LOG_DATA *log_data);
447ULONG WINAPI HttpSetServiceConfiguration(HANDLE,HTTP_SERVICE_CONFIG_ID,PVOID,ULONG,LPOVERLAPPED);
448ULONG WINAPI HttpSetUrlGroupProperty(HTTP_URL_GROUP_ID id, HTTP_SERVER_PROPERTY property, void *value, ULONG length);
449
450#ifdef __cplusplus
451}
452#endif
453
454#endif /* __WINE_HTTP_H */