mjc 96/10/14 03:51:18
Modified: src mod_rewrite.c mod_rewrite.h
Log:
Submitted by: Ralf S. Engelschal <[EMAIL PROTECTED]>
Update of mod_rewrite from version 2.2 to 2.3.5
Revision Changes Path
1.5 +266 -98 apache/src/mod_rewrite.c
Index: mod_rewrite.c
===================================================================
RCS file: /export/home/cvs/apache/src/mod_rewrite.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C3 -r1.4 -r1.5
*** mod_rewrite.c 1996/08/23 16:16:52 1.4
--- mod_rewrite.c 1996/10/14 10:51:15 1.5
***************
*** 1,3 ****
--- 1,4 ----
+
/* ====================================================================
* Copyright (c) 1996 The Apache Group. All rights reserved.
*
***************
*** 50,56 ****
*
*/
- /* $Id: mod_rewrite.c,v 1.4 1996/08/23 16:16:52 akosut Exp $ */
/*
** mod_rewrite.c -- The Main Module Code
--- 51,56 ----
***************
*** 61,67 ****
** |_| |_| |_|\___/ \__,_|___|_| \___| \_/\_/ |_| |_|\__\___|
** |_____|
**
! ** URL Rewriting Module, Version 2.2 (22-08-1996)
**
** This module uses a rule-based rewriting engine (based on a
** regular-expression parser) to rewrite requested URLs on the fly.
--- 61,67 ----
** |_| |_| |_|\___/ \__,_|___|_| \___| \_/\_/ |_| |_|\__\___|
** |_____|
**
! ** URL Rewriting Module, Version 2.3.5 (09-10-1996)
**
** This module uses a rule-based rewriting engine (based on a
** regular-expression parser) to rewrite requested URLs on the fly.
***************
*** 99,104 ****
--- 99,105 ----
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
+ #include <netinet/in.h>
/* from the Apache server ... */
#include "httpd.h"
***************
*** 192,198 ****
static command_rec command_table[] = {
{ "RewriteEngine", cmd_rewriteengine, NULL, OR_FILEINFO, FLAG,
"On or Off to enable or disable (default) the whole rewriting engine"
},
! { "RewriteBase", cmd_rewritebase, NULL, OR_OPTIONS, TAKE1,
"the base URL of the per-directory context" },
{ "RewriteCond", cmd_rewritecond, NULL, OR_FILEINFO, RAW_ARGS,
"a input string and a to be applied regexp-pattern" },
--- 193,201 ----
static command_rec command_table[] = {
{ "RewriteEngine", cmd_rewriteengine, NULL, OR_FILEINFO, FLAG,
"On or Off to enable or disable (default) the whole rewriting engine"
},
! { "RewriteOptions", cmd_rewriteoptions, NULL, OR_FILEINFO, ITERATE,
! "List of option strings to set" },
! { "RewriteBase", cmd_rewritebase, NULL, OR_FILEINFO, TAKE1,
"the base URL of the per-directory context" },
{ "RewriteCond", cmd_rewritecond, NULL, OR_FILEINFO, RAW_ARGS,
"a input string and a to be applied regexp-pattern" },
***************
*** 216,221 ****
--- 219,235 ----
/* the common cache */
cache *cachep;
+ /* the txt mapfile parsing stuff */
+ #define MAPFILE_PATTERN "^([^ ]+) +([^ ]+).*$"
+ #ifdef HAS_APACHE_REGEX_LIB
+ #define MAPFILE_OUTPUT "$1,$2"
+ static regex_t *lookup_map_txtfile_regexp = NULL;
+ static regmatch_t lookup_map_txtfile_regmatch[10];
+ #else
+ #define MAPFILE_OUTPUT "\\1,\\2"
+ static regexp *lookup_map_txtfile_regexp = NULL;
+ #endif
+
***************
*** 241,246 ****
--- 255,261 ----
a = (rewrite_server_conf *)pcalloc(p, sizeof(rewrite_server_conf));
a->state = ENGINE_DISABLED;
+ a->options = OPTION_NONE;
a->rewritelogfile = NULL;
a->rewritelogfp = -1;
a->rewriteloglevel = 1;
***************
*** 260,271 ****
overrides = (rewrite_server_conf *)overridesv;
a->state = overrides->state;
! a->rewritelogfile = overrides->rewritelogfile;
! a->rewritelogfp = overrides->rewritelogfp;
a->rewriteloglevel = overrides->rewriteloglevel;
! a->rewritemaps = append_arrays(p, overrides->rewritemaps,
base->rewritemaps);
! a->rewriteconds = append_arrays(p, overrides->rewriteconds,
base->rewriteconds);
! a->rewriterules = append_arrays(p, overrides->rewriterules,
base->rewriterules);
return (void *)a;
}
--- 275,295 ----
overrides = (rewrite_server_conf *)overridesv;
a->state = overrides->state;
! a->options = overrides->options;
! a->rewritelogfile = base->rewritelogfile != NULL ?
base->rewritelogfile : overrides->rewritelogfile;
! a->rewritelogfp = base->rewritelogfp != -1 ? base->rewritelogfp
: overrides->rewritelogfp;
a->rewriteloglevel = overrides->rewriteloglevel;
!
! if (a->options & OPTION_INHERIT) {
! a->rewritemaps = append_arrays(p, overrides->rewritemaps,
base->rewritemaps);
! a->rewriteconds = append_arrays(p, overrides->rewriteconds,
base->rewriteconds);
! a->rewriterules = append_arrays(p, overrides->rewriterules,
base->rewriterules);
! }
! else {
! a->rewritemaps = overrides->rewritemaps;
! a->rewriteconds = overrides->rewriteconds;
! a->rewriterules = overrides->rewriterules;
! }
return (void *)a;
}
***************
*** 284,293 ****
a = (rewrite_perdir_conf *)pcalloc(p, sizeof(rewrite_perdir_conf));
a->state = ENGINE_DISABLED;
! a->rewriteconds = make_array(p, 2, sizeof(rewritecond_entry));
! a->rewriterules = make_array(p, 2, sizeof(rewriterule_entry));
a->directory = pstrdup(p, path);
a->baseurl = NULL;
return (void *)a;
}
--- 308,318 ----
a = (rewrite_perdir_conf *)pcalloc(p, sizeof(rewrite_perdir_conf));
a->state = ENGINE_DISABLED;
! a->options = OPTION_NONE;
a->directory = pstrdup(p, path);
a->baseurl = NULL;
+ a->rewriteconds = make_array(p, 2, sizeof(rewritecond_entry));
+ a->rewriterules = make_array(p, 2, sizeof(rewriterule_entry));
return (void *)a;
}
***************
*** 301,311 ****
overrides = (rewrite_perdir_conf *)overridesv;
a->state = overrides->state;
! a->rewriteconds = append_arrays(p, overrides->rewriteconds,
base->rewriteconds);
! a->rewriterules = append_arrays(p, overrides->rewriterules,
base->rewriterules);
a->directory = overrides->directory;
a->baseurl = overrides->baseurl;
return (void *)a;
}
--- 326,344 ----
overrides = (rewrite_perdir_conf *)overridesv;
a->state = overrides->state;
! a->options = overrides->options;
a->directory = overrides->directory;
a->baseurl = overrides->baseurl;
+ if (a->options & OPTION_INHERIT) {
+ a->rewriteconds = append_arrays(p, overrides->rewriteconds,
base->rewriteconds);
+ a->rewriterules = append_arrays(p, overrides->rewriterules,
base->rewriterules);
+ }
+ else {
+ a->rewriteconds = overrides->rewriteconds;
+ a->rewriterules = overrides->rewriterules;
+ }
+
return (void *)a;
}
***************
*** 329,334 ****
--- 362,390 ----
return NULL;
}
+ static char *cmd_rewriteoptions(cmd_parms *cmd, rewrite_perdir_conf *dconf,
char *option)
+ {
+ rewrite_server_conf *sconf;
+ char *err;
+
+ sconf = (rewrite_server_conf
*)get_module_config(cmd->server->module_config, &rewrite_module);
+ if (cmd->path == NULL) /* is server command */
+ err = cmd_rewriteoptions_setoption(cmd->pool, &(sconf->options),
option);
+ else /* is per-directory command */
+ err = cmd_rewriteoptions_setoption(cmd->pool, &(dconf->options),
option);
+
+ return err;
+ }
+
+ static char *cmd_rewriteoptions_setoption(pool *p, int *options, char *name)
+ {
+ if (strcasecmp(name, "inherit") == 0)
+ *options |= OPTION_INHERIT;
+ else
+ return pstrcat(p, "RewriteOptions: unknown option '", name, "'\n",
NULL);
+ return NULL;
+ }
+
static char *cmd_rewritelog(cmd_parms *cmd, void *dconf, char *a1)
{
rewrite_server_conf *sconf;
***************
*** 360,385 ****
new->name = a1;
if (strncmp(a2, "txt:", 4) == 0) {
! new->file = a2+4;
! new->type = MAPTYPE_TXT;
}
else if (strncmp(a2, "dbm:", 4) == 0) {
! new->file = a2+4;
! new->type = MAPTYPE_DBM;
}
else if (strncmp(a2, "prg:", 4) == 0) {
- new->file = a2+4;
new->type = MAPTYPE_PRG;
}
else {
! new->file = a2;
! new->type = MAPTYPE_TXT;
}
new->fpin = 0;
new->fpout = 0;
! if (stat(new->file, &st) == -1)
! return pstrcat(cmd->pool, "RewriteMap: map file or program not
found:", new->file, NULL);
return NULL;
}
--- 416,450 ----
new->name = a1;
if (strncmp(a2, "txt:", 4) == 0) {
! new->type = MAPTYPE_TXT;
! new->datafile = a2+4;
! new->checkfile = a2+4;
}
else if (strncmp(a2, "dbm:", 4) == 0) {
! #ifdef HAS_NDBM_LIB
! new->type = MAPTYPE_DBM;
! new->datafile = a2+4;
! new->checkfile = pstrcat(cmd->pool, a2+4, NDBM_FILE_SUFFIX, NULL);
! #else
! return pstrdup(cmd->pool, "RewriteMap: cannot use NDBM mapfile,
because no NDBM support compiled in");
! #endif
}
else if (strncmp(a2, "prg:", 4) == 0) {
new->type = MAPTYPE_PRG;
+ new->datafile = a2+4;
+ new->checkfile = a2+4;
}
else {
! new->type = MAPTYPE_TXT;
! new->datafile = a2;
! new->checkfile = a2;
}
new->fpin = 0;
new->fpout = 0;
! if (new->checkfile)
! if (stat(new->checkfile, &st) == -1)
! return pstrcat(cmd->pool, "RewriteMap: map file or program not
found:", new->checkfile, NULL);
return NULL;
}
***************
*** 519,527 ****
static char *cmd_rewritecond_setflag(pool *p, rewritecond_entry *cfg, char
*key, char *val)
{
if ( strcasecmp(key, "nocase") == 0
! || strcasecmp(key, "NC") == 0 ) {
cfg->flags |= CONDFLAG_NOCASE;
}
else {
return pstrcat(p, "RewriteCond: unknown flag '", key, "'\n", NULL);
}
--- 584,596 ----
static char *cmd_rewritecond_setflag(pool *p, rewritecond_entry *cfg, char
*key, char *val)
{
if ( strcasecmp(key, "nocase") == 0
! || strcasecmp(key, "NC") == 0 ) {
cfg->flags |= CONDFLAG_NOCASE;
}
+ else if ( strcasecmp(key, "ornext") == 0
+ || strcasecmp(key, "OR") == 0 ) {
+ cfg->flags |= CONDFLAG_ORNEXT;
+ }
else {
return pstrcat(p, "RewriteCond: unknown flag '", key, "'\n", NULL);
}
***************
*** 722,727 ****
--- 791,805 ----
/* create the lookup cache */
cachep = init_cache(p);
+
+
+ /* precompile a static pattern
+ for the txt mapfile parsing */
+ #ifdef HAS_APACHE_REGEX_LIB
+ lookup_map_txtfile_regexp = pregcomp(p, MAPFILE_PATTERN, REG_EXTENDED);
+ #else
+ lookup_map_txtfile_regexp = regcomp(MAPFILE_PATTERN);
+ #endif
}
***************
*** 1021,1027 ****
/* make sure the QUERY_STRING and
PATH_INFO parts get incorporated */
r->filename = pstrcat(r->pool, r->filename,
! r->path_info ? r->path_info :
"",
r->args ? "?" : NULL, r->args,
NULL);
--- 1099,1107 ----
/* make sure the QUERY_STRING and
PATH_INFO parts get incorporated */
r->filename = pstrcat(r->pool, r->filename,
! /* r->path_info was already
! appended by the rewriting
engine
! because of the per-dir
context! */
r->args ? "?" : NULL, r->args,
NULL);
***************
*** 1254,1259 ****
--- 1334,1340 ----
int rc;
int prefixstrip;
int i;
+ int failed;
array_header *rewriteconds;
rewritecond_entry *conds;
rewritecond_entry *c;
***************
*** 1296,1306 ****
slow down the rewriting engine!! */
rewriteconds = p->rewriteconds;
conds = (rewritecond_entry *)rewriteconds->elts;
for (i = 0; i < rewriteconds->nelts; i++) {
c = &conds[i];
! if (!apply_rewrite_cond(r, c, perdir))
! return 0; /* if any condition fails this complete rule
fails */
}
/* if this is a pure matching rule we return immediately */
if (strcmp(output, "-") == 0)
--- 1377,1413 ----
slow down the rewriting engine!! */
rewriteconds = p->rewriteconds;
conds = (rewritecond_entry *)rewriteconds->elts;
+ failed = 0;
for (i = 0; i < rewriteconds->nelts; i++) {
c = &conds[i];
! rc = apply_rewrite_cond(r, c, perdir);
! if (c->flags & CONDFLAG_ORNEXT) {
! /* there is a "or" flag */
! if (rc == 0) {
! /* one cond is false, but another can be true... */
! continue;
! }
! else {
! /* one true cond is enough, so skip the other conds
! of the "ornext" chained conds */
! while ( i < rewriteconds->nelts
! && c->flags & CONDFLAG_ORNEXT) {
! i++;
! c = &conds[i];
! }
! continue;
! }
! }
! else {
! /* no "or" flag, so a single fail means total fail */
! if (rc == 0) { /* failed */
! failed = 1;
! break;
! }
! }
}
+ if (failed)
+ return 0; /* if any condition fails this complete rule fails */
/* if this is a pure matching rule we return immediately */
if (strcmp(output, "-") == 0)
***************
*** 1763,1805 ****
s = &entries[i];
if (strcmp(s->name, name) == 0) {
if (s->type == MAPTYPE_TXT) {
! stat(s->file, &st); /* existence was checked at startup! */
! value = get_cache_string(cachep, s->file, CACHEMODE_TS,
st.st_mtime, key);
if (value == NULL) {
rewritelog(r, 6, "cache lookup FAILED, forcing new map
lookup");
! if ((value = lookup_map_txtfile(r, s->file, key)) !=
NULL) {
! rewritelog(r, 5, "map lookup OK: map=%s key=%s ->
val=%s", s->file, key, value);
! set_cache_string(cachep, s->file, CACHEMODE_TS,
st.st_mtime, key, value);
return value;
}
else {
! rewritelog(r, 5, "map lookup FAILED: map=%s
key=%s", s->file, key);
return NULL;
}
}
else {
! rewritelog(r, 5, "cache lookup OK: res=%s key=%s ->
val=%s", s->file, key, value);
return value;
}
}
else if (s->type == MAPTYPE_DBM) {
#if HAS_NDBM_LIB
! stat(s->file, &st); /* existence was checked at startup! */
! value = get_cache_string(cachep, s->file, CACHEMODE_TS,
st.st_mtime, key);
if (value == NULL) {
rewritelog(r, 6, "cache lookup FAILED, forcing new map
lookup");
! if ((value = lookup_map_dbmfile(r, s->file, key)) !=
NULL) {
! rewritelog(r, 5, "map lookup OK: map=%s key=%s ->
val=%s", s->file, key, value);
! set_cache_string(cachep, s->file, CACHEMODE_TS,
st.st_mtime, key, value);
return value;
}
else {
! rewritelog(r, 5, "map lookup FAILED: map=%s
key=%s", s->file, key);
return NULL;
}
}
else {
! rewritelog(r, 5, "cache lookup OK: res=%s key=%s ->
val=%s", s->file, key, value);
return value;
}
#else
--- 1870,1912 ----
s = &entries[i];
if (strcmp(s->name, name) == 0) {
if (s->type == MAPTYPE_TXT) {
! stat(s->checkfile, &st); /* existence was checked at
startup! */
! value = get_cache_string(cachep, s->name, CACHEMODE_TS,
st.st_mtime, key);
if (value == NULL) {
rewritelog(r, 6, "cache lookup FAILED, forcing new map
lookup");
! if ((value = lookup_map_txtfile(r, s->datafile, key))
!= NULL) {
! rewritelog(r, 5, "map lookup OK: map=%s key=%s[txt]
-> val=%s", s->name, key, value);
! set_cache_string(cachep, s->name, CACHEMODE_TS,
st.st_mtime, key, value);
return value;
}
else {
! rewritelog(r, 5, "map lookup FAILED: map=%s[txt]
key=%s", s->name, key);
return NULL;
}
}
else {
! rewritelog(r, 5, "cache lookup OK: map=%s[txt] key=%s
-> val=%s", s->name, key, value);
return value;
}
}
else if (s->type == MAPTYPE_DBM) {
#if HAS_NDBM_LIB
! stat(s->checkfile, &st); /* existence was checked at
startup! */
! value = get_cache_string(cachep, s->name, CACHEMODE_TS,
st.st_mtime, key);
if (value == NULL) {
rewritelog(r, 6, "cache lookup FAILED, forcing new map
lookup");
! if ((value = lookup_map_dbmfile(r, s->datafile, key))
!= NULL) {
! rewritelog(r, 5, "map lookup OK: map=%s[dbm] key=%s
-> val=%s", s->name, key, value);
! set_cache_string(cachep, s->name, CACHEMODE_TS,
st.st_mtime, key, value);
return value;
}
else {
! rewritelog(r, 5, "map lookup FAILED: map=%s[dbm]
key=%s", s->name, key);
return NULL;
}
}
else {
! rewritelog(r, 5, "cache lookup OK: map=%s[dbm] key=%s
-> val=%s", s->name, key, value);
return value;
}
#else
***************
*** 1808,1818 ****
}
else if (s->type == MAPTYPE_PRG) {
if ((value = lookup_map_program(r, s->fpin, s->fpout, key))
!= NULL) {
! rewritelog(r, 5, "map lookup OK: map=%s key=%s ->
val=%s", s->file, key, value);
return value;
}
else {
! rewritelog(r, 5, "map lookup FAILED: map=%s key=%s",
s->file, key);
}
}
}
--- 1915,1925 ----
}
else if (s->type == MAPTYPE_PRG) {
if ((value = lookup_map_program(r, s->fpin, s->fpout, key))
!= NULL) {
! rewritelog(r, 5, "map lookup OK: map=%s key=%s ->
val=%s", s->name, key, value);
return value;
}
else {
! rewritelog(r, 5, "map lookup FAILED: map=%s key=%s",
s->name, key);
}
}
}
***************
*** 1820,1839 ****
return NULL;
}
- #define PATTERN "^([^ ]+) +([^ ]+).*$"
-
- #ifdef HAS_APACHE_REGEX_LIB
-
- #define OUTPUT "$1,$2"
- static regex_t *lookup_map_txtfile_regexp = NULL;
- static regmatch_t lookup_map_txtfile_regmatch[10];
-
- #else
-
- #define OUTPUT "\\1,\\2"
- static regexp *lookup_map_txtfile_regexp = NULL;
-
- #endif
static char *lookup_map_txtfile(request_rec *r, char *file, char *key)
{
--- 1927,1932 ----
***************
*** 1849,1862 ****
if ((fp = pfopen(r->pool, file, "r")) == NULL)
return NULL;
! if (lookup_map_txtfile_regexp == NULL)
! #ifdef HAS_APACHE_REGEX_LIB
! lookup_map_txtfile_regexp = pregcomp(r->pool, PATTERN,
REG_EXTENDED);
! #else
! lookup_map_txtfile_regexp = regcomp(PATTERN);
! #endif
!
! strcpy(output, OUTPUT);
while (fgets(line, sizeof(line), fp) != NULL) {
if (line[strlen(line)-1] == '\n')
line[strlen(line)-1] = '\0';
--- 1942,1948 ----
if ((fp = pfopen(r->pool, file, "r")) == NULL)
return NULL;
! strcpy(output, MAPFILE_OUTPUT);
while (fgets(line, sizeof(line), fp) != NULL) {
if (line[strlen(line)-1] == '\n')
line[strlen(line)-1] = '\0';
***************
*** 1895,1901 ****
static char buf[MAX_STRING_LEN];
dbmkey.dptr = key;
! dbmkey.dsize = strlen(key)+1;
if ((dbmfp = dbm_open(file, O_RDONLY, 0666)) != NULL) {
dbmval = dbm_fetch(dbmfp, dbmkey);
if (dbmval.dptr != NULL) {
--- 1981,1987 ----
static char buf[MAX_STRING_LEN];
dbmkey.dptr = key;
! dbmkey.dsize = strlen(key);
if ((dbmfp = dbm_open(file, O_RDONLY, 0666)) != NULL) {
dbmval = dbm_fetch(dbmfp, dbmkey);
if (dbmval.dptr != NULL) {
***************
*** 2038,2044 ****
else
sprintf(redir, "/redir#%d", i);
! sprintf(str3, "%s %s [sid#%x][rid#%x/%s%s] (%d) %s\n", str1,
current_logtime(r), (unsigned int)(r->server), (unsigned int)r, type, redir,
level, str2);
write(conf->rewritelogfp, str3, strlen(str3));
--- 2124,2130 ----
else
sprintf(redir, "/redir#%d", i);
! sprintf(str3, "%s %s [%s/sid#%x][rid#%x/%s%s] (%d) %s\n", str1,
current_logtime(r), r->server->server_hostname, (unsigned int)(r->server),
(unsigned int)r, type, redir, level, str2);
write(conf->rewritelogfp, str3, strlen(str3));
***************
*** 2096,2110 ****
map = &entries[i];
if (map->type != MAPTYPE_PRG)
continue;
! if (map->file == NULL ||
! *(map->file) == '\0' ||
map->fpin > 0 ||
map->fpout > 0 )
continue;
! fname = server_root_relative(p, map->file);
fpin = NULL;
fpout = NULL;
! rc = spawn_child(p, rewritemap_program_child, (void *)map->file,
kill_after_timeout, &fpin, &fpout);
if (rc == 0 || fpin == NULL || fpout == NULL) {
fprintf (stderr, "mod_rewrite: could not fork child for
RewriteMap process\n");
exit (1);
--- 2182,2196 ----
map = &entries[i];
if (map->type != MAPTYPE_PRG)
continue;
! if (map->datafile == NULL ||
! *(map->datafile) == '\0' ||
map->fpin > 0 ||
map->fpout > 0 )
continue;
! fname = server_root_relative(p, map->datafile);
fpin = NULL;
fpout = NULL;
! rc = spawn_child(p, rewritemap_program_child, (void
*)map->datafile, kill_after_timeout, &fpin, &fpout);
if (rc == 0 || fpin == NULL || fpout == NULL) {
fprintf (stderr, "mod_rewrite: could not fork child for
RewriteMap process\n");
exit (1);
***************
*** 2355,2362 ****
cache *c;
c = (cache *)palloc(p, sizeof(cache));
! c->pool = p;
! c->lists = make_array(p, 2, sizeof(cachelist));
return c;
}
--- 2441,2448 ----
cache *c;
c = (cache *)palloc(p, sizeof(cache));
! c->pool = make_sub_pool(NULL);
! c->lists = make_array(c->pool, 2, sizeof(cachelist));
return c;
}
***************
*** 2396,2416 ****
cachelist *l;
cacheentry *e;
int found_list;
- int found_entry;
found_list = 0;
- found_entry = 0;
/* first try to edit an existing entry */
for (i = 0; i < c->lists->nelts; i++) {
! l = (cachelist *)&(c->lists->elts[i]);
if (strcmp(l->resource, res) == 0) {
found_list = 1;
! for (j = 0; j < l->entries->nelts; i++) {
! e = (cacheentry *)&(l->entries->elts)[j];
if (strcmp(e->key, ce->key) == 0) {
e->time = ce->time;
e->value = pstrdup(c->pool, ce->value);
! found_entry = 1;
}
}
}
--- 2482,2500 ----
cachelist *l;
cacheentry *e;
int found_list;
found_list = 0;
/* first try to edit an existing entry */
for (i = 0; i < c->lists->nelts; i++) {
! l = &(((cachelist *)c->lists->elts)[i]);
if (strcmp(l->resource, res) == 0) {
found_list = 1;
! for (j = 0; j < l->entries->nelts; j++) {
! e = &(((cacheentry *)l->entries->elts)[j]);
if (strcmp(e->key, ce->key) == 0) {
e->time = ce->time;
e->value = pstrdup(c->pool, ce->value);
! return;
}
}
}
***************
*** 2425,2439 ****
/* create the new entry */
for (i = 0; i < c->lists->nelts; i++) {
! l = (cachelist *)&(c->lists->elts)[i];
if (strcmp(l->resource, res) == 0) {
e = push_array(l->entries);
e->time = ce->time;
e->key = pstrdup(c->pool, ce->key);
e->value = pstrdup(c->pool, ce->value);
}
}
return;
}
--- 2509,2525 ----
/* create the new entry */
for (i = 0; i < c->lists->nelts; i++) {
! l = &(((cachelist *)c->lists->elts)[i]);
if (strcmp(l->resource, res) == 0) {
e = push_array(l->entries);
e->time = ce->time;
e->key = pstrdup(c->pool, ce->key);
e->value = pstrdup(c->pool, ce->value);
+ return;
}
}
+ /* not reached, but when it is no problem... */
return;
}
***************
*** 2445,2454 ****
cacheentry *e;
for (i = 0; i < c->lists->nelts; i++) {
! l = (cachelist *)&(c->lists->elts)[i];
if (strcmp(l->resource, res) == 0) {
! for (j = 0; j < l->entries->nelts; i++) {
! e = (cacheentry *)&(l->entries->elts)[j];
if (strcmp(e->key, key) == 0) {
return e;
}
--- 2531,2540 ----
cacheentry *e;
for (i = 0; i < c->lists->nelts; i++) {
! l = &(((cachelist *)c->lists->elts)[i]);
if (strcmp(l->resource, res) == 0) {
! for (j = 0; j < l->entries->nelts; j++) {
! e = &(((cacheentry *)l->entries->elts)[j]);
if (strcmp(e->key, key) == 0) {
return e;
}
***************
*** 2623,2660 ****
{
char **cppHNLour;
char **cppHNLtest;
int i, j;
! if ((cppHNLour = make_hostname_list(r, r->server->server_hostname)) ==
NULL)
! return 0;
! if ((cppHNLtest = make_hostname_list(r, testhost)) == NULL)
! return 0;
! for (i = 0; cppHNLtest[i] != NULL; i++) {
! for (j = 0; cppHNLour[j] != NULL; j++) {
! if (strcmp(cppHNLtest[i], cppHNLour[j]) == 0) {
! return 1;
}
}
}
! return 0;
}
! static char **make_hostname_list(request_rec *r, char *hostname)
{
char **cppHNL;
struct hostent *hep;
int i;
! if ((hep = gethostbyname(hostname)) == NULL)
return NULL;
! for (i = 0; hep->h_aliases[i]; i++)
;
! cppHNL = (char **)palloc(r->pool, sizeof(char *)*(i+2));
! cppHNL[0] = pstrdup(r->pool, hep->h_name);
! for (i = 0; hep->h_aliases[i]; i++)
! cppHNL[1+i] = pstrdup(r->pool, hep->h_aliases[i]);
! cppHNL[1+i] = NULL;
return cppHNL;
}
--- 2709,2828 ----
{
char **cppHNLour;
char **cppHNLtest;
+ char *ourhostname;
+ char *ourhostip;
+ char *names;
+ char *name;
int i, j;
! /* we can check:
! r->
! char *hostname Host, as set by full URI or Host:
! int hostlen Length of http://host:port in full
URI
! r->server->
! int is_virtual 0=main, 1=ip-virtual, 2=non-ip-virtual
! char *server_hostname used on compare to r->hostname
! inet_ntoa(r->connection->local_addr.sin_addr)
! used on compare to r->hostname
! short port for redirects
! char *path name of ServerPath
! int pathlen len of ServerPath
! char *names Wildcarded names for ServerAlias
servers
! under 1.1:
! r->server->
! struct in_addr host_addr The bound address, for this server
! short host_port The bound port, for this server
! char *virthost The name given in <VirtualHost>
! under 1.2:
! r->server->addrs->next...
! struct in_addr host_addr The bound address, for this server
! short host_port The bound port, for this server
! char *virthost The name given in <VirtualHost>
! */
!
! ourhostname = r->server->server_hostname;
! ourhostip = inet_ntoa(r->connection->local_addr.sin_addr);
!
! /* just a simple common case */
! if (strcmp(testhost, ourhostname) == 0 ||
! strcmp(testhost, ourhostip) == 0 )
! return YES;
!
! /* now the complicated cases */
! if (!r->server->is_virtual) {
! /* main servers */
!
! /* check for the alternative IP addresses */
! if ((cppHNLour = resolv_ipaddr_list(r, ourhostname)) == NULL)
! return NO;
! if ((cppHNLtest = resolv_ipaddr_list(r, testhost)) == NULL)
! return NO;
! for (i = 0; cppHNLtest[i] != NULL; i++) {
! for (j = 0; cppHNLour[j] != NULL; j++) {
! if (strcmp(cppHNLtest[i], cppHNLour[j]) == 0) {
! return YES;
! }
! }
! }
! }
! else if (r->server->is_virtual) {
! /* virtual servers */
! /* check for the virtual-server aliases */
! if (r->server->names != NULL && r->server->names[0] != '\0') {
! names = r->server->names;
! while (*names != '\0') {
! name = getword_conf(r->pool, &names);
! if ((is_matchexp(name) && !strcasecmp_match(testhost,
name)) ||
! (strcasecmp(testhost, name) == 0)
) {
! return YES;
! }
}
}
}
! return NO;
! }
!
! static int isaddr(char *host)
! {
! char *cp;
!
! /* Null pointers and empty strings
! are not addresses. */
! if (host == NULL)
! return NO;
! if (*host == '\0')
! return NO;
! /* Make sure it has only digits and dots. */
! for (cp = host; *cp; cp++) {
! if (!isdigit(*cp) && *cp != '.')
! return NO;
! }
! /* If it has a trailing dot,
! don't treat it as an address. */
! if (*(cp-1) == '.')
! return NO;
! return YES;
}
! static char **resolv_ipaddr_list(request_rec *r, char *name)
{
char **cppHNL;
struct hostent *hep;
int i;
! if (isaddr(name))
! hep = gethostbyaddr(name, sizeof(struct in_addr), AF_INET);
! else
! hep = gethostbyname(name);
! if (hep == NULL)
return NULL;
! for (i = 0; hep->h_addr_list[i]; i++)
;
! cppHNL = (char **)palloc(r->pool, sizeof(char *)*(i+1));
! for (i = 0; hep->h_addr_list[i]; i++)
! cppHNL[i] = pstrdup(r->pool, inet_ntoa(*((struct in_addr
*)(hep->h_addr_list[i]))) );
! cppHNL[i] = NULL;
return cppHNL;
}
1.6 +55 -17 apache/src/mod_rewrite.h
Index: mod_rewrite.h
===================================================================
RCS file: /export/home/cvs/apache/src/mod_rewrite.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C3 -r1.5 -r1.6
*** mod_rewrite.h 1996/08/23 16:16:53 1.5
--- mod_rewrite.h 1996/10/14 10:51:16 1.6
***************
*** 1,3 ****
--- 1,4 ----
+
/* ====================================================================
* Copyright (c) 1996 The Apache Group. All rights reserved.
*
***************
*** 50,56 ****
*
*/
- /* $Id: mod_rewrite.h,v 1.5 1996/08/23 16:16:53 akosut Exp $ */
#ifndef _MOD_REWRITE_H
#define _MOD_REWRITE_H 1
--- 51,56 ----
***************
*** 64,70 ****
** |_| |_| |_|\___/ \__,_|___|_| \___| \_/\_/ |_| |_|\__\___|
** |_____|
**
! ** URL Rewriting Module, Version 2.2 (22-08-1996)
**
** This module uses a rule-based rewriting engine (based on a
** regular-expression parser) to rewrite requested URLs on the fly.
--- 64,70 ----
** |_| |_| |_|\___/ \__,_|___|_| \___| \_/\_/ |_| |_|\__\___|
** |_____|
**
! ** URL Rewriting Module, Version 2.3.5 (09-10-1996)
**
** This module uses a rule-based rewriting engine (based on a
** regular-expression parser) to rewrite requested URLs on the fly.
***************
*** 96,112 ****
! /* try to see under which version we are running */
#if (MODULE_MAGIC_NUMBER >= 19960725)
#define HAS_APACHE_REGEX_LIB 1
#endif
! /* now we go on and include more of our own stuff ... */
#ifndef HAS_APACHE_REGEX_LIB
#include "regexp/regexp.h"
#endif
#if HAS_NDBM_LIB
! #include <ndbm>
#endif
--- 96,128 ----
! /* Check Apache Release */
#if (MODULE_MAGIC_NUMBER >= 19960725)
+ #define IS_APACHE_12 1
#define HAS_APACHE_REGEX_LIB 1
#endif
!
! /* The RegExp support:
! For Apache 1.1.1 we provide our own Spencer V8 library,
! for Apache 1.2 and higher there is a Spencer POSIX library
! in the distribution */
#ifndef HAS_APACHE_REGEX_LIB
#include "regexp/regexp.h"
#endif
+
+
+ /* The NDBM support:
+ We support only NDBM files.
+ But we have to stat the file for the mtime,
+ so we also need to know the file extension */
#if HAS_NDBM_LIB
! #include <ndbm.h>
! #if (__FreeBSD__)
! #define NDBM_FILE_SUFFIX ".db"
! #else
! #define NDBM_FILE_SUFFIX ".pag"
! #endif
#endif
***************
*** 128,133 ****
--- 144,150 ----
#define CONDFLAG_NONE 1<<0
#define CONDFLAG_NOCASE 1<<1
#define CONDFLAG_NOTMATCH 1<<2
+ #define CONDFLAG_ORNEXT 1<<3
#define RULEFLAG_NONE 1<<0
#define RULEFLAG_FORCEREDIRECT 1<<1
***************
*** 147,154 ****
#define ENGINE_DISABLED 1<<0
#define ENGINE_ENABLED 1<<1
! #define CACHEMODE_TS 1<<0
! #define CACHEMODE_TTL 1<<1
/*
--- 164,184 ----
#define ENGINE_DISABLED 1<<0
#define ENGINE_ENABLED 1<<1
! #define OPTION_NONE 1<<0
! #define OPTION_INHERIT 1<<1
!
! #define CACHEMODE_TS 1<<0
! #define CACHEMODE_TTL 1<<1
!
! #ifndef FALSE
! #define FALSE 0
! #define TRUE !FALSE
! #endif
!
! #ifndef NO
! #define NO FALSE
! #define YES TRUE
! #endif
/*
***************
*** 162,182 ****
typedef struct {
char *name; /* the name of the map */
! char *file; /* the file of the map */
int type; /* the type of the map */
int fpin; /* in filepointer for program maps */
int fpout; /* out filepointer for program maps */
} rewritemap_entry;
typedef struct {
! char *input; /* Input string of RewriteCond */
! char *pattern; /* the RegExp pattern string */
#ifdef HAS_APACHE_REGEX_LIB
regex_t *regexp;
#else
! regexp *regexp; /* the RegExp pattern compilation */
#endif
! int flags; /* Flags which control the match */
} rewritecond_entry;
typedef struct {
--- 192,213 ----
typedef struct {
char *name; /* the name of the map */
! char *datafile; /* the file which contains the data of
the map */
! char *checkfile; /* the file which stays for existence of
the map */
int type; /* the type of the map */
int fpin; /* in filepointer for program maps */
int fpout; /* out filepointer for program maps */
} rewritemap_entry;
typedef struct {
! char *input; /* Input string of RewriteCond */
! char *pattern; /* the RegExp pattern string */
#ifdef HAS_APACHE_REGEX_LIB
regex_t *regexp;
#else
! regexp *regexp; /* the RegExp pattern compilation */
#endif
! int flags; /* Flags which control the match */
} rewritecond_entry;
typedef struct {
***************
*** 199,204 ****
--- 230,236 ----
typedef struct {
int state; /* the RewriteEngine state */
+ int options; /* the RewriteOption state */
char *rewritelogfile; /* the RewriteLog filename */
int rewritelogfp; /* the RewriteLog open filepointer */
int rewriteloglevel; /* the RewriteLog level of verbosity */
***************
*** 213,222 ****
typedef struct {
int state; /* the RewriteEngine state */
array_header *rewriteconds; /* the RewriteCond entries (temporary) */
array_header *rewriterules; /* the RewriteRule entries */
! char *directory; /* the directory where it applies */
! char *baseurl; /* the base-URL where it applies */
} rewrite_perdir_conf;
--- 245,255 ----
typedef struct {
int state; /* the RewriteEngine state */
+ int options; /* the RewriteOption state */
array_header *rewriteconds; /* the RewriteCond entries (temporary) */
array_header *rewriterules; /* the RewriteRule entries */
! char *directory; /* the directory where it applies */
! char *baseurl; /* the base-URL where it applies */
} rewrite_perdir_conf;
***************
*** 229,235 ****
} cacheentry;
typedef struct cachelist {
! char *resource;
array_header *entries;
} cachelist;
--- 262,268 ----
} cacheentry;
typedef struct cachelist {
! char *resource;
array_header *entries;
} cachelist;
***************
*** 259,264 ****
--- 292,299 ----
/* config directive handling */
static char *cmd_rewriteengine (cmd_parms *cmd, rewrite_perdir_conf
*dconf, int flag);
+ static char *cmd_rewriteoptions (cmd_parms *cmd, rewrite_perdir_conf
*dconf, char *option);
+ static char *cmd_rewriteoptions_setoption(pool *p, int *options, char
*name);
static char *cmd_rewritelog (cmd_parms *cmd, void *dconf, char *a1);
static char *cmd_rewriteloglevel(cmd_parms *cmd, void *dconf, char *a1);
static char *cmd_rewritemap (cmd_parms *cmd, void *dconf, char *a1,
char *a2);
***************
*** 296,302 ****
/* DBM hashfile support functions */
static char *lookup_map(request_rec *r, char *name, char *key);
static char *lookup_map_txtfile(request_rec *r, char *file, char *key);
! #if SUPPORT_DBM_REWRITEMAP
static char *lookup_map_dbmfile(request_rec *r, char *file, char *key);
#endif
static char *lookup_map_program(request_rec *r, int fpin, int fpout, char
*key);
--- 331,337 ----
/* DBM hashfile support functions */
static char *lookup_map(request_rec *r, char *name, char *key);
static char *lookup_map_txtfile(request_rec *r, char *file, char *key);
! #if HAS_NDBM_LIB
static char *lookup_map_dbmfile(request_rec *r, char *file, char *key);
#endif
static char *lookup_map_program(request_rec *r, int fpin, int fpout, char
*key);
***************
*** 328,335 ****
static char *subst_prefix_path(request_rec *r, char *input, char *match,
char *subst);
static int parseargline(char *str, char **a1, char **a2, char **a3);
static int prefix_stat(const char *path, struct stat *sb);
static int is_this_our_host(request_rec *r, char *testhost);
! static char **make_hostname_list(request_rec *r, char *hostname);
#endif /* _MOD_REWRITE_H */
--- 363,373 ----
static char *subst_prefix_path(request_rec *r, char *input, char *match,
char *subst);
static int parseargline(char *str, char **a1, char **a2, char **a3);
static int prefix_stat(const char *path, struct stat *sb);
+
+ /* DNS functions */
static int is_this_our_host(request_rec *r, char *testhost);
! static int isaddr(char *host);
! static char **resolv_ipaddr_list(request_rec *r, char *name);
#endif /* _MOD_REWRITE_H */