]> granicus.if.org Git - apache/commitdiff
merge 1.3 changes to rewrite forward onto 2.0
authordgaudet <dgaudet@unknown>
Fri, 31 Dec 1999 05:05:28 +0000 (05:05 +0000)
committerdgaudet <dgaudet@unknown>
Fri, 31 Dec 1999 05:05:28 +0000 (05:05 +0000)
Submitted by: Paul J. Reder <rederpj@raleigh.ibm.com>

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@84379 13f79535-47bb-0310-9956-ffa450edef68

modules/mappers/mod_rewrite.c
modules/mappers/mod_rewrite.h

index d83b291021e25401b29e9cdf57f793f32cf5b400..1791fdd7da8de19c8beae40b6edd8e2f6eb65fe0 100644 (file)
 #endif
 
 #ifndef NO_WRITEV
+#ifndef NETWARE
 #include <sys/types.h>
+#endif
 #include <sys/uio.h>
 #endif
 
@@ -1145,13 +1147,19 @@ static int hook_uri2file(request_rec *r)
             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 @@ static int hook_uri2file(request_rec *r)
 
             /* 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 @@ static int hook_uri2file(request_rec *r)
             /* 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 @@ static int hook_fixup(request_rec *r)
              * (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 @@ static int hook_fixup(request_rec *r)
             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 @@ static int hook_fixup(request_rec *r)
 
             /* 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 @@ static int apply_rewrite_rule(request_rec *r, rewriterule_entry *p,
     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 @@ static int apply_rewrite_rule(request_rec *r, rewriterule_entry *p,
      *  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 @@ static void fully_qualify_uri(request_rec *r)
     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 fully_qualify_uri(request_rec *r)
 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 @@ static void expand_backref_inbuffer(ap_context_t *p, char *buf, int nbuf,
 **  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 void rewrite_rand_init(void)
 
 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 @@ static void rewritelock_create(server_rec *s, ap_context_t *p)
                      "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 @@ static char *lookup_variable(request_rec *r, char *var)
         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 @@ static char *lookup_variable(request_rec *r, char *var)
             }
         }
     }
-#endif /* ndef WIN32 */
+#endif /* ndef WIN32 && NETWARE*/
 
     if (result == NULL) {
         return ap_pstrdup(r->pool, "");
@@ -4292,5 +4314,11 @@ static int compare_lexicography(char *cpNum1, char *cpNum2)
     return 0;
 }
 
-
+#ifdef NETWARE
+int main(int argc, char *argv[]) 
+{
+    ExitThread(TSR_THREAD, 0);
+}
+#endif
 /*EOF*/
index 8232829e2abbc2e5644b53f1bea9a0789d46f787..a5fc5112594d3708969810c2ddef33db3a8073d0 100644 (file)
 #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 ... */
 #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