From c35e1616e67de2d5852dae647c2db6d811f451bd Mon Sep 17 00:00:00 2001 From: damitha Date: Tue, 29 Jun 2010 08:57:05 +0000 Subject: Partial fix of AXIS2C-1440 git-svn-id: http://svn.apache.org/repos/asf/axis/axis2/c/core/trunk@958884 13f79535-47bb-0310-9956-ffa450edef68 --- .../transport/http/server/IIS/axis2_iis_worker.h | 124 ++--- .../transport/http/server/IIS/axis2_isapi_plugin.c | 560 ++++++++++----------- .../IIS/iis_iaspi_plugin_51/axis2_isapi_51.c | 306 +++++------ 3 files changed, 495 insertions(+), 495 deletions(-) (limited to 'src/core/transport/http/server/IIS') diff --git a/src/core/transport/http/server/IIS/axis2_iis_worker.h b/src/core/transport/http/server/IIS/axis2_iis_worker.h index f9b6292..aa56567 100644 --- a/src/core/transport/http/server/IIS/axis2_iis_worker.h +++ b/src/core/transport/http/server/IIS/axis2_iis_worker.h @@ -1,62 +1,62 @@ - -/* - * 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. - */ - -#ifndef AXIS2_APACHE2_WORKER_H -#define AXIS2_APACHE2_WORKER_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" -{ - -#endif /* - */ - -typedef struct axis2_iis_worker axis2_iis_worker_t; - -int server_version; - -int AXIS2_CALL - axis2_iis_worker_process_request( - axis2_iis_worker_t * iis_worker, - const axutil_env_t * env, - void *r); - - -void AXIS2_CALL - axis2_iis_worker_free( - axis2_iis_worker_t * iis_worker, - const axutil_env_t * env); - - -axis2_iis_worker_t * AXIS2_CALL - axis2_iis_worker_create( - const axutil_env_t * env, - axis2_char_t * repo_path); - - -#ifdef __cplusplus -} -#endif /* - */ - -#endif /* AXIS2_IIS_WORKER_H */ + +/* + * 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. + */ + +#ifndef AXIS2_APACHE2_WORKER_H +#define AXIS2_APACHE2_WORKER_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" +{ + +#endif /* + */ + +typedef struct axis2_iis_worker axis2_iis_worker_t; + +int server_version; + +int AXIS2_CALL + axis2_iis_worker_process_request( + axis2_iis_worker_t * iis_worker, + const axutil_env_t * env, + void *r); + + +void AXIS2_CALL + axis2_iis_worker_free( + axis2_iis_worker_t * iis_worker, + const axutil_env_t * env); + + +axis2_iis_worker_t * AXIS2_CALL + axis2_iis_worker_create( + const axutil_env_t * env, + axis2_char_t * repo_path); + + +#ifdef __cplusplus +} +#endif /* + */ + +#endif /* AXIS2_IIS_WORKER_H */ diff --git a/src/core/transport/http/server/IIS/axis2_isapi_plugin.c b/src/core/transport/http/server/IIS/axis2_isapi_plugin.c index eccfd1c..e647f28 100644 --- a/src/core/transport/http/server/IIS/axis2_isapi_plugin.c +++ b/src/core/transport/http/server/IIS/axis2_isapi_plugin.c @@ -1,42 +1,42 @@ - -/* - * 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. - */ - -#include -#include -#include -#include -#include -#include - -#include "axis2_iis_constants.h" -#include "axis2_iis_worker.h" - + +/* + * 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. + */ + +#include +#include +#include +#include +#include +#include + +#include "axis2_iis_constants.h" +#include "axis2_iis_worker.h" + /* Axis headers */ #include #include #include #include -#include - -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0500 -#endif - +#include + +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0500 +#endif + #define AXIS2_IIS_LOG_FILE_TAG "log_file" #define AXIS2_IIS_LOG_LEVEL_TAG "log_level" #define AXIS2_IIS_REPO_PATH_TAG "axis2c_home" @@ -68,19 +68,19 @@ static axis2_char_t log_file[MAX_FILE_PATH]; static axutil_log_levels_t log_level = AXIS2_LOG_LEVEL_CRITICAL; /* Path variables */ -static char szOriginalPath[_MAX_PATH + 1]; +static char szOriginalPath[_MAX_PATH + 1]; static char szPath[_MAX_PATH + 1]; -axis2_char_t general_error[] = "\r\n" - " An IIS server error occurred. \r\n" - "

An IIS server error occurred

\r\n" - "
\r\n" +axis2_char_t general_error[] = "\r\n" + " An IIS server error occurred. \r\n" + "

An IIS server error occurred

\r\n" + "
\r\n" "An error occurred in IIS while processing this request."; -axis2_char_t initializing_error[] = "\r\n" - " An IIS server error occurred. \r\n" - "

An IIS server error occurred

\r\n" - "
\r\n" +axis2_char_t initializing_error[] = "\r\n" + " An IIS server error occurred. \r\n" + "

An IIS server error occurred

\r\n" + "
\r\n" "An error occurred while initilizing Axis2/C."; @@ -103,243 +103,243 @@ static axis2_status_t AXIS2_CALL get_registry_config_parameter( * Parse the given string and return the corresponding log_level */ axutil_log_levels_t AXIS2_CALL axis2_iis_parse_log_level(char level[]); - -/* - * Initialize axis. This function is called in the begining of the module loading. - * It initializes the axis by reading values from the configuration and creating the - * required structures for the axis2c -*/ -axis2_status_t AXIS2_CALL init_axis2(); - -/* - * This is the function to be called after the processing - * is over for non Axis2 requets - */ -VOID -WINAPI -ExecUrlCompletion ( - EXTENSION_CONTROL_BLOCK * pecb, - PVOID pContext, - DWORD cbIO, - DWORD dwError - ); - -/* - * If somethign went wrong in the IIS server when - * we are proccessing we send this - */ -BOOL -send_error( - EXTENSION_CONTROL_BLOCK * pecb, - CHAR error[]); - -axis2_status_t AXIS2_CALL init_axis2(); - -BOOL -WINAPI -GetExtensionVersion(HSE_VERSION_INFO * pVer) -{ - pVer->dwExtensionVersion = MAKELONG( HSE_VERSION_MINOR, - HSE_VERSION_MAJOR); - strncpy( pVer->lpszExtensionDesc, - "WildCardMap Sample ISAPI Extension", HSE_MAX_EXT_DLL_NAME_LEN ); - - pVer->lpszExtensionDesc[HSE_MAX_EXT_DLL_NAME_LEN-1] = '\0'; - server_version = 5; - return TRUE; -} - -DWORD -WINAPI -HttpExtensionProc(EXTENSION_CONTROL_BLOCK * pecb) - -{ - HSE_EXEC_URL_INFO ExecUrlInfo; - DWORD cbData = INTERNET_MAX_URL_LENGTH; - char url[INTERNET_MAX_URL_LENGTH]; - axis2_bool_t is_for_us = AXIS2_TRUE; - - /* Get the URL */ - if ( pecb->GetServerVariable( pecb->ConnID, - "URL", - url, - &cbData ) == FALSE ) - { - return HSE_STATUS_ERROR; - } - - if (!is_inited) - { - DWORD dwBufferSize = 0; - axis2_char_t server_software[256]; - axis2_char_t *version = NULL; - - ZeroMemory(szOriginalPath, sizeof szOriginalPath); - dwBufferSize = sizeof szOriginalPath; - -#if _WIN32_WINNT >= 0x0502 - GetDllDirectory( dwBufferSize, szOriginalPath ); -#else - GetCurrentDirectory( dwBufferSize, szOriginalPath ); -#endif - ZeroMemory(szPath, sizeof szPath); - dwBufferSize = sizeof szPath; - /* Get the current physical paht */ - if (pecb->GetServerVariable(pecb->ConnID, "APPL_PHYSICAL_PATH", szPath, &dwBufferSize) == FALSE) - { - send_error(pecb, initializing_error); - return HSE_STATUS_ERROR; - } - /* Retrieve the server version */ - dwBufferSize = 32; - if (pecb->GetServerVariable(pecb->ConnID, "SERVER_SOFTWARE", server_software, &dwBufferSize) == FALSE) - { - send_error(pecb, initializing_error); - return HSE_STATUS_ERROR; - } - version = axutil_strchr(server_software, '/'); - if (version) - { - server_version = atoi(version + 1); - } -#if _WIN32_WINNT >= 0x0502 - SetDllDirectory( szPath ); -#else - SetCurrentDirectory( szPath ); -#endif - /* If we haven't initialized axis2/c before initialization failed */ - if (AXIS2_FAILURE == init_axis2()) - { - send_error(pecb, initializing_error); - return HSE_STATUS_ERROR; - } -#if _WIN32_WINNT >= 0x0502 - SetDllDirectory( szOriginalPath ); -#else - SetCurrentDirectory( szOriginalPath ); -#endif - } - - /* Check weather we have a request for Axis2/C */ - if (server_version >= 6 && strlen(url) >= strlen(axis2_location)) - { - int i = 0; - is_for_us = AXIS2_TRUE; - while (axis2_location[i] != '\0') - { - if (axis2_location[i] != (url)[i]) { - is_for_us = AXIS2_FALSE; - break; - } - i++; - } - if (url[i] != '/' && url[i] != '\0') - { - is_for_us = AXIS2_FALSE; - } - } - - if (is_for_us) - { - /* Windows cannot find the correct dlls unless the path is set*/ -#if _WIN32_WINNT >= 0x0502 - SetDllDirectory( szPath ); -#else - SetCurrentDirectory( szPath ); -#endif - pecb->dwHttpStatusCode = HTTP_INTERNAL_SERVER_ERROR; - /* We are sure that worker is not NULL since it is NULL init_axis2 would have failed */ - axis2_iis_worker_process_request(axis2_worker, axutil_env, pecb); - - /* Windows cannot find the correct dlls unless the dir is set - but we want to reset to previous dir after the load */ -#if _WIN32_WINNT >= 0x0502 - SetDllDirectory( szOriginalPath ); -#else - SetCurrentDirectory( szOriginalPath ); -#endif - return HSE_STATUS_SUCCESS; - } - else if (server_version >= 6) - { - /* For IIS 5.1 or earlier this code is never executed. Since the URL is - redirected to Axis2/C by the Filter */ - - /* If not for Axis2/C let the request go to who ever wants it */ - ExecUrlInfo.pszUrl = NULL; /* Use original request URL */ - ExecUrlInfo.pszMethod = NULL; /* Use original request method */ - ExecUrlInfo.pszChildHeaders = NULL; /* Use original request headers */ - ExecUrlInfo.pUserInfo = NULL; /* Use original request user info */ - ExecUrlInfo.pEntity = NULL; /* Use original request entity */ - - /* Provent recursion */ - ExecUrlInfo.dwExecUrlFlags = HSE_EXEC_URL_IGNORE_CURRENT_INTERCEPTOR; - - /* Associate the completion routine and the current URL with this request. */ - if ( pecb->ServerSupportFunction( pecb->ConnID, - HSE_REQ_IO_COMPLETION, - ExecUrlCompletion, - NULL, - NULL) == FALSE ) - { - return HSE_STATUS_ERROR; - } - - /* Ok, now that everything is set up, let's call the child request */ - if ( pecb->ServerSupportFunction( pecb->ConnID, - HSE_REQ_EXEC_URL, - &ExecUrlInfo, - NULL, - NULL ) == FALSE ) - { - return HSE_STATUS_ERROR; - } - /* Return pending and let the completion clean up */ - return HSE_STATUS_PENDING; - } - return HSE_STATUS_ERROR; -} - -VOID -WINAPI -ExecUrlCompletion ( - EXTENSION_CONTROL_BLOCK * pecb, - PVOID pContext, - DWORD cbIO, - DWORD dwError - ) -{ - /* We are done so notify */ - pecb->ServerSupportFunction( - pecb->ConnID, - HSE_REQ_DONE_WITH_SESSION, - NULL, - NULL, - NULL); -} - - -BOOL -send_error( - EXTENSION_CONTROL_BLOCK * pecb, - axis2_char_t error[]) -{ - DWORD cbData; - pecb->dwHttpStatusCode = 500; - /* Send headers and response */ - pecb->ServerSupportFunction( pecb->ConnID, - HSE_REQ_SEND_RESPONSE_HEADER, - "500 Server Error", - NULL, - (LPDWORD)"Content-Type: text/html\r\n\r\n" ); - - cbData = axutil_strlen( error ); - return pecb->WriteClient( pecb->ConnID, - error, - &cbData, - HSE_IO_SYNC ); -} - + +/* + * Initialize axis. This function is called in the begining of the module loading. + * It initializes the axis by reading values from the configuration and creating the + * required structures for the axis2c +*/ +axis2_status_t AXIS2_CALL init_axis2(); + +/* + * This is the function to be called after the processing + * is over for non Axis2 requets + */ +VOID +WINAPI +ExecUrlCompletion ( + EXTENSION_CONTROL_BLOCK * pecb, + PVOID pContext, + DWORD cbIO, + DWORD dwError + ); + +/* + * If somethign went wrong in the IIS server when + * we are proccessing we send this + */ +BOOL +send_error( + EXTENSION_CONTROL_BLOCK * pecb, + CHAR error[]); + +axis2_status_t AXIS2_CALL init_axis2(); + +BOOL +WINAPI +GetExtensionVersion(HSE_VERSION_INFO * pVer) +{ + pVer->dwExtensionVersion = MAKELONG( HSE_VERSION_MINOR, + HSE_VERSION_MAJOR); + strncpy( pVer->lpszExtensionDesc, + "WildCardMap Sample ISAPI Extension", HSE_MAX_EXT_DLL_NAME_LEN ); + + pVer->lpszExtensionDesc[HSE_MAX_EXT_DLL_NAME_LEN-1] = '\0'; + server_version = 5; + return TRUE; +} + +DWORD +WINAPI +HttpExtensionProc(EXTENSION_CONTROL_BLOCK * pecb) + +{ + HSE_EXEC_URL_INFO ExecUrlInfo; + DWORD cbData = INTERNET_MAX_URL_LENGTH; + char url[INTERNET_MAX_URL_LENGTH]; + axis2_bool_t is_for_us = AXIS2_TRUE; + + /* Get the URL */ + if ( pecb->GetServerVariable( pecb->ConnID, + "URL", + url, + &cbData ) == FALSE ) + { + return HSE_STATUS_ERROR; + } + + if (!is_inited) + { + DWORD dwBufferSize = 0; + axis2_char_t server_software[256]; + axis2_char_t *version = NULL; + + ZeroMemory(szOriginalPath, sizeof szOriginalPath); + dwBufferSize = sizeof szOriginalPath; + +#if _WIN32_WINNT >= 0x0502 + GetDllDirectory( dwBufferSize, szOriginalPath ); +#else + GetCurrentDirectory( dwBufferSize, szOriginalPath ); +#endif + ZeroMemory(szPath, sizeof szPath); + dwBufferSize = sizeof szPath; + /* Get the current physical paht */ + if (pecb->GetServerVariable(pecb->ConnID, "APPL_PHYSICAL_PATH", szPath, &dwBufferSize) == FALSE) + { + send_error(pecb, initializing_error); + return HSE_STATUS_ERROR; + } + /* Retrieve the server version */ + dwBufferSize = 32; + if (pecb->GetServerVariable(pecb->ConnID, "SERVER_SOFTWARE", server_software, &dwBufferSize) == FALSE) + { + send_error(pecb, initializing_error); + return HSE_STATUS_ERROR; + } + version = axutil_strchr(server_software, '/'); + if (version) + { + server_version = atoi(version + 1); + } +#if _WIN32_WINNT >= 0x0502 + SetDllDirectory( szPath ); +#else + SetCurrentDirectory( szPath ); +#endif + /* If we haven't initialized axis2/c before initialization failed */ + if (AXIS2_FAILURE == init_axis2()) + { + send_error(pecb, initializing_error); + return HSE_STATUS_ERROR; + } +#if _WIN32_WINNT >= 0x0502 + SetDllDirectory( szOriginalPath ); +#else + SetCurrentDirectory( szOriginalPath ); +#endif + } + + /* Check weather we have a request for Axis2/C */ + if (server_version >= 6 && strlen(url) >= strlen(axis2_location)) + { + int i = 0; + is_for_us = AXIS2_TRUE; + while (axis2_location[i] != '\0') + { + if (axis2_location[i] != (url)[i]) { + is_for_us = AXIS2_FALSE; + break; + } + i++; + } + if (url[i] != '/' && url[i] != '\0') + { + is_for_us = AXIS2_FALSE; + } + } + + if (is_for_us) + { + /* Windows cannot find the correct dlls unless the path is set*/ +#if _WIN32_WINNT >= 0x0502 + SetDllDirectory( szPath ); +#else + SetCurrentDirectory( szPath ); +#endif + pecb->dwHttpStatusCode = HTTP_INTERNAL_SERVER_ERROR; + /* We are sure that worker is not NULL since it is NULL init_axis2 would have failed */ + axis2_iis_worker_process_request(axis2_worker, axutil_env, pecb); + + /* Windows cannot find the correct dlls unless the dir is set + but we want to reset to previous dir after the load */ +#if _WIN32_WINNT >= 0x0502 + SetDllDirectory( szOriginalPath ); +#else + SetCurrentDirectory( szOriginalPath ); +#endif + return HSE_STATUS_SUCCESS; + } + else if (server_version >= 6) + { + /* For IIS 5.1 or earlier this code is never executed. Since the URL is + redirected to Axis2/C by the Filter */ + + /* If not for Axis2/C let the request go to who ever wants it */ + ExecUrlInfo.pszUrl = NULL; /* Use original request URL */ + ExecUrlInfo.pszMethod = NULL; /* Use original request method */ + ExecUrlInfo.pszChildHeaders = NULL; /* Use original request headers */ + ExecUrlInfo.pUserInfo = NULL; /* Use original request user info */ + ExecUrlInfo.pEntity = NULL; /* Use original request entity */ + + /* Provent recursion */ + ExecUrlInfo.dwExecUrlFlags = HSE_EXEC_URL_IGNORE_CURRENT_INTERCEPTOR; + + /* Associate the completion routine and the current URL with this request. */ + if ( pecb->ServerSupportFunction( pecb->ConnID, + HSE_REQ_IO_COMPLETION, + ExecUrlCompletion, + NULL, + NULL) == FALSE ) + { + return HSE_STATUS_ERROR; + } + + /* Ok, now that everything is set up, let's call the child request */ + if ( pecb->ServerSupportFunction( pecb->ConnID, + HSE_REQ_EXEC_URL, + &ExecUrlInfo, + NULL, + NULL ) == FALSE ) + { + return HSE_STATUS_ERROR; + } + /* Return pending and let the completion clean up */ + return HSE_STATUS_PENDING; + } + return HSE_STATUS_ERROR; +} + +VOID +WINAPI +ExecUrlCompletion ( + EXTENSION_CONTROL_BLOCK * pecb, + PVOID pContext, + DWORD cbIO, + DWORD dwError + ) +{ + /* We are done so notify */ + pecb->ServerSupportFunction( + pecb->ConnID, + HSE_REQ_DONE_WITH_SESSION, + NULL, + NULL, + NULL); +} + + +BOOL +send_error( + EXTENSION_CONTROL_BLOCK * pecb, + axis2_char_t error[]) +{ + DWORD cbData; + pecb->dwHttpStatusCode = 500; + /* Send headers and response */ + pecb->ServerSupportFunction( pecb->ConnID, + HSE_REQ_SEND_RESPONSE_HEADER, + "500 Server Error", + NULL, + (LPDWORD)"Content-Type: text/html\r\n\r\n" ); + + cbData = axutil_strlen( error ); + return pecb->WriteClient( pecb->ConnID, + error, + &cbData, + HSE_IO_SYNC ); +} + axis2_status_t AXIS2_CALL read_registery_init_data() { long rc = 0; diff --git a/src/core/transport/http/server/IIS/iis_iaspi_plugin_51/axis2_isapi_51.c b/src/core/transport/http/server/IIS/iis_iaspi_plugin_51/axis2_isapi_51.c index 49cd6d9..d2c8f09 100644 --- a/src/core/transport/http/server/IIS/iis_iaspi_plugin_51/axis2_isapi_51.c +++ b/src/core/transport/http/server/IIS/iis_iaspi_plugin_51/axis2_isapi_51.c @@ -1,153 +1,153 @@ -/* - * 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. - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "..\\axis2_iis_constants.h" - -#define REGISTRY_LOC "Software\\Apache Axis2c\\IIS ISAPI Redirector" -#define AXIS2_IIS_AXIS2_LOC "axis2_location" -static char *axis2_loc = "/axis2"; - -static axis2_char_t redirect_word[INTERNET_MAX_URL_LENGTH] = "/axis2/mod_axis2_IIS.dll\?"; -/* - * Search a given uri to find weather it matches a uri for the axis2 - * The uri format for axis2 is of the form - * scheme://server:port/axis2/other_parts - * This function search a give uri for the /axis2/. If a match - * is found it will replace the /axis2 part of the url with /axis2/mod_iis.dll? - */ -axis2_bool_t AXIS2_CALL -get_extension_url( - char url[], - char ret_url[]); - -/* - * This function is called by the IIS server at the server - * initialization. So this is the ideal plcae for initializing - * axis2c. - */ -BOOL WINAPI -GetFilterVersion( - PHTTP_FILTER_VERSION pVer) -{ - DWORD type = 0, size = 0; - LONG lrc = 0; - char tmpbuf[INTERNET_MAX_URL_LENGTH]; - HKEY hkey; - ULONG http_filter_revision = HTTP_FILTER_REVISION; - pVer->dwFilterVersion = pVer->dwServerFilterVersion; - if(pVer->dwFilterVersion > http_filter_revision) - { - pVer->dwFilterVersion = http_filter_revision; - } - - /* - Receive notifictions when - 1. Server preprocessed the headers. - 2. Log - 3. All the request coming in secure and none secure ports. - */ - pVer->dwFlags = (SF_NOTIFY_ORDER_HIGH | SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_SECURE_PORT - | SF_NOTIFY_NONSECURE_PORT | SF_NOTIFY_AUTH_COMPLETE); - - /* Give a short discription about the module.*/ - strcpy(pVer->lpszFilterDesc, "axis2c filter"); - /* Get the axis2 location from the registry configuration */ - lrc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGISTRY_LOC, (DWORD)0, KEY_READ, &hkey); - if(ERROR_SUCCESS != lrc) - { - return FALSE; - } - size = INTERNET_MAX_URL_LENGTH; - lrc = RegQueryValueEx(hkey, AXIS2_IIS_AXIS2_LOC, (LPDWORD)0, &type, (LPBYTE)tmpbuf, &size); - if((ERROR_SUCCESS == lrc) && (type == REG_SZ)) - { - tmpbuf[size] = '\0'; - axis2_loc = _strdup(tmpbuf); - } - RegCloseKey(hkey); - return TRUE; -} - -/* - When a notification happens this function is called by the IIS. - */ -DWORD WINAPI -HttpFilterProc( - PHTTP_FILTER_CONTEXT pfc, - DWORD notificationType, - LPVOID pvNotification) -{ - DWORD bufferLength = INTERNET_MAX_URL_LENGTH; - char url[INTERNET_MAX_URL_LENGTH]; - char modified_url[INTERNET_MAX_URL_LENGTH]; - - if(notificationType == SF_NOTIFY_PREPROC_HEADERS) - { - pfc->GetServerVariable(pfc, "HTTP_URL", url, &bufferLength); - if(get_extension_url(url, modified_url)) - { - ((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->SetHeader(pfc, "url", modified_url); - return SF_STATUS_REQ_HANDLED_NOTIFICATION; - } - } - return SF_STATUS_REQ_NEXT_NOTIFICATION; -} - -axis2_bool_t AXIS2_CALL -get_extension_url( - char url[], - char ret_url[]) -{ - axis2_bool_t is_for_us = AXIS2_FALSE; - int i = 0; - /* Should contain "/axis2/"*/ - ret_url[0] = '\0'; - if(strlen(url) >= strlen(axis2_loc)) - { - is_for_us = AXIS2_TRUE; - while(axis2_loc[i] != '\0') - { - if(axis2_loc[i] != (url)[i]) - { - is_for_us = AXIS2_FALSE; - break; - } - i++; - } - if(url[i] != '/' && url[i] != '\0') - { - is_for_us = AXIS2_FALSE; - } - } - if(is_for_us) - { - strcpy(ret_url, redirect_word); - strcat(ret_url, &url[i]); - } - return is_for_us; -} +/* + * 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. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "..\\axis2_iis_constants.h" + +#define REGISTRY_LOC "Software\\Apache Axis2c\\IIS ISAPI Redirector" +#define AXIS2_IIS_AXIS2_LOC "axis2_location" +static char *axis2_loc = "/axis2"; + +static axis2_char_t redirect_word[INTERNET_MAX_URL_LENGTH] = "/axis2/mod_axis2_IIS.dll\?"; +/* + * Search a given uri to find weather it matches a uri for the axis2 + * The uri format for axis2 is of the form + * scheme://server:port/axis2/other_parts + * This function search a give uri for the /axis2/. If a match + * is found it will replace the /axis2 part of the url with /axis2/mod_iis.dll? + */ +axis2_bool_t AXIS2_CALL +get_extension_url( + char url[], + char ret_url[]); + +/* + * This function is called by the IIS server at the server + * initialization. So this is the ideal plcae for initializing + * axis2c. + */ +BOOL WINAPI +GetFilterVersion( + PHTTP_FILTER_VERSION pVer) +{ + DWORD type = 0, size = 0; + LONG lrc = 0; + char tmpbuf[INTERNET_MAX_URL_LENGTH]; + HKEY hkey; + ULONG http_filter_revision = HTTP_FILTER_REVISION; + pVer->dwFilterVersion = pVer->dwServerFilterVersion; + if(pVer->dwFilterVersion > http_filter_revision) + { + pVer->dwFilterVersion = http_filter_revision; + } + + /* + Receive notifictions when + 1. Server preprocessed the headers. + 2. Log + 3. All the request coming in secure and none secure ports. + */ + pVer->dwFlags = (SF_NOTIFY_ORDER_HIGH | SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_SECURE_PORT + | SF_NOTIFY_NONSECURE_PORT | SF_NOTIFY_AUTH_COMPLETE); + + /* Give a short discription about the module.*/ + strcpy(pVer->lpszFilterDesc, "axis2c filter"); + /* Get the axis2 location from the registry configuration */ + lrc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGISTRY_LOC, (DWORD)0, KEY_READ, &hkey); + if(ERROR_SUCCESS != lrc) + { + return FALSE; + } + size = INTERNET_MAX_URL_LENGTH; + lrc = RegQueryValueEx(hkey, AXIS2_IIS_AXIS2_LOC, (LPDWORD)0, &type, (LPBYTE)tmpbuf, &size); + if((ERROR_SUCCESS == lrc) && (type == REG_SZ)) + { + tmpbuf[size] = '\0'; + axis2_loc = _strdup(tmpbuf); + } + RegCloseKey(hkey); + return TRUE; +} + +/* + When a notification happens this function is called by the IIS. + */ +DWORD WINAPI +HttpFilterProc( + PHTTP_FILTER_CONTEXT pfc, + DWORD notificationType, + LPVOID pvNotification) +{ + DWORD bufferLength = INTERNET_MAX_URL_LENGTH; + char url[INTERNET_MAX_URL_LENGTH]; + char modified_url[INTERNET_MAX_URL_LENGTH]; + + if(notificationType == SF_NOTIFY_PREPROC_HEADERS) + { + pfc->GetServerVariable(pfc, "HTTP_URL", url, &bufferLength); + if(get_extension_url(url, modified_url)) + { + ((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->SetHeader(pfc, "url", modified_url); + return SF_STATUS_REQ_HANDLED_NOTIFICATION; + } + } + return SF_STATUS_REQ_NEXT_NOTIFICATION; +} + +axis2_bool_t AXIS2_CALL +get_extension_url( + char url[], + char ret_url[]) +{ + axis2_bool_t is_for_us = AXIS2_FALSE; + int i = 0; + /* Should contain "/axis2/"*/ + ret_url[0] = '\0'; + if(strlen(url) >= strlen(axis2_loc)) + { + is_for_us = AXIS2_TRUE; + while(axis2_loc[i] != '\0') + { + if(axis2_loc[i] != (url)[i]) + { + is_for_us = AXIS2_FALSE; + break; + } + i++; + } + if(url[i] != '/' && url[i] != '\0') + { + is_for_us = AXIS2_FALSE; + } + } + if(is_for_us) + { + strcpy(ret_url, redirect_word); + strcat(ret_url, &url[i]); + } + return is_for_us; +} -- cgit v1.1-32-gdbae