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]

Reply via email to