mturk 2004/12/12 23:41:07
Modified: jk/native/common jk_uri_worker_map.c
Log:
Use case insensitive mapping for WIN32, cause Admin equals admin on
windows. Also force nomatces before any other mappings.
Revision Changes Path
1.36 +138 -62
jakarta-tomcat-connectors/jk/native/common/jk_uri_worker_map.c
Index: jk_uri_worker_map.c
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_uri_worker_map.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- jk_uri_worker_map.c 7 Dec 2004 14:30:23 -0000 1.35
+++ jk_uri_worker_map.c 13 Dec 2004 07:41:07 -0000 1.36
@@ -42,6 +42,14 @@
/* match multiple wild characters (*) and (?) */
#define MATCH_TYPE_WILDCHAR_PATH (5)
+#ifdef WIN32
+#define JK_STRCMP strcasecmp
+#define JK_STRNCMP strnicmp
+#else
+#define JK_STRCMP strcmp
+#define JK_STRNCMP strncmp
+#endif
+
struct uri_worker_record
{
/* Original uri for logging */
@@ -81,10 +89,13 @@
uri_worker_record_t **maps;
/* Map Number */
- unsigned size;
+ unsigned int size;
/* Map Capacity */
- unsigned capacity;
+ unsigned int capacity;
+
+ /* NoMap Number */
+ unsigned int no_size;
};
static int worker_compare(const void *elem1, const void *elem2)
@@ -165,8 +176,8 @@
if ((('.' == *after_suffix) || ('/' == *after_suffix)
|| (' ' == *after_suffix))
&& (0 ==
- strncmp(uw_map->maps[i]->context, uri,
- uw_map->maps[i]->ctxt_len))) {
+ JK_STRNCMP(uw_map->maps[i]->context, uri,
+ uw_map->maps[i]->ctxt_len))) {
/*
* Security violation !!!
* this is a fraud.
@@ -421,7 +432,10 @@
uw_map->maps[uw_map->size] = uwr;
uw_map->size++;
-
+ if (uwr->no_match) {
+ /* If we split the mappings this one will be calculated */
+ uw_map->no_size++;
+ }
worker_qsort(uw_map);
JK_TRACE_EXIT(l);
return JK_TRUE;
@@ -543,6 +557,108 @@
*d = '\0';
}
+static int is_nomap_match(jk_uri_worker_map_t *uw_map,
+ const char *uri, 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 only nomatch mappings */
+ if (!uwr->no_match)
+ continue;
+
+ if (uwr->match_type == MATCH_TYPE_WILDCHAR_PATH) {
+ char *wname;
+ /* Map is already sorted by ctxt_len */
+ if (wildchar_match(uri, uwr->context,
+#ifdef WIN32
+ 1
+#else
+ 0
+#endif
+ ) == 0) {
+ wname = uwr->worker_name;
+ jk_log(l, JK_LOG_DEBUG,
+ "Found a wildchar no match %s -> %s\n",
+ uwr->worker_name, uwr->context);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ else if (JK_STRNCMP(uwr->context, uri, uwr->ctxt_len) == 0) {
+ if (uwr->match_type == MATCH_TYPE_EXACT) {
+ if (strlen(uri) == uwr->ctxt_len) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Found an exact no match %s -> %s\n",
+ uwr->worker_name, uwr->context);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ else if (uwr->match_type == MATCH_TYPE_CONTEXT) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Found a context no match %s -> %s\n",
+ uwr->worker_name, uwr->context);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else if (uwr->match_type == MATCH_TYPE_GENERAL_SUFFIX) {
+ int suffix_start = last_index_of(uri, uwr->suffix[0]);
+ if (suffix_start >= 0
+ && 0 == JK_STRCMP(uri + suffix_start, uwr->suffix)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Found a general no suffix match for %s ->
%s\n",
+ uwr->worker_name, uwr->uri);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ else if (uwr->match_type == MATCH_TYPE_CONTEXT_PATH) {
+ char *suffix_path = NULL;
+ if (strlen(uri) > 1
+ && (suffix_path = strchr(uri + 1, '/')) != NULL) {
+ if (0 ==
+ JK_STRNCMP(suffix_path, uwr->suffix,
+ strlen(uwr->suffix))) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Found a general context no match %s -> %s\n",
+ uwr->worker_name, uwr->context);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ }
+ else { /* suffix match */
+ size_t suffix_start = strlen(uri) - 1;
+
+ for ( ; suffix_start > 0 && '.' != uri[suffix_start];
+ suffix_start--) {
+ /* TODO: use while loop */
+ }
+ if (uri[suffix_start] == '.') {
+ const char *suffix = uri + suffix_start + 1;
+ if (JK_STRCMP(suffix, uwr->suffix) == 0) {
+ if (uwr->no_match) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Found a no suffix match for %s -> %s\n",
+ uwr->worker_name, uwr->uri);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
char *map_uri_to_worker(jk_uri_worker_map_t *uw_map,
char *uri, jk_logger_t *l)
@@ -572,11 +688,18 @@
jk_log(l, JK_LOG_DEBUG, "Attempting to map URI '%s' from %d maps\n",
uri, uw_map->size);
+
+ /* Check nomatch first */
+ if (uw_map->no_size && is_nomap_match(uw_map, uri, l)) {
+ /* Found a no match */
+ JK_TRACE_EXIT(l);
+ return NULL;
+ }
for (i = 0; i < uw_map->size; i++) {
uri_worker_record_t *uwr = uw_map->maps[i];
/* Check for no match in any case */
- if (uwr->ctxt_len < longest_match && !uwr->no_match) {
+ if (uwr->no_match || (uwr->ctxt_len < longest_match)) {
/* can not be a best match anyway */
continue;
}
@@ -593,30 +716,16 @@
#endif
) == 0) {
wname = uwr->worker_name;
- if (uwr->no_match) {
- jk_log(l, JK_LOG_DEBUG,
- "Found a wildchar no match %s -> %s\n",
- uwr->worker_name, uwr->context);
- wname = NULL;
- }
- else
- jk_log(l, JK_LOG_DEBUG,
- "Found a wildchar match %s -> %s\n",
- uwr->worker_name, uwr->context);
+ jk_log(l, JK_LOG_DEBUG,
+ "Found a wildchar match %s -> %s\n",
+ uwr->worker_name, uwr->context);
JK_TRACE_EXIT(l);
return wname;
}
}
- else if (strncmp(uwr->context, uri, uwr->ctxt_len) == 0) {
+ else if (JK_STRNCMP(uwr->context, uri, uwr->ctxt_len) == 0) {
if (uwr->match_type == MATCH_TYPE_EXACT) {
if (strlen(uri) == uwr->ctxt_len) {
- if (uwr->no_match) {
- jk_log(l, JK_LOG_DEBUG,
- "Found an exact no match %s -> %s\n",
- uwr->worker_name, uwr->context);
- JK_TRACE_EXIT(l);
- return NULL;
- }
jk_log(l, JK_LOG_DEBUG,
"Found an exact match %s -> %s\n",
uwr->worker_name, uwr->context);
@@ -626,13 +735,6 @@
}
else if (uwr->match_type == MATCH_TYPE_CONTEXT) {
if (uwr->ctxt_len > longest_match) {
- if (uwr->no_match) {
- jk_log(l, JK_LOG_DEBUG,
- "Found a context no match %s -> %s\n",
- uwr->worker_name, uwr->context);
- JK_TRACE_EXIT(l);
- return NULL;
- }
jk_log(l, JK_LOG_DEBUG,
"Found a context match %s -> %s\n",
uwr->worker_name, uwr->context);
@@ -645,13 +747,6 @@
if (suffix_start >= 0
&& 0 == strcmp(uri + suffix_start, uwr->suffix)) {
if (uwr->ctxt_len >= longest_match) {
- if (uwr->no_match) {
- jk_log(l, JK_LOG_DEBUG,
- "Found a general no suffix match for
%s -> %s\n",
- uwr->worker_name, uwr->uri);
- JK_TRACE_EXIT(l);
- return NULL;
- }
jk_log(l, JK_LOG_DEBUG,
"Found a general suffix match %s -> *%s\n",
uwr->worker_name, uwr->suffix);
@@ -665,16 +760,9 @@
if (strlen(uri) > 1
&& (suffix_path = strchr(uri + 1, '/')) != NULL) {
if (0 ==
- strncmp(suffix_path, uwr->suffix,
- strlen(uwr->suffix))) {
- if (uwr->no_match) {
- jk_log(l, JK_LOG_DEBUG,
- "Found a general context no match %s ->
%s\n",
- uwr->worker_name, uwr->context);
- JK_TRACE_EXIT(l);
- return NULL;
- }
- else if (uwr->ctxt_len >= longest_match) {
+ JK_STRNCMP(suffix_path, uwr->suffix,
+ strlen(uwr->suffix))) {
+ if (uwr->ctxt_len >= longest_match) {
jk_log(l, JK_LOG_DEBUG,
"Found a general context path match %s
-> *%s\n",
uwr->worker_name, uwr->suffix);
@@ -695,20 +783,8 @@
if (uri[suffix_start] == '.') {
const char *suffix = uri + suffix_start + 1;
/* for WinXX, fix the JsP != jsp problems */
-#ifdef WIN32
- if (strcasecmp(suffix, uwr->suffix) == 0) {
-#else
- if (strcmp(suffix, uwr->suffix) == 0) {
-#endif
-
+ if (JK_STRCMP(suffix, uwr->suffix) == 0) {
if (uwr->ctxt_len >= longest_match) {
- if (uwr->no_match) {
- jk_log(l, JK_LOG_DEBUG,
- "Found a no suffix match for %s
-> %s\n",
- uwr->worker_name, uwr->uri);
- JK_TRACE_EXIT(l);
- return NULL;
- }
jk_log(l, JK_LOG_DEBUG,
"Found a suffix match %s -> *.%s\n",
uwr->worker_name, uwr->suffix);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]