dgaudet     99/12/30 21:05:29

  Modified:    src/modules/standard mod_rewrite.c mod_rewrite.h
  Log:
  merge 1.3 changes to rewrite forward onto 2.0
  
  Submitted by: Paul J. Reder <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.7       +89 -61    apache-2.0/src/modules/standard/mod_rewrite.c
  
  Index: mod_rewrite.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_rewrite.c,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- mod_rewrite.c     1999/12/31 05:03:33     1.6
  +++ mod_rewrite.c     1999/12/31 05:05:27     1.7
  @@ -102,7 +102,9 @@
   #endif
   
   #ifndef NO_WRITEV
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include <sys/uio.h>
   #endif
   
  @@ -1145,13 +1147,19 @@
               return OK;
           }
           else if (  (strlen(r->filename) > 7 &&
  -                    strncasecmp(r->filename, "http://";, 7) == 0)
  +                    strncasecmp(r->filename, "http://";,   7) == 0)
                   || (strlen(r->filename) > 8 &&
  -                    strncasecmp(r->filename, "https://";, 8) == 0)
  +                    strncasecmp(r->filename, "https://";,  8) == 0)
                   || (strlen(r->filename) > 9 &&
                       strncasecmp(r->filename, "gopher://";, 9) == 0)
                   || (strlen(r->filename) > 6 &&
  -                    strncasecmp(r->filename, "ftp://";, 6) == 0)    ) {
  +                    strncasecmp(r->filename, "ftp://";,    6) == 0)
  +                || (strlen(r->filename) > 5 &&
  +                    strncasecmp(r->filename, "ldap:",     5) == 0)
  +                || (strlen(r->filename) > 5 &&
  +                    strncasecmp(r->filename, "news:";,     5) == 0)
  +                || (strlen(r->filename) > 7 &&
  +                    strncasecmp(r->filename, "mailto:";,   7) == 0)) {
               /* it was finally rewritten to a remote URL */
   
               /* skip 'scheme:' */
  @@ -1171,8 +1179,8 @@
   
               /* append the QUERY_STRING part */
               if (r->args != NULL) {
  -               r->filename = ap_pstrcat(r->pool, r->filename,
  -                                        "?", r->args, NULL);
  +                r->filename = ap_pstrcat(r->pool, r->filename, "?", 
  +                                         ap_escape_uri(r->pool, r->args), 
NULL);
               }
   
               /* determine HTTP redirect response code */
  @@ -1216,7 +1224,7 @@
               /* it was finally rewritten to a local path */
   
               /* expand "/~user" prefix */
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
               r->filename = expand_tildepaths(r, r->filename);
   #endif
               rewritelog(r, 2, "local path result: %s", r->filename);
  @@ -1389,9 +1397,7 @@
                * (r->path_info was already appended by the
                * rewriting engine because of the per-dir context!)
                */
  -            if (r->args != NULL
  -                && r->uri == r->unparsed_uri) {
  -                /* see proxy_http:proxy_http_canon() */
  +            if (r->args != NULL) {
                   r->filename = ap_pstrcat(r->pool, r->filename,
                                            "?", r->args, NULL);
               }
  @@ -1405,13 +1411,19 @@
               return OK;
           }
           else if (  (strlen(r->filename) > 7 &&
  -                    strncmp(r->filename, "http://";, 7) == 0)
  -                || (strlen(r->filename) > 8 &&
  -                    strncmp(r->filename, "https://";, 8) == 0)
  +                    strncasecmp(r->filename, "http://";,   7) == 0)
  +                || (strlen(r->filename) > 8 &&          
  +                    strncasecmp(r->filename, "https://";,  8) == 0)
                   || (strlen(r->filename) > 9 &&
  -                    strncmp(r->filename, "gopher://";, 9) == 0)
  +                    strncasecmp(r->filename, "gopher://";, 9) == 0)
                   || (strlen(r->filename) > 6 &&
  -                    strncmp(r->filename, "ftp://";, 6) == 0)    ) {
  +                    strncasecmp(r->filename, "ftp://";,    6) == 0)
  +                || (strlen(r->filename) > 5 &&
  +                    strncasecmp(r->filename, "ldap:",     5) == 0)
  +                || (strlen(r->filename) > 5 &&
  +                    strncasecmp(r->filename, "news:";,     5) == 0)
  +                || (strlen(r->filename) > 7 &&
  +                    strncasecmp(r->filename, "mailto:";,   7) == 0)) {
               /* it was finally rewritten to a remote URL */
   
               /* because we are in a per-dir context
  @@ -1460,8 +1472,8 @@
   
               /* append the QUERY_STRING part */
               if (r->args != NULL) {
  -                r->filename = ap_pstrcat(r->pool, r->filename,
  -                                         "?", r->args, NULL);
  +                r->filename = ap_pstrcat(r->pool, r->filename, "?", 
  +                                         ap_escape_uri(r->pool, r->args), 
NULL);
               }
   
               /* determine HTTP redirect response code */
  @@ -2019,10 +2031,13 @@
       i = strlen(r->filename);
       if (   prefixstrip
           && !(   r->filename[0] == '/'
  -             || (   (i > 7 && strncasecmp(r->filename, "http://";, 7) == 0)
  -                 || (i > 8 && strncasecmp(r->filename, "https://";, 8) == 0)
  +             || (   (i > 7 && strncasecmp(r->filename, "http://";,   7) == 0)
  +                 || (i > 8 && strncasecmp(r->filename, "https://";,  8) == 0)
                    || (i > 9 && strncasecmp(r->filename, "gopher://";, 9) == 0)
  -                 || (i > 6 && strncasecmp(r->filename, "ftp://";, 6) == 0)))) 
{
  +                 || (i > 6 && strncasecmp(r->filename, "ftp://";,    6) == 0)
  +                 || (i > 5 && strncasecmp(r->filename, "ldap:",     5) == 0)
  +                 || (i > 5 && strncasecmp(r->filename, "news:";,     5) == 0)
  +                 || (i > 7 && strncasecmp(r->filename, "mailto:";,   7) == 
0)))) {
           rewritelog(r, 3, "[per-dir %s] add per-dir prefix: %s -> %s%s",
                      perdir, r->filename, perdir, r->filename);
           r->filename = ap_pstrcat(r->pool, perdir, r->filename, NULL);
  @@ -2087,10 +2102,13 @@
        *  directly force an external HTTP redirect.
        */
       i = strlen(r->filename);
  -    if (   (i > 7 && strncasecmp(r->filename, "http://";, 7)   == 0)
  -        || (i > 8 && strncasecmp(r->filename, "https://";, 8)  == 0)
  +    if (   (i > 7 && strncasecmp(r->filename, "http://";,   7) == 0)
  +        || (i > 8 && strncasecmp(r->filename, "https://";,  8) == 0)
           || (i > 9 && strncasecmp(r->filename, "gopher://";, 9) == 0)
  -        || (i > 6 && strncasecmp(r->filename, "ftp://";, 6)    == 0)) {
  +        || (i > 6 && strncasecmp(r->filename, "ftp://";,    6) == 0)
  +        || (i > 5 && strncasecmp(r->filename, "ldap:",     5) == 0)
  +        || (i > 5 && strncasecmp(r->filename, "news:";,     5) == 0)
  +        || (i > 7 && strncasecmp(r->filename, "mailto:";,   7) == 0) ) {
           if (perdir == NULL) {
               rewritelog(r, 2,
                          "implicitly forcing redirect (rc=%d) with %s",
  @@ -2447,10 +2465,13 @@
       int port;
   
       i = strlen(r->filename);
  -    if (!(   (i > 7 && strncasecmp(r->filename, "http://";, 7)   == 0)
  -          || (i > 8 && strncasecmp(r->filename, "https://";, 8)  == 0)
  +    if (!(   (i > 7 && strncasecmp(r->filename, "http://";,   7) == 0)
  +          || (i > 8 && strncasecmp(r->filename, "https://";,  8) == 0)
             || (i > 9 && strncasecmp(r->filename, "gopher://";, 9) == 0)
  -          || (i > 6 && strncasecmp(r->filename, "ftp://";, 6)    == 0))) {
  +          || (i > 6 && strncasecmp(r->filename, "ftp://";,    6) == 0)
  +          || (i > 5 && strncasecmp(r->filename, "ldap:",     5) == 0)
  +          || (i > 5 && strncasecmp(r->filename, "news:";,     5) == 0)
  +          || (i > 7 && strncasecmp(r->filename, "mailto:";,   7) == 0))) {
   
           thisserver = ap_get_server_name(r);
           port = ap_get_server_port(r);
  @@ -2486,34 +2507,37 @@
   static void expand_backref_inbuffer(ap_context_t *p, char *buf, int nbuf,
                                       backrefinfo *bri, char c)
   {
  -    int i;
  -
  -    if (bri->nsub < 1) {
  -        return;
  -    }
  +    register int i;
   
  -    if (c != '$') {
  -        /* safe existing $N backrefs and replace <c>N with $N backrefs */
  -        for (i = 0; buf[i] != '\0' && i < nbuf; i++) {
  -            if (buf[i] == '$' && (buf[i+1] >= '0' && buf[i+1] <= '9')) {
  -                buf[i++] = '\001';
  -            }
  -            else if (buf[i] == c && (buf[i+1] >= '0' && buf[i+1] <= '9')) {
  -                buf[i++] = '$';
  -            }
  +    /* protect existing $N and & backrefs and replace <c>N with $N backrefs 
*/
  +    for (i = 0; buf[i] != '\0' && i < nbuf; i++) {
  +        if (buf[i] == '\\' && (buf[i+1] != '\0' && i < (nbuf-1))) {
  +            i++; /* protect next */
  +        }
  +        else if (buf[i] == '&') {
  +            buf[i] = '\001';
           }
  +        else if (c != '$' && buf[i] == '$' && (buf[i+1] >= '0' && buf[i+1] 
<= '9')) {
  +            buf[i] = '\002';
  +            i++; /* speedup */
  +        }
  +        else if (buf[i] == c && (buf[i+1] >= '0' && buf[i+1] <= '9')) {
  +            buf[i] = '$';
  +            i++; /* speedup */
  +        }
       }
   
  -    /* now apply the pregsub() function */
  +    /* now apply the standard regex substitution function */
       ap_cpystrn(buf, ap_pregsub(p, buf, bri->source,
  -                         bri->nsub+1, bri->regmatch), nbuf);
  +                               bri->nsub+1, bri->regmatch), nbuf);
   
  -    if (c != '$') {
  -        /* restore the original $N backrefs */
  -        for (i = 0; buf[i] != '\0' && i < nbuf; i++) {
  -            if (buf[i] == '\001' && (buf[i+1] >= '0' && buf[i+1] <= '9')) {
  -                buf[i++] = '$';
  -            }
  +    /* restore the original $N and & backrefs */
  +    for (i = 0; buf[i] != '\0' && i < nbuf; i++) {
  +        if (buf[i] == '\001') {
  +            buf[i] = '&';
  +        }
  +        else if (buf[i] == '\002') {
  +            buf[i] = '$';
           }
       }
   }
  @@ -2525,7 +2549,7 @@
   **  Unix /etc/passwd database information
   **
   */
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
   static char *expand_tildepaths(request_rec *r, char *uri)
   {
       char user[LONG_STRING_LEN];
  @@ -3051,16 +3075,14 @@
   
   static int rewrite_rand(int l, int h)
   {
  -    int i;
  -    char buf[50];
  -
       rewrite_rand_init();
  -    ap_snprintf(buf, sizeof(buf), "%.0f", 
  -                (((double)(rand()%RAND_MAX)/RAND_MAX)*(h-l)));
  -    i = atoi(buf)+1;
  -    if (i < l) i = l;
  -    if (i > h) i = h;
  -    return i;
  +
  +    /* Get [0,1) and then scale to the appropriate range. Note that using
  +     * a floating point value ensures that we use all bits of the rand()
  +     * result. Doing an integer modulus would only use the lower-order bits
  +     * which may not be as uniformly random.
  +     */
  +    return ((double)(rand() % RAND_MAX) / RAND_MAX) * (h - l + 1) + l;
   }
   
   static char *select_random_value_part(request_rec *r, char *value)
  @@ -3298,7 +3320,7 @@
                        "file %s", lockname);
           exit(1);
       }
  -#if !defined(OS2) && !defined(WIN32)
  +#if !defined(OS2) && !defined(WIN32) && !defined(NETWARE)
       /* make sure the childs have access to this file */
       if (geteuid() == 0 /* is superuser */)
           chown(lockname, unixd_config.user_id, -1 /* no gid change */);
  @@ -3733,7 +3755,7 @@
           LOOKAHEAD(ap_sub_req_lookup_file)
       }
   
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(NETWARE)
       /* Win32 has a rather different view of file ownerships.
          For now, just forget it */
   
  @@ -3768,7 +3790,7 @@
               }
           }
       }
  -#endif /* ndef WIN32 */
  +#endif /* ndef WIN32 && NETWARE*/
   
       if (result == NULL) {
           return ap_pstrdup(r->pool, "");
  @@ -4291,6 +4313,12 @@
       }
       return 0;
   }
  -
   
  +#ifdef NETWARE
  +int main(int argc, char *argv[]) 
  +{
  +    ExitThread(TSR_THREAD, 0);
  +}
  +#endif
  + 
   /*EOF*/
  
  
  
  1.4       +3 -1      apache-2.0/src/modules/standard/mod_rewrite.h
  
  Index: mod_rewrite.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_rewrite.h,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- mod_rewrite.h     1999/12/31 05:03:33     1.3
  +++ mod_rewrite.h     1999/12/31 05:05:28     1.4
  @@ -101,7 +101,9 @@
   #include <signal.h>
   #include <errno.h>
   #include <ctype.h>
  +#ifndef NETWARE
   #include <sys/types.h>
  +#endif
   #include <sys/stat.h>
   
       /* Include from the Apache server ... */
  @@ -157,7 +159,7 @@
   #endif
   #if !defined(USE_FCNTL) && !defined(USE_FLOCK)
   #define USE_FLOCK 1
  -#if !defined(MPE) && !defined(WIN32) && !defined(__TANDEM)
  +#if !defined(MPE) && !defined(WIN32) && !defined(__TANDEM) && 
!defined(NETWARE)
   #include <sys/file.h>
   #endif
   #ifndef LOCK_UN
  
  
  

Reply via email to