| /* |
| * 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 <windows.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <httpfilt.h> |
| |
| #include <axis2_const.h> |
| #include <axis2_defines.h> |
| #include <axutil_env.h> |
| #include <axutil_stream.h> |
| |
| #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; |
| } |