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