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
12 extern "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