--- fresh/httpd-2.2.8/modules/mappers/mod_rewrite.c 2007-12-08 14:32:40.000000000 -0500 +++ httpd-2.2.8/modules/mappers/mod_rewrite.c 2008-01-23 11:21:03.000000000 -0500 @@ -234,6 +234,9 @@ CONDPAT_REGEX = 0, CONDPAT_FILE_EXISTS, CONDPAT_FILE_SIZE, + CONDPAT_FILE_SIZE_GT, + CONDPAT_FILE_SIZE_LT, + CONDPAT_FILE_SIZE_EQ, CONDPAT_FILE_LINK, CONDPAT_FILE_DIR, CONDPAT_FILE_XBIT, @@ -250,6 +253,7 @@ ap_regex_t *regexp; /* the precompiled regexp */ int flags; /* Flags which control the match */ pattern_type ptype; /* pattern type */ + apr_off_t size; /* size to be used in -s check */ } rewritecond_entry; /* single linked list for env vars and cookies */ @@ -3122,6 +3126,20 @@ case 'F': newcond->ptype = CONDPAT_LU_FILE; break; } } + /* Allow file size comparisons: + * RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -s>10000 + */ + else if (*a2 == '-' && a2[1] == 's') { + switch (a2[2]) { + case '>': newcond->ptype = CONDPAT_FILE_SIZE_GT; break; + case '<': newcond->ptype = CONDPAT_FILE_SIZE_LT; break; + case '=': newcond->ptype = CONDPAT_FILE_SIZE_EQ; break; + } + if(newcond->ptype) { + a2 += 3; + newcond->size = apr_atoi64(a2); + } + } else { switch (*a2) { case '>': newcond->ptype = CONDPAT_STR_GT; break; @@ -3534,6 +3552,27 @@ } break; + case CONDPAT_FILE_SIZE_LT: + if ( apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS + && sb.filetype == APR_REG && sb.size < p->size) { + rc = 1; + } + break; + + case CONDPAT_FILE_SIZE_GT: + if ( apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS + && sb.filetype == APR_REG && sb.size > p->size) { + rc = 1; + } + break; + + case CONDPAT_FILE_SIZE_EQ: + if ( apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS + && sb.filetype == APR_REG && sb.size == p->size) { + rc = 1; + } + break; + case CONDPAT_FILE_LINK: #if !defined(OS2) if ( apr_stat(&sb, input, APR_FINFO_MIN | APR_FINFO_LINK,