/* 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 */ /** @} */