1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
|
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file mod_isapi.h
* @brief ISAPI module extension to Apache
*
* @defgroup MOD_ISAPI mod_isapi
* @ingroup APACHE_MODS
* @{
*/
#ifndef MOD_ISAPI_H
#define MOD_ISAPI_H
#ifdef __cplusplus
extern "C" {
#endif
/* The Version Information storage passed to a module on startup
* via the GetExtensionVersion() entry point.
*/
typedef struct HSE_VERSION_INFO {
apr_uint32_t dwExtensionVersion;
char lpszExtensionDesc[256];
} HSE_VERSION_INFO;
/* The startup entry point that must be exported by every ISAPI handler
*/
int APR_THREAD_FUNC GetExtensionVersion(HSE_VERSION_INFO *ver_info);
typedef int (APR_THREAD_FUNC *PFN_GETEXTENSIONVERSION)(HSE_VERSION_INFO *ver_info);
/* Our internal 'HCONN' representation, always opaque to the user.
*/
typedef struct isapi_cid isapi_cid;
typedef struct isapi_cid *HCONN;
/* Prototypes of the essential functions exposed by mod_isapi
* for the module to communicate with Apache.
*/
typedef int (APR_THREAD_FUNC
*PFN_GETSERVERVARIABLE)(HCONN cid,
char *variable_name,
void *buf_data,
apr_uint32_t *buf_size);
typedef int (APR_THREAD_FUNC
*PFN_WRITECLIENT)(HCONN cid,
void *buf_data,
apr_uint32_t *buf_size,
apr_uint32_t flags);
typedef int (APR_THREAD_FUNC
*PFN_READCLIENT)(HCONN cid,
void *buf_data,
apr_uint32_t *buf_size);
typedef int (APR_THREAD_FUNC
*PFN_SERVERSUPPORTFUNCTION)(HCONN cid,
apr_uint32_t HSE_code,
void *buf_data,
apr_uint32_t *buf_size,
apr_uint32_t *flags);
/* The ecb structure is passed on each invocation of the module
*/
typedef struct EXTENSION_CONTROL_BLOCK {
apr_uint32_t cbSize;
apr_uint32_t dwVersion;
HCONN ConnID;
apr_uint32_t dwHttpStatusCode;
char lpszLogData[80];
char *lpszMethod;
char *lpszQueryString;
char *lpszPathInfo;
char *lpszPathTranslated;
apr_uint32_t cbTotalBytes;
apr_uint32_t cbAvailable;
unsigned char *lpbData;
char *lpszContentType;
PFN_GETSERVERVARIABLE GetServerVariable;
PFN_WRITECLIENT WriteClient;
PFN_READCLIENT ReadClient;
PFN_SERVERSUPPORTFUNCTION ServerSupportFunction;
} EXTENSION_CONTROL_BLOCK;
/* Status/Headers structure to pass to HSE_SEND_HEADER_EX,
* an MS extension to ServerSupportFunction
*/
typedef struct HSE_SEND_HEADER_EX_INFO {
const char * pszStatus; /* HTTP status text, such as "200 OK" */
const char * pszHeader; /* HTTP header lines text, such as
* "Content-type: text/plain\r\n"
* "Content-Language: en\r\n"
* Note that (in spite of cchFoo lengths below)
* NULL characters will interfere in headers.
*/
apr_uint32_t cchStatus; /* length of pszStatus text */
apr_uint32_t cchHeader; /* length of pszHeader text */
int fKeepConn; /* Ignored: used to set keep-alive status,
* but Apache follows the client's negotiated
* HTTP contract to decide.
*/
} HSE_SEND_HEADER_EX_INFO;
/* Our only 'supported' MS extended flag bit for TransmitFile,
* HSE_IO_SEND_HEADERS indicates that Status+Headers are present
* in the pszStatusCode member of the HSE_TF_INFO structure.
*/
#define HSE_IO_SEND_HEADERS 8
/* The remaining flags are MS extended flag bits that bear little
* relation to Apache; the rules that the Apache server obeys follow
* its own design and HTTP protocol filter rules.
*
* We do not support async, however, we fake it. If HSE_IO_SYNC is
* not passed, and a completion context was defined, we will invoke the
* completion function immediately following the transfer, and then
* return to the caller. If HSE_IO_SYNC is passed, there is no call
* necessary to the completion context.
*/
#define HSE_IO_SYNC 1
#define HSE_IO_ASYNC 2
#define HSE_IO_DISCONNECT_AFTER_SEND 4
#define HSE_IO_NODELAY 4096
/* The Completion function prototype. This callback may be fixed with
* the HSE_REQ_IO_COMPLETION ServerSupportFunction call, or overridden
* for the HSE_REQ_TRANSMIT_FILE call.
*/
typedef void (APR_THREAD_FUNC *PFN_HSE_IO_COMPLETION)
(EXTENSION_CONTROL_BLOCK *ecb,
void *ctxt,
apr_uint32_t cbIO,
apr_uint32_t dwError);
/* TransmitFile structure to pass to HSE_REQ_TRANSMIT_FILE, an MS extension
*/
typedef struct HSE_TF_INFO {
PFN_HSE_IO_COMPLETION pfnHseIO; /* Overrides the default setting of
* HSE_REQ_IO_COMPLETION if not NULL
*/
void *pContext;
apr_os_file_t hFile; /* HANDLE/fd to transmit */
const char *pszStatusCode; /* Ignored if HSE_IO_SEND_HEADERS is
* not set. Includes HTTP status text
* plus header text lines, such as
* "200 OK\r\n"
* "Content-type: text/plain\r\n"
*/
apr_uint32_t BytesToWrite; /* 0 is write-all */
apr_uint32_t Offset; /* File Offset */
void *pHead; /* Prefix with *pHead body text */
apr_uint32_t HeadLength; /* Length of *pHead body text */
void *pTail; /* Prefix with *pTail body text */
apr_uint32_t TailLength; /* Length of *pTail body text */
apr_uint32_t dwFlags; /* bit flags described above */
} HSE_TF_INFO;
typedef struct HSE_URL_MAPEX_INFO {
char lpszPath[260];
apr_uint32_t dwFlags;
apr_uint32_t cchMatchingPath;
apr_uint32_t cchMatchingURL;
apr_uint32_t dwReserved1;
apr_uint32_t dwReserved2;
} HSE_URL_MAPEX_INFO;
/* Original ISAPI ServerSupportFunction() HSE_code methods */
#define HSE_REQ_SEND_URL_REDIRECT_RESP 1
#define HSE_REQ_SEND_URL 2
#define HSE_REQ_SEND_RESPONSE_HEADER 3
#define HSE_REQ_DONE_WITH_SESSION 4
/* MS Extented methods to ISAPI ServerSupportFunction() HSE_code */
#define HSE_REQ_MAP_URL_TO_PATH 1001 /* Emulated */
#define HSE_REQ_GET_SSPI_INFO 1002 /* Not Supported */
#define HSE_APPEND_LOG_PARAMETER 1003 /* Supported */
#define HSE_REQ_IO_COMPLETION 1005 /* Emulated */
#define HSE_REQ_TRANSMIT_FILE 1006 /* Async Emulated */
#define HSE_REQ_REFRESH_ISAPI_ACL 1007 /* Not Supported */
#define HSE_REQ_IS_KEEP_CONN 1008 /* Supported */
#define HSE_REQ_ASYNC_READ_CLIENT 1010 /* Emulated */
/* Added with ISAPI 4.0 */
#define HSE_REQ_GET_IMPERSONATION_TOKEN 1011 /* Not Supported */
#define HSE_REQ_MAP_URL_TO_PATH_EX 1012 /* Emulated */
#define HSE_REQ_ABORTIVE_CLOSE 1014 /* Ignored */
/* Added after ISAPI 4.0 in IIS 5.0 */
#define HSE_REQ_GET_CERT_INFO_EX 1015 /* Not Supported */
#define HSE_REQ_SEND_RESPONSE_HEADER_EX 1016 /* Supported (no nulls!) */
#define HSE_REQ_CLOSE_CONNECTION 1017 /* Ignored */
#define HSE_REQ_IS_CONNECTED 1018 /* Supported */
#define HSE_REQ_EXTENSION_TRIGGER 1020 /* Not Supported */
/* The request entry point that must be exported by every ISAPI handler
*/
apr_uint32_t APR_THREAD_FUNC HttpExtensionProc(EXTENSION_CONTROL_BLOCK *ecb);
typedef apr_uint32_t (APR_THREAD_FUNC
*PFN_HTTPEXTENSIONPROC)(EXTENSION_CONTROL_BLOCK *ecb);
/* Allowable return values from HttpExtensionProc (apparently 0 is also
* accepted by MS IIS, and we will respect it as Success.)
* If the HttpExtensionProc returns HSE_STATUS_PENDING, we will create
* a wait mutex and lock on it, until HSE_REQ_DONE_WITH_SESSION is called.
*/
#define HSE_STATUS_SUCCESS 1
#define HSE_STATUS_SUCCESS_AND_KEEP_CONN 2 /* 1 vs 2 Ignored, we choose */
#define HSE_STATUS_PENDING 3 /* Emulated (thread lock) */
#define HSE_STATUS_ERROR 4
/* Anticipated error code for common faults within mod_isapi itself
*/
#ifndef ERROR_INSUFFICIENT_BUFFER
#define ERROR_INSUFFICIENT_BUFFER ENOBUFS
#endif
#ifndef ERROR_INVALID_INDEX
#define ERROR_INVALID_INDEX EINVAL
#endif
#ifndef ERROR_INVALID_PARAMETER
#define ERROR_INVALID_PARAMETER EINVAL
#endif
#ifndef ERROR_READ_FAULT
#define ERROR_READ_FAULT EIO
#endif
#ifndef ERROR_WRITE_FAULT
#define ERROR_WRITE_FAULT EIO
#endif
#ifndef ERROR_SUCCESS
#define ERROR_SUCCESS 0
#endif
/* Valid flags passed with TerminateExtension()
*/
#define HSE_TERM_MUST_UNLOAD 1
#define HSE_TERM_ADVISORY_UNLOAD 2
/* The shutdown entry point optionally exported by an ISAPI handler, passed
* HSE_TERM_MUST_UNLOAD or HSE_TERM_ADVISORY_UNLOAD. The module may return
* if passed HSE_TERM_ADVISORY_UNLOAD, and the module will remain loaded.
* If the module returns 1 to HSE_TERM_ADVISORY_UNLOAD it is immediately
* unloaded. If the module is passed HSE_TERM_MUST_UNLOAD, its return value
* is ignored.
*/
int APR_THREAD_FUNC TerminateExtension(apr_uint32_t flags);
typedef int (APR_THREAD_FUNC *PFN_TERMINATEEXTENSION)(apr_uint32_t flags);
/* Module may return 0 if passed HSE_TERM_ADVISORY_UNLOAD, and the module
* will remain loaded, or 1 if it consents to being unloaded. If the module
* is passed HSE_TERM_MUST_UNLOAD, its return value is ignored.
*/
#define HSE_TERM_MUST_UNLOAD 1
#define HSE_TERM_ADVISORY_UNLOAD 2
#ifdef __cplusplus
}
#endif
#endif /* !MOD_ISAPI_H */
/** @} */
|