You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@apache.org on 2010/09/16 02:54:59 UTC

svn commit: r997553 - /httpd/httpd/trunk/modules/mappers/mod_rewrite.c

Author: wrowe
Date: Thu Sep 16 00:54:58 2010
New Revision: 997553

URL: http://svn.apache.org/viewvc?rev=997553&view=rev
Log:
*) Accept modern bash test conventions of -h or -L for testing symlinks
   (for another patch against -l yet-to-come)

*) Introduce >= and <= syntax for greater-or-equal, or less-or-equal
   string comparisons

*) Respect [NC] conventions for >[=]/<[=] string comparison, which is
   horribly sensitive to the current charset.

Modified:
    httpd/httpd/trunk/modules/mappers/mod_rewrite.c

Modified: httpd/httpd/trunk/modules/mappers/mod_rewrite.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mappers/mod_rewrite.c?rev=997553&r1=997552&r2=997553&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/mappers/mod_rewrite.c (original)
+++ httpd/httpd/trunk/modules/mappers/mod_rewrite.c Thu Sep 16 00:54:58 2010
@@ -260,9 +260,11 @@ typedef enum {
     CONDPAT_FILE_XBIT,
     CONDPAT_LU_URL,
     CONDPAT_LU_FILE,
-    CONDPAT_STR_GT,
     CONDPAT_STR_LT,
-    CONDPAT_STR_EQ
+    CONDPAT_STR_LE,
+    CONDPAT_STR_EQ,
+    CONDPAT_STR_GT,
+    CONDPAT_STR_GE
 } pattern_type;
 
 typedef struct {
@@ -3173,17 +3175,28 @@ static const char *cmd_rewritecond(cmd_p
             switch (a2[1]) {
             case 'f': newcond->ptype = CONDPAT_FILE_EXISTS; break;
             case 's': newcond->ptype = CONDPAT_FILE_SIZE;   break;
-            case 'l': newcond->ptype = CONDPAT_FILE_LINK;   break;
             case 'd': newcond->ptype = CONDPAT_FILE_DIR;    break;
+            case 'l': newcond->ptype = CONDPAT_FILE_LINK;   break;
             case 'x': newcond->ptype = CONDPAT_FILE_XBIT;   break;
+            case 'h': newcond->ptype = CONDPAT_FILE_LINK;   break;
+            case 'L': newcond->ptype = CONDPAT_FILE_LINK;   break;
             case 'U': newcond->ptype = CONDPAT_LU_URL;      break;
             case 'F': newcond->ptype = CONDPAT_LU_FILE;     break;
             }
         }
         else {
             switch (*a2) {
-            case '>': newcond->ptype = CONDPAT_STR_GT; break;
-            case '<': newcond->ptype = CONDPAT_STR_LT; break;
+            case '>': if (a2[1] == '=')
+                          ++a2, newcond->ptype = CONDPAT_STR_GE;
+                      else
+                          ++a2, newcond->ptype = CONDPAT_STR_GT;
+                      break;
+            case '<': newcond->ptype = CONDPAT_STR_LT;
+                      if (a2[1] == '=')
+                          ++a2, newcond->ptype = CONDPAT_STR_LE;
+                      else
+                          ++a2, newcond->ptype = CONDPAT_STR_LT;
+                      break;
             case '=': newcond->ptype = CONDPAT_STR_EQ;
                 /* "" represents an empty string */
                 if (*++a2 == '"' && a2[1] == '"' && !a2[2]) {
@@ -3194,7 +3207,7 @@ static const char *cmd_rewritecond(cmd_p
         }
     }
 
-    if (newcond->ptype && newcond->ptype != CONDPAT_STR_EQ &&
+    if ((newcond->ptype < CONDPAT_STR_LT || newcond->ptype > CONDPAT_STR_GE) &&
         (newcond->flags & CONDFLAG_NOCASE)) {
         ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server,
                      "RewriteCond: NoCase option for non-regex pattern '%s' "
@@ -3583,6 +3596,7 @@ static int apply_rewrite_cond(rewritecon
     request_rec *rsub, *r = ctx->r;
     ap_regmatch_t regmatch[AP_MAX_REG_MATCH];
     int rc = 0;
+    int basis;
 
     switch (p->ptype) {
     case CONDPAT_FILE_EXISTS:
@@ -3651,15 +3665,36 @@ static int apply_rewrite_cond(rewritecon
         }
         break;
 
+    case CONDPAT_STR_GE:
+        basis = 0;
+        goto test_str_g;
     case CONDPAT_STR_GT:
-        rc = (compare_lexicography(input, p->pattern+1) == 1) ? 1 : 0;
+        basis = 1;
+test_str_g:
+        if (p->flags & CONDFLAG_NOCASE) {
+            rc = (strcasecmp(input, p->pattern+1) >= basis) ? 1 : 0;
+        }
+        else {
+            rc = (compare_lexicography(input, p->pattern+1) >= basis) ? 1 : 0;
+        }
         break;
 
+    case CONDPAT_STR_LE:
+        basis = 0;
+        goto test_str_l;
     case CONDPAT_STR_LT:
-        rc = (compare_lexicography(input, p->pattern+1) == -1) ? 1 : 0;
+        basis = -1;
+test_str_l:
+        if (p->flags & CONDFLAG_NOCASE) {
+            rc = (strcasecmp(input, p->pattern+1) <= basis) ? 1 : 0;
+        }
+        else {
+            rc = (compare_lexicography(input, p->pattern+1) <= basis) ? 1 : 0;
+        }
         break;
 
     case CONDPAT_STR_EQ:
+        /* Note: the only type where the operator is dropped from p->pattern */
         if (p->flags & CONDFLAG_NOCASE) {
             rc = !strcasecmp(input, p->pattern);
         }



Re: svn commit: r997553 - /httpd/httpd/trunk/modules/mappers/mod_rewrite.c

Posted by Ruediger Pluem <rp...@apache.org>.

On 09/16/2010 02:54 AM, wrowe@apache.org wrote:
> Author: wrowe
> Date: Thu Sep 16 00:54:58 2010
> New Revision: 997553
> 
> URL: http://svn.apache.org/viewvc?rev=997553&view=rev
> Log:
> *) Accept modern bash test conventions of -h or -L for testing symlinks
>    (for another patch against -l yet-to-come)
> 
> *) Introduce >= and <= syntax for greater-or-equal, or less-or-equal
>    string comparisons
> 
> *) Respect [NC] conventions for >[=]/<[=] string comparison, which is
>    horribly sensitive to the current charset.
> 
> Modified:
>     httpd/httpd/trunk/modules/mappers/mod_rewrite.c
> 
> Modified: httpd/httpd/trunk/modules/mappers/mod_rewrite.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mappers/mod_rewrite.c?rev=997553&r1=997552&r2=997553&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/mappers/mod_rewrite.c (original)
> +++ httpd/httpd/trunk/modules/mappers/mod_rewrite.c Thu Sep 16 00:54:58 2010
> @@ -260,9 +260,11 @@ typedef enum {
>      CONDPAT_FILE_XBIT,
>      CONDPAT_LU_URL,
>      CONDPAT_LU_FILE,
> -    CONDPAT_STR_GT,
>      CONDPAT_STR_LT,
> -    CONDPAT_STR_EQ
> +    CONDPAT_STR_LE,
> +    CONDPAT_STR_EQ,
> +    CONDPAT_STR_GT,
> +    CONDPAT_STR_GE
>  } pattern_type;
>  
>  typedef struct {
> @@ -3173,17 +3175,28 @@ static const char *cmd_rewritecond(cmd_p
>              switch (a2[1]) {
>              case 'f': newcond->ptype = CONDPAT_FILE_EXISTS; break;
>              case 's': newcond->ptype = CONDPAT_FILE_SIZE;   break;
> -            case 'l': newcond->ptype = CONDPAT_FILE_LINK;   break;
>              case 'd': newcond->ptype = CONDPAT_FILE_DIR;    break;
> +            case 'l': newcond->ptype = CONDPAT_FILE_LINK;   break;
>              case 'x': newcond->ptype = CONDPAT_FILE_XBIT;   break;
> +            case 'h': newcond->ptype = CONDPAT_FILE_LINK;   break;
> +            case 'L': newcond->ptype = CONDPAT_FILE_LINK;   break;
>              case 'U': newcond->ptype = CONDPAT_LU_URL;      break;
>              case 'F': newcond->ptype = CONDPAT_LU_FILE;     break;
>              }
>          }
>          else {
>              switch (*a2) {
> -            case '>': newcond->ptype = CONDPAT_STR_GT; break;
> -            case '<': newcond->ptype = CONDPAT_STR_LT; break;
> +            case '>': if (a2[1] == '=')
> +                          ++a2, newcond->ptype = CONDPAT_STR_GE;
> +                      else
> +                          ++a2, newcond->ptype = CONDPAT_STR_GT;

Why ++a2 here? The operator '>' is only one char.

> +                      break;
> +            case '<': newcond->ptype = CONDPAT_STR_LT;
> +                      if (a2[1] == '=')
> +                          ++a2, newcond->ptype = CONDPAT_STR_LE;
> +                      else
> +                          ++a2, newcond->ptype = CONDPAT_STR_LT;

Why ++a2 here? The operator '>' is only one char.


> +                      break;
>              case '=': newcond->ptype = CONDPAT_STR_EQ;
>                  /* "" represents an empty string */
>                  if (*++a2 == '"' && a2[1] == '"' && !a2[2]) {


Regards

Rüdiger

Re: svn commit: r997553 - /httpd/httpd/trunk/modules/mappers/mod_rewrite.c

Posted by Rich Bowen <rb...@rcbowen.com>.
Done. Can someone look over what I did and let me know if I botched  
anything? Thanks.


On Sep 15, 2010, at 8:59 PM, William A. Rowe Jr. wrote:

> Adding a few new RewriteCond tests for mod_rewrite, and I could use  
> some help
> from our mod_rewrite docu fans to capture this for trunk... please  
> take a look
> and offer patches if you would?

--
Rich Bowen
rbowen@rcbowen.com




---------------------------------------------------------------------
To unsubscribe, e-mail: docs-unsubscribe@httpd.apache.org
For additional commands, e-mail: docs-help@httpd.apache.org


Re: svn commit: r997553 - /httpd/httpd/trunk/modules/mappers/mod_rewrite.c

Posted by "William A. Rowe Jr." <wr...@rowe-clan.net>.
Adding a few new RewriteCond tests for mod_rewrite, and I could use some help
from our mod_rewrite docu fans to capture this for trunk... please take a look
and offer patches if you would?


On 9/15/2010 7:54 PM, wrowe@apache.org wrote:
> Author: wrowe
> Date: Thu Sep 16 00:54:58 2010
> New Revision: 997553
> 
> URL: http://svn.apache.org/viewvc?rev=997553&view=rev
> Log:
> *) Accept modern bash test conventions of -h or -L for testing symlinks
>    (for another patch against -l yet-to-come)
> 
> *) Introduce >= and <= syntax for greater-or-equal, or less-or-equal
>    string comparisons
> 
> *) Respect [NC] conventions for >[=]/<[=] string comparison, which is
>    horribly sensitive to the current charset.
> 
> Modified:
>     httpd/httpd/trunk/modules/mappers/mod_rewrite.c
> 
> Modified: httpd/httpd/trunk/modules/mappers/mod_rewrite.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mappers/mod_rewrite.c?rev=997553&r1=997552&r2=997553&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/mappers/mod_rewrite.c (original)
> +++ httpd/httpd/trunk/modules/mappers/mod_rewrite.c Thu Sep 16 00:54:58 2010
> @@ -260,9 +260,11 @@ typedef enum {
>      CONDPAT_FILE_XBIT,
>      CONDPAT_LU_URL,
>      CONDPAT_LU_FILE,
> -    CONDPAT_STR_GT,
>      CONDPAT_STR_LT,
> -    CONDPAT_STR_EQ
> +    CONDPAT_STR_LE,
> +    CONDPAT_STR_EQ,
> +    CONDPAT_STR_GT,
> +    CONDPAT_STR_GE
>  } pattern_type;
>  
>  typedef struct {
> @@ -3173,17 +3175,28 @@ static const char *cmd_rewritecond(cmd_p
>              switch (a2[1]) {
>              case 'f': newcond->ptype = CONDPAT_FILE_EXISTS; break;
>              case 's': newcond->ptype = CONDPAT_FILE_SIZE;   break;
> -            case 'l': newcond->ptype = CONDPAT_FILE_LINK;   break;
>              case 'd': newcond->ptype = CONDPAT_FILE_DIR;    break;
> +            case 'l': newcond->ptype = CONDPAT_FILE_LINK;   break;
>              case 'x': newcond->ptype = CONDPAT_FILE_XBIT;   break;
> +            case 'h': newcond->ptype = CONDPAT_FILE_LINK;   break;
> +            case 'L': newcond->ptype = CONDPAT_FILE_LINK;   break;
>              case 'U': newcond->ptype = CONDPAT_LU_URL;      break;
>              case 'F': newcond->ptype = CONDPAT_LU_FILE;     break;
>              }
>          }
>          else {
>              switch (*a2) {
> -            case '>': newcond->ptype = CONDPAT_STR_GT; break;
> -            case '<': newcond->ptype = CONDPAT_STR_LT; break;
> +            case '>': if (a2[1] == '=')
> +                          ++a2, newcond->ptype = CONDPAT_STR_GE;
> +                      else
> +                          ++a2, newcond->ptype = CONDPAT_STR_GT;
> +                      break;
> +            case '<': newcond->ptype = CONDPAT_STR_LT;
> +                      if (a2[1] == '=')
> +                          ++a2, newcond->ptype = CONDPAT_STR_LE;
> +                      else
> +                          ++a2, newcond->ptype = CONDPAT_STR_LT;
> +                      break;
>              case '=': newcond->ptype = CONDPAT_STR_EQ;
>                  /* "" represents an empty string */
>                  if (*++a2 == '"' && a2[1] == '"' && !a2[2]) {
> @@ -3194,7 +3207,7 @@ static const char *cmd_rewritecond(cmd_p
>          }
>      }
>  
> -    if (newcond->ptype && newcond->ptype != CONDPAT_STR_EQ &&
> +    if ((newcond->ptype < CONDPAT_STR_LT || newcond->ptype > CONDPAT_STR_GE) &&
>          (newcond->flags & CONDFLAG_NOCASE)) {
>          ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server,
>                       "RewriteCond: NoCase option for non-regex pattern '%s' "
> @@ -3583,6 +3596,7 @@ static int apply_rewrite_cond(rewritecon
>      request_rec *rsub, *r = ctx->r;
>      ap_regmatch_t regmatch[AP_MAX_REG_MATCH];
>      int rc = 0;
> +    int basis;
>  
>      switch (p->ptype) {
>      case CONDPAT_FILE_EXISTS:
> @@ -3651,15 +3665,36 @@ static int apply_rewrite_cond(rewritecon
>          }
>          break;
>  
> +    case CONDPAT_STR_GE:
> +        basis = 0;
> +        goto test_str_g;
>      case CONDPAT_STR_GT:
> -        rc = (compare_lexicography(input, p->pattern+1) == 1) ? 1 : 0;
> +        basis = 1;
> +test_str_g:
> +        if (p->flags & CONDFLAG_NOCASE) {
> +            rc = (strcasecmp(input, p->pattern+1) >= basis) ? 1 : 0;
> +        }
> +        else {
> +            rc = (compare_lexicography(input, p->pattern+1) >= basis) ? 1 : 0;
> +        }
>          break;
>  
> +    case CONDPAT_STR_LE:
> +        basis = 0;
> +        goto test_str_l;
>      case CONDPAT_STR_LT:
> -        rc = (compare_lexicography(input, p->pattern+1) == -1) ? 1 : 0;
> +        basis = -1;
> +test_str_l:
> +        if (p->flags & CONDFLAG_NOCASE) {
> +            rc = (strcasecmp(input, p->pattern+1) <= basis) ? 1 : 0;
> +        }
> +        else {
> +            rc = (compare_lexicography(input, p->pattern+1) <= basis) ? 1 : 0;
> +        }
>          break;
>  
>      case CONDPAT_STR_EQ:
> +        /* Note: the only type where the operator is dropped from p->pattern */
>          if (p->flags & CONDFLAG_NOCASE) {
>              rc = !strcasecmp(input, p->pattern);
>          }
> 
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: docs-unsubscribe@httpd.apache.org
For additional commands, e-mail: docs-help@httpd.apache.org


Re: svn commit: r997553 - /httpd/httpd/trunk/modules/mappers/mod_rewrite.c

Posted by Ruediger Pluem <rp...@apache.org>.

On 09/16/2010 08:57 PM, William A. Rowe Jr. wrote:
> On 9/16/2010 2:32 AM, Ruediger Pluem wrote:
>> Now we have:
>>
>> Failed Test         Stat Wstat Total Fail  Failed  List of Failed
>> -------------------------------------------------------------------------------
>> t/modules/rewrite.t               29    1   3.45%  20
>> Failed 1/1 test scripts, 0.00% okay. 1/29 subtests failed, 96.55% okay.
> 
> You were right in your earlier post, and part of my initial confusion was the
> offset of p->pattern's in equality vs gt/lt tests.  It made no sense.  I've
> normalized those so gt/lt follow the eq test, please give this another spin.

Test passes again. Thanks.

Regards

Rüdiger

Re: svn commit: r997553 - /httpd/httpd/trunk/modules/mappers/mod_rewrite.c

Posted by "William A. Rowe Jr." <wr...@rowe-clan.net>.
On 9/16/2010 2:32 AM, Ruediger Pluem wrote:
> 
> Now we have:
> 
> Failed Test         Stat Wstat Total Fail  Failed  List of Failed
> -------------------------------------------------------------------------------
> t/modules/rewrite.t               29    1   3.45%  20
> Failed 1/1 test scripts, 0.00% okay. 1/29 subtests failed, 96.55% okay.

You were right in your earlier post, and part of my initial confusion was the
offset of p->pattern's in equality vs gt/lt tests.  It made no sense.  I've
normalized those so gt/lt follow the eq test, please give this another spin.

Bill

Re: svn commit: r997553 - /httpd/httpd/trunk/modules/mappers/mod_rewrite.c

Posted by Ruediger Pluem <rp...@apache.org>.

On 09/16/2010 02:54 AM, wrowe@apache.org wrote:
> Author: wrowe
> Date: Thu Sep 16 00:54:58 2010
> New Revision: 997553
> 
> URL: http://svn.apache.org/viewvc?rev=997553&view=rev
> Log:
> *) Accept modern bash test conventions of -h or -L for testing symlinks
>    (for another patch against -l yet-to-come)
> 
> *) Introduce >= and <= syntax for greater-or-equal, or less-or-equal
>    string comparisons
> 
> *) Respect [NC] conventions for >[=]/<[=] string comparison, which is
>    horribly sensitive to the current charset.
> 
> Modified:
>     httpd/httpd/trunk/modules/mappers/mod_rewrite.c

Now we have:

Failed Test         Stat Wstat Total Fail  Failed  List of Failed
-------------------------------------------------------------------------------
t/modules/rewrite.t               29    1   3.45%  20
Failed 1/1 test scripts, 0.00% okay. 1/29 subtests failed, 96.55% okay.

Regards

Rüdiger