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 _HTTPEXT_H_
7#define _HTTPEXT_H_
8
9#include <windows.h>
10
11#ifdef __cplusplus
12extern "C" {
13#endif
14
15#define HSE_VERSION_MAJOR 6
16#define HSE_VERSION_MINOR 0
17#define HSE_LOG_BUFFER_LEN 80
18#define HSE_MAX_EXT_DLL_NAME_LEN 256
19
20#define HSE_VERSION MAKELONG(HSE_VERSION_MINOR,HSE_VERSION_MAJOR)
21
22#define HSE_STATUS_SUCCESS 1
23#define HSE_STATUS_SUCCESS_AND_KEEP_CONN 2
24#define HSE_STATUS_PENDING 3
25#define HSE_STATUS_ERROR 4
26
27#define HSE_REQ_BASE 0
28#define HSE_REQ_SEND_URL_REDIRECT_RESP (HSE_REQ_BASE + 1)
29#define HSE_REQ_SEND_URL (HSE_REQ_BASE + 2)
30#define HSE_REQ_SEND_RESPONSE_HEADER (HSE_REQ_BASE + 3)
31#define HSE_REQ_DONE_WITH_SESSION (HSE_REQ_BASE + 4)
32#define HSE_REQ_END_RESERVED 1000
33
34#define HSE_REQ_MAP_URL_TO_PATH (HSE_REQ_END_RESERVED+1)
35#define HSE_REQ_GET_SSPI_INFO (HSE_REQ_END_RESERVED+2)
36#define HSE_APPEND_LOG_PARAMETER (HSE_REQ_END_RESERVED+3)
37#define HSE_REQ_IO_COMPLETION (HSE_REQ_END_RESERVED+5)
38#define HSE_REQ_TRANSMIT_FILE (HSE_REQ_END_RESERVED+6)
39#define HSE_REQ_REFRESH_ISAPI_ACL (HSE_REQ_END_RESERVED+7)
40#define HSE_REQ_IS_KEEP_CONN (HSE_REQ_END_RESERVED+8)
41#define HSE_REQ_ASYNC_READ_CLIENT (HSE_REQ_END_RESERVED+10)
42#define HSE_REQ_GET_IMPERSONATION_TOKEN (HSE_REQ_END_RESERVED+11)
43#define HSE_REQ_MAP_URL_TO_PATH_EX (HSE_REQ_END_RESERVED+12)
44#define HSE_REQ_ABORTIVE_CLOSE (HSE_REQ_END_RESERVED+14)
45#define HSE_REQ_GET_CERT_INFO_EX (HSE_REQ_END_RESERVED+15)
46#define HSE_REQ_SEND_RESPONSE_HEADER_EX (HSE_REQ_END_RESERVED+16)
47#define HSE_REQ_CLOSE_CONNECTION (HSE_REQ_END_RESERVED+17)
48#define HSE_REQ_IS_CONNECTED (HSE_REQ_END_RESERVED+18)
49#define HSE_REQ_MAP_UNICODE_URL_TO_PATH (HSE_REQ_END_RESERVED+23)
50#define HSE_REQ_MAP_UNICODE_URL_TO_PATH_EX (HSE_REQ_END_RESERVED+24)
51#define HSE_REQ_EXEC_UNICODE_URL (HSE_REQ_END_RESERVED+25)
52#define HSE_REQ_EXEC_URL (HSE_REQ_END_RESERVED+26)
53#define HSE_REQ_GET_EXEC_URL_STATUS (HSE_REQ_END_RESERVED+27)
54#define HSE_REQ_SEND_CUSTOM_ERROR (HSE_REQ_END_RESERVED+28)
55#define HSE_REQ_IS_IN_PROCESS (HSE_REQ_END_RESERVED+30)
56#define HSE_REQ_REPORT_UNHEALTHY (HSE_REQ_END_RESERVED+32)
57#define HSE_REQ_NORMALIZE_URL (HSE_REQ_END_RESERVED+33)
58#define HSE_REQ_VECTOR_SEND (HSE_REQ_END_RESERVED+37)
59#define HSE_REQ_GET_ANONYMOUS_TOKEN (HSE_REQ_END_RESERVED+38)
60#define HSE_REQ_GET_CACHE_INVALIDATION_CALLBACK (HSE_REQ_END_RESERVED+40)
61#define HSE_REQ_GET_UNICODE_ANONYMOUS_TOKEN (HSE_REQ_END_RESERVED+41)
62#define HSE_REQ_GET_TRACE_INFO (HSE_REQ_END_RESERVED+42)
63
64#define HSE_TERM_ADVISORY_UNLOAD 0x00000001
65#define HSE_TERM_MUST_UNLOAD 0x00000002
66
67#define HSE_IO_SYNC 0x00000001
68#define HSE_IO_ASYNC 0x00000002
69#define HSE_IO_DISCONNECT_AFTER_SEND 0x00000004
70#define HSE_IO_SEND_HEADERS 0x00000008
71#define HSE_IO_NODELAY 0x00001000
72
73#define HSE_IO_FINAL_SEND 0x00000010
74#define HSE_IO_CACHE_RESPONSE 0x00000020
75
76  typedef LPVOID HCONN;
77
78  typedef struct _HSE_VERSION_INFO {
79    DWORD dwExtensionVersion;
80    CHAR lpszExtensionDesc[HSE_MAX_EXT_DLL_NAME_LEN];
81  } HSE_VERSION_INFO,*LPHSE_VERSION_INFO;
82
83  typedef struct _EXTENSION_CONTROL_BLOCK {
84    DWORD cbSize;
85    DWORD dwVersion;
86    HCONN ConnID;
87    DWORD dwHttpStatusCode;
88    CHAR lpszLogData[HSE_LOG_BUFFER_LEN];
89    LPSTR lpszMethod;
90    LPSTR lpszQueryString;
91    LPSTR lpszPathInfo;
92    LPSTR lpszPathTranslated;
93
94    DWORD cbTotalBytes;
95    DWORD cbAvailable;
96    LPBYTE lpbData;
97    LPSTR lpszContentType;
98    WINBOOL (WINAPI *GetServerVariable) (HCONN hConn,LPSTR lpszVariableName,LPVOID lpvBuffer,LPDWORD lpdwSize);
99    WINBOOL (WINAPI *WriteClient) (HCONN ConnID,LPVOID Buffer,LPDWORD lpdwBytes,DWORD dwReserved);
100    WINBOOL (WINAPI *ReadClient) (HCONN ConnID,LPVOID lpvBuffer,LPDWORD lpdwSize);
101    WINBOOL (WINAPI *ServerSupportFunction)(HCONN hConn,DWORD dwHSERequest,LPVOID lpvBuffer,LPDWORD lpdwSize,LPDWORD lpdwDataType);
102  } EXTENSION_CONTROL_BLOCK,*LPEXTENSION_CONTROL_BLOCK;
103
104#define HSE_URL_FLAGS_READ 0x00000001
105#define HSE_URL_FLAGS_WRITE 0x00000002
106#define HSE_URL_FLAGS_EXECUTE 0x00000004
107#define HSE_URL_FLAGS_SSL 0x00000008
108#define HSE_URL_FLAGS_DONT_CACHE 0x00000010
109#define HSE_URL_FLAGS_NEGO_CERT 0x00000020
110#define HSE_URL_FLAGS_REQUIRE_CERT 0x00000040
111#define HSE_URL_FLAGS_MAP_CERT 0x00000080
112#define HSE_URL_FLAGS_SSL128 0x00000100
113#define HSE_URL_FLAGS_SCRIPT 0x00000200
114
115#define HSE_URL_FLAGS_MASK 0x000003ff
116
117  typedef struct _HSE_URL_MAPEX_INFO {
118    CHAR lpszPath[MAX_PATH];
119    DWORD dwFlags;
120    DWORD cchMatchingPath;
121    DWORD cchMatchingURL;
122    DWORD dwReserved1;
123    DWORD dwReserved2;
124  } HSE_URL_MAPEX_INFO,*LPHSE_URL_MAPEX_INFO;
125
126  typedef struct _HSE_UNICODE_URL_MAPEX_INFO {
127    WCHAR lpszPath[MAX_PATH];
128    DWORD dwFlags;
129    DWORD cchMatchingPath;
130    DWORD cchMatchingURL;
131  } HSE_UNICODE_URL_MAPEX_INFO,*LPHSE_UNICODE_URL_MAPEX_INFO;
132
133  typedef VOID (WINAPI *PFN_HSE_IO_COMPLETION)(EXTENSION_CONTROL_BLOCK *pECB,PVOID pContext,DWORD cbIO,DWORD dwError);
134
135  typedef struct _HSE_TF_INFO {
136    PFN_HSE_IO_COMPLETION pfnHseIO;
137    PVOID pContext;
138    HANDLE hFile;
139    LPCSTR pszStatusCode;
140    DWORD BytesToWrite;
141    DWORD Offset;
142    PVOID pHead;
143    DWORD HeadLength;
144    PVOID pTail;
145    DWORD TailLength;
146    DWORD dwFlags;
147  } HSE_TF_INFO,*LPHSE_TF_INFO;
148
149  typedef struct _HSE_SEND_HEADER_EX_INFO {
150    LPCSTR pszStatus;
151    LPCSTR pszHeader;
152    DWORD cchStatus;
153    DWORD cchHeader;
154    WINBOOL fKeepConn;
155  } HSE_SEND_HEADER_EX_INFO,*LPHSE_SEND_HEADER_EX_INFO;
156
157#define HSE_EXEC_URL_NO_HEADERS 0x02
158#define HSE_EXEC_URL_IGNORE_CURRENT_INTERCEPTOR 0x04
159#define HSE_EXEC_URL_IGNORE_VALIDATION_AND_RANGE 0x10
160#define HSE_EXEC_URL_DISABLE_CUSTOM_ERROR 0x20
161#define HSE_EXEC_URL_SSI_CMD 0x40
162
163  typedef struct _HSE_EXEC_URL_USER_INFO {
164    HANDLE hImpersonationToken;
165    LPSTR pszCustomUserName;
166    LPSTR pszCustomAuthType;
167  } HSE_EXEC_URL_USER_INFO,*LPHSE_EXEC_URL_USER_INFO;
168
169  typedef struct _HSE_EXEC_URL_ENTITY_INFO {
170    DWORD cbAvailable;
171    LPVOID lpbData;
172  } HSE_EXEC_URL_ENTITY_INFO,*LPHSE_EXEC_URL_ENTITY_INFO;
173
174  typedef struct _HSE_EXEC_URL_STATUS {
175    USHORT uHttpStatusCode;
176    USHORT uHttpSubStatus;
177    DWORD dwWin32Error;
178  } HSE_EXEC_URL_STATUS,*LPHSE_EXEC_URL_STATUS;
179
180  typedef struct _HSE_EXEC_URL_INFO {
181    LPSTR pszUrl;
182    LPSTR pszMethod;
183    LPSTR pszChildHeaders;
184    LPHSE_EXEC_URL_USER_INFO pUserInfo;
185    LPHSE_EXEC_URL_ENTITY_INFO pEntity;
186    DWORD dwExecUrlFlags;
187  } HSE_EXEC_URL_INFO,*LPHSE_EXEC_URL_INFO;
188
189  typedef struct _HSE_EXEC_UNICODE_URL_USER_INFO {
190    HANDLE hImpersonationToken;
191    LPWSTR pszCustomUserName;
192    LPSTR pszCustomAuthType;
193  } HSE_EXEC_UNICODE_URL_USER_INFO,*LPHSE_EXEC_UNICODE_URL_USER_INFO;
194
195  typedef struct _HSE_EXEC_UNICODE_URL_INFO {
196    LPWSTR pszUrl;
197    LPSTR pszMethod;
198    LPSTR pszChildHeaders;
199    LPHSE_EXEC_UNICODE_URL_USER_INFO pUserInfo;
200    LPHSE_EXEC_URL_ENTITY_INFO pEntity;
201    DWORD dwExecUrlFlags;
202  } HSE_EXEC_UNICODE_URL_INFO,*LPHSE_EXEC_UNICODE_URL_INFO;
203
204  typedef struct _HSE_CUSTOM_ERROR_INFO {
205    CHAR *pszStatus;
206    USHORT uHttpSubError;
207    WINBOOL fAsync;
208  } HSE_CUSTOM_ERROR_INFO,*LPHSE_CUSTOM_ERROR_INFO;
209
210#define HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER 0
211#define HSE_VECTOR_ELEMENT_TYPE_FILE_HANDLE 1
212
213  typedef struct _HSE_VECTOR_ELEMENT {
214    DWORD ElementType;
215    PVOID pvContext;
216    ULONGLONG cbOffset;
217    ULONGLONG cbSize;
218  } HSE_VECTOR_ELEMENT,*LPHSE_VECTOR_ELEMENT;
219
220  typedef struct _HSE_RESPONSE_VECTOR {
221    DWORD dwFlags;
222    LPSTR pszStatus;
223    LPSTR pszHeaders;
224    DWORD nElementCount;
225    LPHSE_VECTOR_ELEMENT lpElementArray;
226  } HSE_RESPONSE_VECTOR,*LPHSE_RESPONSE_VECTOR;
227
228  typedef HRESULT (WINAPI *PFN_HSE_CACHE_INVALIDATION_CALLBACK)(WCHAR *pszUrl);
229
230#include <wincrypt.h>
231
232  typedef struct _CERT_CONTEXT_EX {
233    CERT_CONTEXT CertContext;
234    DWORD cbAllocated;
235    DWORD dwCertificateFlags;
236  } CERT_CONTEXT_EX;
237
238  typedef struct _HSE_TRACE_INFO {
239    WINBOOL fTraceRequest;
240    BYTE TraceContextId[16];
241    DWORD dwReserved1;
242    DWORD dwReserved2;
243  } HSE_TRACE_INFO,*LPHSE_TRACE_INFO;
244
245#define HSE_APP_FLAG_IN_PROCESS 0
246#define HSE_APP_FLAG_ISOLATED_OOP 1
247#define HSE_APP_FLAG_POOLED_OOP 2
248
249  WINBOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer);
250  DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB);
251  WINBOOL WINAPI TerminateExtension(DWORD dwFlags);
252
253  typedef WINBOOL (WINAPI *PFN_GETEXTENSIONVERSION)(HSE_VERSION_INFO *pVer);
254  typedef DWORD (WINAPI *PFN_HTTPEXTENSIONPROC)(EXTENSION_CONTROL_BLOCK *pECB);
255  typedef WINBOOL (WINAPI *PFN_TERMINATEEXTENSION)(DWORD dwFlags);
256
257#ifdef __cplusplus
258}
259#endif
260#endif
261