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 --- .../IIS/iis_iaspi_plugin_51/axis2_isapi_51.c | 306 ++++++++++----------- 1 file changed, 153 insertions(+), 153 deletions(-) (limited to 'src/core/transport/http/server/IIS/iis_iaspi_plugin_51') 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