Author: rjung Date: Sun Nov 4 07:53:44 2007 New Revision: 591792 URL: http://svn.apache.org/viewvc?rev=591792&view=rev Log: Fix BZ 42038: Correct overlay of mounts and unmounts for IIS.
For IIS we check for mounts using two passes, once with the URL with the vhost name prepended, and if we don't find a match, another pass with the original URL. The semantics of unmount are, that first all mounts must be checked, and after that all unmounts. Until now, a mount found in IIS during the second pass, will win over an unmount during the first pass. We move the two passes into the mapping function and add the vhost name as another parameter. Refactored the mapping function a little, by moving out the search for a match, which we now need to call twice. Also removed some logging from IIS, because the same infomration gets logged inside the mapping function on the same level. Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c?rev=591792&r1=591791&r2=591792&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c (original) +++ tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c Sun Nov 4 07:53:44 2007 @@ -2647,7 +2647,7 @@ } ap_no2slash(clean_uri); - worker = map_uri_to_worker(conf->uw_map, clean_uri, conf->log); + worker = map_uri_to_worker(conf->uw_map, clean_uri, NULL, conf->log); /* Don't know the worker, ForwardDirectories is set, there is a * previous request for which the handler is JK_HANDLER (as set by Modified: tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c?rev=591792&r1=591791&r2=591792&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c (original) +++ tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c Sun Nov 4 07:53:44 2007 @@ -2088,7 +2088,7 @@ worker_name, r->uri); } else { - worker_name = map_uri_to_worker(xconf->uw_map, r->uri, xconf->log); + worker_name = map_uri_to_worker(xconf->uw_map, r->uri, NULL, xconf->log); if (worker_name == NULL && worker_env.num_of_workers) { worker_name = worker_env.worker_list[0]; if (JK_IS_DEBUG_LEVEL(xconf->log)) @@ -2919,7 +2919,7 @@ } } - worker = map_uri_to_worker(conf->uw_map, r->uri, conf->log); + worker = map_uri_to_worker(conf->uw_map, r->uri, NULL, conf->log); if (worker) { r->handler = apr_pstrdup(r->pool, JK_HANDLER); @@ -3061,7 +3061,7 @@ return DECLINED; } - worker = map_uri_to_worker(conf->uw_map, r->uri, conf->log); + worker = map_uri_to_worker(conf->uw_map, r->uri, NULL, conf->log); if (worker) { r->handler = apr_pstrdup(r->pool, JK_HANDLER); Modified: tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c?rev=591792&r1=591791&r2=591792&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c Sun Nov 4 07:53:44 2007 @@ -484,9 +484,61 @@ return rc; } -static int is_nomap_match(jk_uri_worker_map_t *uw_map, - const char *uri, const char* worker, - jk_logger_t *l) +static const char *find_match(jk_uri_worker_map_t *uw_map, + const char *url, jk_logger_t *l) +{ + unsigned int i; + + JK_TRACE_ENTER(l); + + for (i = 0; i < uw_map->size; i++) { + uri_worker_record_t *uwr = uw_map->maps[i]; + + /* Check for match types */ + if ((uwr->match_type & MATCH_TYPE_DISABLED) || + (uwr->match_type & MATCH_TYPE_NO_MATCH)) + continue; + + if (JK_IS_DEBUG_LEVEL(l)) + jk_log(l, JK_LOG_DEBUG, "Attempting to map context URI '%s=%s' source '%s'", + uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l)); + + if (uwr->match_type & MATCH_TYPE_WILDCHAR_PATH) { + /* Map is already sorted by context_len */ + if (wildchar_match(url, uwr->context, +#ifdef WIN32 + 0 +#else + 0 +#endif + ) == 0) { + if (JK_IS_DEBUG_LEVEL(l)) + jk_log(l, JK_LOG_DEBUG, + "Found a wildchar match '%s=%s'", + uwr->context, uwr->worker_name); + JK_TRACE_EXIT(l); + return uwr->worker_name; + } + } + else if (JK_STRNCMP(uwr->context, url, uwr->context_len) == 0) { + if (strlen(url) == uwr->context_len) { + if (JK_IS_DEBUG_LEVEL(l)) + jk_log(l, JK_LOG_DEBUG, + "Found an exact match '%s=%s'", + uwr->context, uwr->worker_name); + JK_TRACE_EXIT(l); + return uwr->worker_name; + } + } + } + + JK_TRACE_EXIT(l); + return NULL; +} + +static int is_nomatch(jk_uri_worker_map_t *uw_map, + const char *uri, const char* worker, + jk_logger_t *l) { unsigned int i; @@ -536,9 +588,11 @@ const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map, - const char *uri, jk_logger_t *l) + const char *uri, const char *vhost, + jk_logger_t *l) { unsigned int i; + unsigned int vhost_len; int reject_unsafe; const char *rv = NULL; char url[JK_MAX_URI_LEN+1]; @@ -570,10 +624,31 @@ * everything after the first ';' char. */ reject_unsafe = uw_map->reject_unsafe; + vhost_len = 0; +/* + * In case we got a vhost, we prepend a slash + * and the vhost to the url in order to enable + * vhost mapping rules especially for IIS. + */ + if (vhost) { +/* Size including leading slash. */ + vhost_len = strlen(vhost) + 1; + if (vhost_len >= JK_MAX_URI_LEN) { + vhost_len = 0; + jk_log(l, JK_LOG_WARNING, + "Host prefix %s for URI %s is invalid and will be ignored." + " It must be smaller than %d chars", + vhost, JK_MAX_URI_LEN-1); + } + else { + url[0] = '/'; + strncpy(&url[1], vhost, vhost_len); + } + } for (i = 0; i < strlen(uri); i++) { if (i == JK_MAX_URI_LEN) { jk_log(l, JK_LOG_WARNING, - "Uri %s is invalid. Uri must be smaller then %d chars", + "URI %s is invalid. URI must be smaller than %d chars", uri, JK_MAX_URI_LEN); JK_TRACE_EXIT(l); return NULL; @@ -581,15 +656,15 @@ if (uri[i] == ';') break; else { - url[i] = uri[i]; - if (reject_unsafe && (url[i] == '%' || url[i] == '\\')) { + url[i + vhost_len] = uri[i]; + if (reject_unsafe && (uri[i] == '%' || uri[i] == '\\')) { jk_log(l, JK_LOG_INFO, "Potentially unsafe request url '%s' rejected", uri); JK_TRACE_EXIT(l); return NULL; } } } - url[i] = '\0'; + url[i + vhost_len] = '\0'; if (JK_IS_DEBUG_LEVEL(l)) { char *url_rewrite = strstr(uri, JK_PATH_SESSION_IDENTIFIER); @@ -600,64 +675,30 @@ if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, "Attempting to map URI '%s' from %d maps", url, uw_map->size); - - for (i = 0; i < uw_map->size; i++) { - uri_worker_record_t *uwr = uw_map->maps[i]; - - /* Check for match types */ - if ((uwr->match_type & MATCH_TYPE_DISABLED) || - (uwr->match_type & MATCH_TYPE_NO_MATCH)) - continue; - - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, "Attempting to map context URI '%s=%s' source '%s'", - uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l)); - - if (uwr->match_type & MATCH_TYPE_WILDCHAR_PATH) { - const char *wname; - /* Map is already sorted by context_len */ - if (wildchar_match(url, uwr->context, -#ifdef WIN32 - 0 -#else - 0 -#endif - ) == 0) { - wname = uwr->worker_name; - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Found a wildchar match '%s=%s'", - uwr->context, uwr->worker_name); - JK_TRACE_EXIT(l); - rv = wname; - goto cleanup; - } - } - else if (JK_STRNCMP(uwr->context, url, uwr->context_len) == 0) { - if (strlen(url) == uwr->context_len) { - if (JK_IS_DEBUG_LEVEL(l)) - jk_log(l, JK_LOG_DEBUG, - "Found an exact match '%s=%s'", - uwr->context, uwr->worker_name); - JK_TRACE_EXIT(l); - rv = uwr->worker_name; - goto cleanup; - } - } + rv = find_match(uw_map, url, l); +/* If this doesn't find a match, try without the vhost. */ + if (! rv && vhost_len) { + rv = find_match(uw_map, &url[vhost_len], l); } - /* No matches found */ - JK_TRACE_EXIT(l); -cleanup: +/* In case we found a match, check for the unmounts. */ if (rv && uw_map->nosize) { - if (is_nomap_match(uw_map, url, rv, l)) { - if (JK_IS_DEBUG_LEVEL(l)) +/* Again first including vhost. */ + if (is_nomatch(uw_map, url, rv, l)) { + rv = NULL; + } +/* If no unmount was find, try without vhost. */ + else if (vhost_len && is_nomatch(uw_map, &url[vhost_len], rv, l)) { + rv = NULL; + } + if (rv == NULL && JK_IS_DEBUG_LEVEL(l)) { jk_log(l, JK_LOG_DEBUG, - "Denying matching for worker %s by nomatch rule", + "Denying match for worker %s by nomatch rule", rv); - rv = NULL; } } + + JK_TRACE_EXIT(l); return rv; } Modified: tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h?rev=591792&r1=591791&r2=591792&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h (original) +++ tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h Sun Nov 4 07:53:44 2007 @@ -141,7 +141,8 @@ unsigned int source_type, jk_logger_t *l); const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map, - const char *uri, jk_logger_t *l); + const char *uri, const char *vhost, + jk_logger_t *l); int uri_worker_map_load(jk_uri_worker_map_t *uw_map, jk_logger_t *l); Modified: tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c?rev=591792&r1=591791&r2=591792&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c (original) +++ tomcat/connectors/trunk/jk/native/iis/jk_isapi_plugin.c Sun Nov 4 07:53:44 2007 @@ -1260,19 +1260,10 @@ } if (szHost > 0) { StringCbCat(snuri, INTERNET_MAX_URL_LENGTH, Host); - StringCbCat(snuri, INTERNET_MAX_URL_LENGTH, uri); - if (JK_IS_DEBUG_LEVEL(logger)) - jk_log(logger, JK_LOG_DEBUG, - "Virtual Host redirection of %s", - snuri); - worker = map_uri_to_worker(uw_map, snuri, logger); + worker = map_uri_to_worker(uw_map, uri, snuri, logger); } - if (!worker) { - if (JK_IS_DEBUG_LEVEL(logger)) - jk_log(logger, JK_LOG_DEBUG, - "Default redirection of %s", - uri); - worker = map_uri_to_worker(uw_map, uri, logger); + else { + worker = map_uri_to_worker(uw_map, uri, NULL, logger); } /* * Check if somebody is feading us with his own TOMCAT data headers. Modified: tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml?rev=591792&r1=591791&r2=591792&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml (original) +++ tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml Sun Nov 4 07:53:44 2007 @@ -44,6 +44,9 @@ <subsection name="Native"> <changelog> <fix> + <bug>42038</bug>: Correct overlay of mounts and unmounts for IIS. (rjung) + </fix> + <fix> <bug>43684</bug>: Replace JkMountFile by JkMountFileReload in uriworkermap.properties docs. (rjung) </fix> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]