about summary refs log tree commit homepage
path: root/ext/http11/tst_search.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/http11/tst_search.c')
-rw-r--r--ext/http11/tst_search.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/ext/http11/tst_search.c b/ext/http11/tst_search.c
index efa1cfa..4cfe6ff 100644
--- a/ext/http11/tst_search.c
+++ b/ext/http11/tst_search.c
@@ -7,18 +7,20 @@
 void *tst_search(unsigned char *key, struct tst *tst, int *prefix_len)
 {
   struct node *current_node;
+  void *longest_match = NULL;
   int key_index;
   
   assert(key != NULL && "key can't be NULL");
   assert(tst != NULL && "tst can't be NULL");
   
-  
   if(key[0] == 0)
     return NULL;
   
   if(tst->head[(int)key[0]] == NULL)
     return NULL;
+
   
+  if(prefix_len) *prefix_len = 0;
   current_node = tst->head[(int)key[0]];
   key_index = 1;
   
@@ -30,7 +32,13 @@ void *tst_search(unsigned char *key, struct tst *tst, int *prefix_len)
             if(prefix_len) *prefix_len = key_index;
             return current_node->middle;
           } else {
+
             current_node = current_node->middle;
+            if(current_node && current_node->value == 0) {
+              if(prefix_len) *prefix_len = key_index+1;
+              longest_match = current_node->middle;
+            }
+
             key_index++;
             continue;
           }
@@ -39,16 +47,23 @@ void *tst_search(unsigned char *key, struct tst *tst, int *prefix_len)
                ((current_node->value != 0) && (key[key_index] <
                                                current_node->value)) )
         {
+          if(current_node->left && current_node->value == 0) {
+            if(prefix_len) *prefix_len = key_index;
+            longest_match = current_node->middle;
+          }
           current_node = current_node->left;
           continue;
         }
       else
         {
+          if(current_node->right && current_node->value == 0) {
+            if(prefix_len) *prefix_len = key_index;
+            longest_match = current_node->middle;
+          }
           current_node = current_node->right;
           continue;
         }
     }
   
-  if(prefix_len) *prefix_len = key_index;
-  return NULL;
+  return longest_match;
 }