You are viewing a plain text version of this content. The canonical link for it is here.
Posted to docs@httpd.apache.org by "William A. Rowe Jr." <wr...@rowe-clan.net> on 2010/09/16 20:58:58 UTC

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

This is the second feature change to mod_rewrite this week.

If anyone can volunteer to update the mod_rewrite.xml that would be fantastic!
If not I'll update the docs sometime later next week.

-------- Original Message --------
Subject: svn commit: r997878 - /httpd/httpd/trunk/modules/mappers/mod_rewrite.c
Date: Thu, 16 Sep 2010 18:57:23 -0000
From: wrowe@apache.org
Reply-To: dev@httpd.apache.org
To: cvs@httpd.apache.org

Author: wrowe
Date: Thu Sep 16 18:57:23 2010
New Revision: 997878

URL: http://svn.apache.org/viewvc?rev=997878&view=rev
Log:
Introduce integer comparison support in RewriteCond

The operators -gt, -ge, -eq, -le, -lt and -ne follow the bash test' semantics
for comparing the integer values of the lhs and rhs expressions, as opposed
to the string evaluations performed by > >= = <= and <.

Note that -lt and -le overlap the existing -l test, and could be confused in
expresions such as -ltestfile - to avoid this conflict use -L or -h in place
of the legacy -l file symlink test operator.


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=997878&r1=997877&r2=997878&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/mappers/mod_rewrite.c (original)
+++ httpd/httpd/trunk/modules/mappers/mod_rewrite.c Thu Sep 16 18:57:23 2010
@@ -264,7 +264,12 @@ typedef enum {
     CONDPAT_STR_LE,
     CONDPAT_STR_EQ,
     CONDPAT_STR_GT,
-    CONDPAT_STR_GE
+    CONDPAT_STR_GE,
+    CONDPAT_INT_LT,
+    CONDPAT_INT_LE,
+    CONDPAT_INT_EQ,
+    CONDPAT_INT_GT,
+    CONDPAT_INT_GE
 } pattern_type;

 typedef struct {
@@ -3178,12 +3183,32 @@ static const char *cmd_rewritecond(cmd_p
             case 'f': newcond->ptype = CONDPAT_FILE_EXISTS; break;
             case 's': newcond->ptype = CONDPAT_FILE_SIZE;   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;
+            case 'l': if (a2[2] == 't')
+                          a2 += 3, newcond->ptype = CONDPAT_INT_LT;
+                      else if (a2[2] == 'e')
+                          a2 += 3, newcond->ptype = CONDPAT_INT_LE;
+                      else /* Historical; prefer -L or -h instead */
+                          newcond->ptype = CONDPAT_FILE_LINK;
+                      break;
+            case 'g': if (a2[2] == 't')
+                          a2 += 3, newcond->ptype = CONDPAT_INT_GT;
+                      else if (a2[2] == 'e')
+                          a2 += 3, newcond->ptype = CONDPAT_INT_GE;
+                      break;
+            case 'e': if (a2[2] == 'q')
+                          a2 += 3, newcond->ptype = CONDPAT_INT_EQ;
+                      break;
+            case 'n': if (a2[2] == 'e') {
+                          /* Inversion, ensure !-ne == -eq */
+                          a2 += 3, newcond->ptype = CONDPAT_INT_EQ;
+                          newcond->flags ^= CONDFLAG_NOTMATCH;
+                      }
+                      break;
             }
         }
         else {
@@ -3706,6 +3731,14 @@ test_str_l:
         }
         break;

+    case CONDPAT_INT_GE: rc = (atoi(input) >= atoi(p->pattern)); break;
+    case CONDPAT_INT_GT: rc = (atoi(input) > atoi(p->pattern));  break;
+
+    case CONDPAT_INT_LE: rc = (atoi(input) <= atoi(p->pattern)); break;
+    case CONDPAT_INT_LT: rc = (atoi(input) < atoi(p->pattern));  break;
+
+    case CONDPAT_INT_EQ: rc = (atoi(input) == atoi(p->pattern)); break;
+
     default:
         /* it is really a regexp pattern, so apply it */
         rc = !ap_regexec(p->regexp, input, AP_MAX_REG_MATCH, regmatch, 0);




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


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

Posted by Rich Bowen <rb...@rcbowen.com>.
I'll take a go at it this weekend, I think. Not certain I'll have  
time, but I think I will.


On Sep 16, 2010, at 2:58 PM, William A. Rowe Jr. wrote:

> This is the second feature change to mod_rewrite this week.
>
> If anyone can volunteer to update the mod_rewrite.xml that would be  
> fantastic!
> If not I'll update the docs sometime later next week.
>
> -------- Original Message --------
> Subject: svn commit: r997878 - /httpd/httpd/trunk/modules/mappers/ 
> mod_rewrite.c
> Date: Thu, 16 Sep 2010 18:57:23 -0000
> From: wrowe@apache.org
> Reply-To: dev@httpd.apache.org
> To: cvs@httpd.apache.org
>
> Author: wrowe
> Date: Thu Sep 16 18:57:23 2010
> New Revision: 997878
>
> URL: http://svn.apache.org/viewvc?rev=997878&view=rev
> Log:
> Introduce integer comparison support in RewriteCond
>
> The operators -gt, -ge, -eq, -le, -lt and -ne follow the bash test'  
> semantics
> for comparing the integer values of the lhs and rhs expressions, as  
> opposed
> to the string evaluations performed by > >= = <= and <.
>
> Note that -lt and -le overlap the existing -l test, and could be  
> confused in
> expresions such as -ltestfile - to avoid this conflict use -L or -h  
> in place
> of the legacy -l file symlink test operator.
>
>
> 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=997878&r1=997877&r2=997878&view=diff
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- httpd/httpd/trunk/modules/mappers/mod_rewrite.c (original)
> +++ httpd/httpd/trunk/modules/mappers/mod_rewrite.c Thu Sep 16  
> 18:57:23 2010
> @@ -264,7 +264,12 @@ typedef enum {
>     CONDPAT_STR_LE,
>     CONDPAT_STR_EQ,
>     CONDPAT_STR_GT,
> -    CONDPAT_STR_GE
> +    CONDPAT_STR_GE,
> +    CONDPAT_INT_LT,
> +    CONDPAT_INT_LE,
> +    CONDPAT_INT_EQ,
> +    CONDPAT_INT_GT,
> +    CONDPAT_INT_GE
> } pattern_type;
>
> typedef struct {
> @@ -3178,12 +3183,32 @@ static const char *cmd_rewritecond(cmd_p
>             case 'f': newcond->ptype = CONDPAT_FILE_EXISTS; break;
>             case 's': newcond->ptype = CONDPAT_FILE_SIZE;   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;
> +            case 'l': if (a2[2] == 't')
> +                          a2 += 3, newcond->ptype = CONDPAT_INT_LT;
> +                      else if (a2[2] == 'e')
> +                          a2 += 3, newcond->ptype = CONDPAT_INT_LE;
> +                      else /* Historical; prefer -L or -h instead */
> +                          newcond->ptype = CONDPAT_FILE_LINK;
> +                      break;
> +            case 'g': if (a2[2] == 't')
> +                          a2 += 3, newcond->ptype = CONDPAT_INT_GT;
> +                      else if (a2[2] == 'e')
> +                          a2 += 3, newcond->ptype = CONDPAT_INT_GE;
> +                      break;
> +            case 'e': if (a2[2] == 'q')
> +                          a2 += 3, newcond->ptype = CONDPAT_INT_EQ;
> +                      break;
> +            case 'n': if (a2[2] == 'e') {
> +                          /* Inversion, ensure !-ne == -eq */
> +                          a2 += 3, newcond->ptype = CONDPAT_INT_EQ;
> +                          newcond->flags ^= CONDFLAG_NOTMATCH;
> +                      }
> +                      break;
>             }
>         }
>         else {
> @@ -3706,6 +3731,14 @@ test_str_l:
>         }
>         break;
>
> +    case CONDPAT_INT_GE: rc = (atoi(input) >= atoi(p->pattern));  
> break;
> +    case CONDPAT_INT_GT: rc = (atoi(input) > atoi(p->pattern));   
> break;
> +
> +    case CONDPAT_INT_LE: rc = (atoi(input) <= atoi(p->pattern));  
> break;
> +    case CONDPAT_INT_LT: rc = (atoi(input) < atoi(p->pattern));   
> break;
> +
> +    case CONDPAT_INT_EQ: rc = (atoi(input) == atoi(p->pattern));  
> break;
> +
>     default:
>         /* it is really a regexp pattern, so apply it */
>         rc = !ap_regexec(p->regexp, input, AP_MAX_REG_MATCH,  
> regmatch, 0);
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: docs-unsubscribe@httpd.apache.org
> For additional commands, e-mail: docs-help@httpd.apache.org
>

--
Rich Bowen
rbowen@rcbowen.com




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