You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2006/03/16 09:10:20 UTC

svn commit: r386282 - in /tomcat/connectors/trunk/jk: native/common/jk_uri_worker_map.c xdocs/changelog.xml

Author: mturk
Date: Thu Mar 16 00:10:18 2006
New Revision: 386282

URL: http://svn.apache.org/viewcvs?rev=386282&view=rev
Log:
Fix #38889 by sorting worker map depending on the path
elements, to comply with Servlet spec.
Patch provided by Steve Revilak.

Modified:
    tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c
    tomcat/connectors/trunk/jk/xdocs/changelog.xml

Modified: tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c
URL: http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c?rev=386282&r1=386281&r2=386282&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 Thu Mar 16 00:10:18 2006
@@ -36,10 +36,48 @@
 #define JK_STRNCMP  strncmp
 #endif
 
+
+/*
+ * Given context uri, count the number of path tokens.
+ *
+ * Servlet specification 2.4, SRV.11.1 says
+
+ *   The container will recursively try tomatch the longest
+ *   path-prefix. This is done by stepping down the path tree a
+ *   directory at a time, using the / character as a path
+ *   separator. The longest match determines the servlet selected.
+ *
+ * The implication seems to be `most uri path elements is most exact'.
+ * This is a little helper function to count uri tokens, so we can
+ * keep the worker map sorted with most specific first.
+ */
+static int worker_count_context_uri_tokens(const char * context)
+{
+    const char * c = context;
+    int count = 0;
+    while (c && *c) {
+        if ('/' == *c++)
+            count++;
+    }
+    return count;
+}
+
 static int worker_compare(const void *elem1, const void *elem2)
 {
     uri_worker_record_t *e1 = *(uri_worker_record_t **)elem1;
     uri_worker_record_t *e2 = *(uri_worker_record_t **)elem2;
+    int e1_tokens = 0;
+    int e2_tokens = 0;
+
+    e1_tokens = worker_count_context_uri_tokens(e1->context);
+    e2_tokens = worker_count_context_uri_tokens(e2->context);
+
+    if (e1_tokens != e2_tokens) {
+        return (e2_tokens - e1_tokens);
+    }
+    /* given the same number of URI tokens, use character
+     * length as a tie breaker
+     */
     return ((int)e2->context_len - (int)e1->context_len);
 }
 

Modified: tomcat/connectors/trunk/jk/xdocs/changelog.xml
URL: http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/xdocs/changelog.xml?rev=386282&r1=386281&r2=386282&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/xdocs/changelog.xml (original)
+++ tomcat/connectors/trunk/jk/xdocs/changelog.xml Thu Mar 16 00:10:18 2006
@@ -25,6 +25,11 @@
   <br />
   <subsection name="Native">
     <changelog>
+      <fix>
+      <bug>38889</bug>: Use worker map sorting depending on the path
+      elements, to comply with Servlet spec. Patch provided by
+      Steve Revilak. (mturk)
+      </fix>
       <update>
       <bug>36138</bug>: Added Busyness lb method. Patch provided
       by  Chris Lamprecht. (mturk)



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org