You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Nathan Neulinger <nn...@umr.edu> on 1996/07/04 18:46:05 UTC

heres a patch for mod_alias.c - does the per dir redirect correctly

Seems to work ok for me... Someone else might want to take a look over it
though...

Please let me know if the diff is the correct format...

I also uploaded the fixed mod_alias.c to incoming on ftp.apache.org as
mod_alias.c

-- Nathan

-------------------------------------

*** mod_alias.c.sv      Thu Jul  4 11:06:53 1996
--- mod_alias.c Thu Jul  4 11:45:27 1996
***************
*** 74,79 ****
--- 74,83 ----
      array_header *redirects;
  } alias_server_conf;

+ typedef struct {
+     array_header *redirects;
+ } alias_dir_conf;
+
  module alias_module;

  void *create_alias_config (pool *p, server_rec *s)
***************
*** 86,91 ****
--- 90,104 ----
      return a;
  }

+ void *create_alias_dir_config (pool *p, char *d)
+ {
+     alias_dir_conf *a =
+       (alias_dir_conf *)pcalloc (p, sizeof(alias_dir_conf));
+
+     a->redirects = make_array (p, 20, sizeof(alias_entry));
+     return a;
+ }
+
  void *merge_alias_config (pool *p, void *basev, void *overridesv)
  {
      alias_server_conf *a =
***************
*** 98,103 ****
--- 111,127 ----
      return a;
  }

+ void *merge_alias_dir_config (pool *p, void *basev, void *overridesv)
+ {
+     alias_dir_conf *a =
+       (alias_dir_conf *)pcalloc (p, sizeof(alias_dir_conf));
+     alias_dir_conf *base = (alias_dir_conf *)basev,
+       *overrides = (alias_dir_conf *)overridesv;
+
+     a->redirects = append_arrays (p, overrides->redirects, base->redirects);
+     return a;
+ }
+
  char *add_alias(cmd_parms *cmd, void *dummy, char *f, char *r)
  {
      server_rec *s = cmd->server;
***************
*** 111,125 ****
      return NULL;
  }

! char *add_redirect(cmd_parms *cmd, void *dummy, char *f, char *url)
  {
      server_rec *s = cmd->server;
!     alias_server_conf *conf =
          (alias_server_conf
*)get_module_config(s->module_config,&alias_module);
-     alias_entry *new = push_array (conf->redirects);

      if (!is_url (url)) return "Redirect to non-URL";
!
      new->fake = f; new->real = url;
      return NULL;
  }
--- 135,158 ----
      return NULL;
  }

! char *add_redirect(cmd_parms *cmd, alias_dir_conf *dirconf, char *f, char
*url)
  {
+     alias_entry *new;
      server_rec *s = cmd->server;
!     alias_server_conf *serverconf =
          (alias_server_conf
*)get_module_config(s->module_config,&alias_module);

      if (!is_url (url)) return "Redirect to non-URL";
!
!     if ( cmd->path )
!     {
!         new = push_array (dirconf->redirects);
!     }
!     else
!     {
!         new = push_array (serverconf->redirects);
!     }
!
      new->fake = f; new->real = url;
      return NULL;
  }
***************
*** 198,205 ****
  int translate_alias_redir(request_rec *r)
  {
      void *sconf = r->server->module_config;
!     alias_server_conf *conf =
          (alias_server_conf *)get_module_config(sconf, &alias_module);
      char *ret;

  #ifdef __EMX__
--- 231,241 ----
  int translate_alias_redir(request_rec *r)
  {
      void *sconf = r->server->module_config;
!     void *dconf = r->per_dir_config;
!     alias_server_conf *serverconf =
          (alias_server_conf *)get_module_config(sconf, &alias_module);
+     alias_dir_conf *dirconf =
+         (alias_dir_conf *)get_module_config(dconf, &alias_module);
      char *ret;

  #ifdef __EMX__
***************
*** 210,221 ****
  #endif
          return BAD_REQUEST;

!     if ((ret = try_alias_list (r, conf->redirects, 1)) != NULL) {
!         table_set (r->headers_out, "Location", ret);
          return REDIRECT;
      }

!     if ((ret = try_alias_list (r, conf->aliases, 0)) != NULL) {
          r->filename = ret;
          return OK;
      }
--- 246,262 ----
  #endif
          return BAD_REQUEST;

!     if ((ret = try_alias_list (r, dirconf->redirects, 1)) != NULL) {
!         table_set (r->headers_out, "Location", ret);
          return REDIRECT;
      }
+
+     if ((ret = try_alias_list (r, serverconf->redirects, 1)) != NULL) {
+         table_set (r->headers_out, "Location", ret);
+         return REDIRECT;
+     }

!     if ((ret = try_alias_list (r, serverconf->aliases, 0)) != NULL) {
          r->filename = ret;
          return OK;
      }
***************
*** 226,238 ****
  int fixup_redir(request_rec *r)
  {
      void *sconf = r->server->module_config;
!     alias_server_conf *conf =
          (alias_server_conf *)get_module_config(sconf, &alias_module);
      char *ret;

      /* It may have changed since last time, so try again */

!     if ((ret = try_alias_list (r, conf->redirects, 1)) != NULL) {
          table_set (r->headers_out, "Location", ret);
          return REDIRECT;
      }
--- 267,287 ----
  int fixup_redir(request_rec *r)
  {
      void *sconf = r->server->module_config;
!     void *dconf = r->per_dir_config;
!     alias_server_conf *serverconf =
          (alias_server_conf *)get_module_config(sconf, &alias_module);
+     alias_dir_conf *dirconf =
+         (alias_dir_conf *)get_module_config(dconf, &alias_module);
      char *ret;

      /* It may have changed since last time, so try again */

!     if ((ret = try_alias_list (r, dirconf->redirects, 1)) != NULL) {
!         table_set (r->headers_out, "Location", ret);
!         return REDIRECT;
!     }
!
!     if ((ret = try_alias_list (r, serverconf->redirects, 1)) != NULL) {
          table_set (r->headers_out, "Location", ret);
          return REDIRECT;
      }
***************
*** 243,250 ****
  module alias_module = {
     STANDARD_MODULE_STUFF,
     NULL,                      /* initializer */
!    NULL,                      /* dir config creater */
!    NULL,                      /* dir merger --- default is to override */
     create_alias_config,               /* server config */
     merge_alias_config,                /* merge server configs */
     alias_cmds,                        /* command table */
--- 292,299 ----
  module alias_module = {
     STANDARD_MODULE_STUFF,
     NULL,                      /* initializer */
!    create_alias_dir_config,   /* dir config creater */
!    merge_alias_dir_config,    /* dir merger --- default is to override */
     create_alias_config,               /* server config */
     merge_alias_config,                /* merge server configs */
     alias_cmds,                        /* command table */

------------------------------------------------------------
Nathan Neulinger                  Univ. of Missouri - Rolla
EMail: nneul@umr.edu                  Computing Services
WWW: http://www.umr.edu/~nneul      SysAdmin: rollanet.org



Re: heres a patch for mod_alias.c - does the per dir redirect correctly

Posted by Alexei Kosut <ak...@nueva.pvt.k12.ca.us>.
On Thu, 4 Jul 1996, Nathan Neulinger wrote:

> Seems to work ok for me... Someone else might want to take a look over it
> though...

Looks good. Just about what I was going to do; just a couple notes:

1) I wouldn't allocate 20 table entries in create_alias_dir_config().
   Most people aren't going to use it, and it'll just take up memory.
   Just allocate 1 or 2. (remember, the Apache code will add more if
   it needs it)

2) You only need to check each type of redirect once; only check the
   server one in translate_alias_redir(), and only check the
   per-dir one in fixup_redir(). In fact, checking for per-dir in
   translate_alias_redir() might cause problems on some systems,
   because the per-dir config hasn't been assembled yet (it's
   assembled in directory_walk(), which is called *after*
   translate_name()).

Otherwise, looks good. I'd make the changes myself, but I don't trust
me anymore. So if you wouldn't mind... :)

> Please let me know if the diff is the correct format...

Yes, it's in a perfectly correct format.

-- 
________________________________________________________________________
Alexei Kosut <ak...@nueva.pvt.k12.ca.us>      The Apache HTTP Server
URL: http://www.nueva.pvt.k12.ca.us/~akosut/   http://www.apache.org/