You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Roy Fielding <fi...@hyperreal.com> on 1997/03/20 19:03:40 UTC

cvs commit: apache/src CHANGES mod_rewrite.h mod_rewrite.c

fielding    97/03/20 10:03:39

  Modified:    src       CHANGES mod_rewrite.h mod_rewrite.c
  Log:
  Updated mod_rewrite to version 3.0.1, which: fixes compile error on
  AIX; improves the redirection stuff to enable the users to generally
  redirect to http, https, gopher and ftp; added TIME variable for
  RewriteCond which expands to YYYYMMDDHHMMSS strings and added the
  special patterns >STRING, <STRING and =STRING to RewriteCond, which
  can be used in conjunction with %{TIME} or other variables to create
  time-dependent rewriting rules.
  
  Submitted by: Ralf S. Engelschall
  Reviewed by: Jim Jagielski, Dean Gaudet, Roy Fielding
  
  Revision  Changes    Path
  1.206     +9 -2      apache/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache/src/CHANGES,v
  retrieving revision 1.205
  retrieving revision 1.206
  diff -C3 -r1.205 -r1.206
  *** CHANGES	1997/03/20 17:10:08	1.205
  --- CHANGES	1997/03/20 18:03:33	1.206
  ***************
  *** 78,85 ****
      *) Fixed user and server confusion over what should be a virtual host
         and what is the main server, resulting in access to something
         other than the name defined in the virtualhost directive (but
  !      with the same IP address) failing.  Also updated mod_rewrite to
  !      version 3.0.0. [Dean Gaudet and Ralf S. Engelschall]
    
      *) bpushfd() no longer notes cleanups for the file descriptors it is handed.
         Module authors may need to adjust their code for proper cleanup to take
  --- 78,92 ----
      *) Fixed user and server confusion over what should be a virtual host
         and what is the main server, resulting in access to something
         other than the name defined in the virtualhost directive (but
  !      with the same IP address) failing. [Dean Gaudet]
  ! 
  !   *) Updated mod_rewrite to version 3.0.1, which: fixes compile error on
  !      AIX; improves the redirection stuff to enable the users to generally
  !      redirect to http, https, gopher and ftp; added TIME variable for
  !      RewriteCond which expands to YYYYMMDDHHMMSS strings and added the
  !      special patterns >STRING, <STRING and =STRING to RewriteCond, which
  !      can be used in conjunction with %{TIME} or other variables to create
  !      time-dependent rewriting rules. [Ralf S. Engelschall]
    
      *) bpushfd() no longer notes cleanups for the file descriptors it is handed.
         Module authors may need to adjust their code for proper cleanup to take
  
  
  
  1.18      +11 -3     apache/src/mod_rewrite.h
  
  Index: mod_rewrite.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/mod_rewrite.h,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -C3 -r1.17 -r1.18
  *** mod_rewrite.h	1997/02/22 01:47:31	1.17
  --- mod_rewrite.h	1997/03/20 18:03:34	1.18
  ***************
  *** 64,70 ****
    **  |_| |_| |_|\___/ \__,_|___|_|  \___| \_/\_/ |_|  |_|\__\___|
    **                       |_____|
    **
  ! **  URL Rewriting Module, Version 3.0.0 (01-02-1997)
    **
    **  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 3.0.1 (17-Mar-1997)
    **
    **  This module uses a rule-based rewriting engine (based on a
    **  regular-expression parser) to rewrite requested URLs on the fly. 
  ***************
  *** 110,117 ****
    
    
        /* The locking support:
  !        Try to determine whether we should use
  !        fcntl() or flock(). */
    #if defined(USE_FCNTL_SERIALIZED_ACCEPT)
    #define USE_FCNTL 1
    #include <fcntl.h>
  --- 110,117 ----
    
    
        /* The locking support:
  !        Try to determine whether we should use fcntl() or flock().
  !        Would be better conf.h could provide this... :-( */
    #if defined(USE_FCNTL_SERIALIZED_ACCEPT)
    #define USE_FCNTL 1
    #include <fcntl.h>
  ***************
  *** 131,136 ****
  --- 131,141 ----
    #include <fcntl.h>
    #endif
    #endif
  + #ifdef AIX
  + #undef USE_FLOCK
  + #define USE_FCNTL 1
  + #include <fcntl.h>
  + #endif
    
    
    
  ***************
  *** 382,387 ****
  --- 387,395 ----
        /* File locking */
    static void fd_lock(int fd);
    static void fd_unlock(int fd);
  + 
  +     /* Lexicographic Comparison */
  + int compare_lexicography(char *cpNum1, char *cpNum2);
    
    #endif /* _MOD_REWRITE_H */
    
  
  
  
  1.22      +101 -57   apache/src/mod_rewrite.c
  
  Index: mod_rewrite.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/mod_rewrite.c,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -C3 -r1.21 -r1.22
  *** mod_rewrite.c	1997/03/07 12:00:31	1.21
  --- mod_rewrite.c	1997/03/20 18:03:35	1.22
  ***************
  *** 61,67 ****
    **  |_| |_| |_|\___/ \__,_|___|_|  \___| \_/\_/ |_|  |_|\__\___|
    **                       |_____|
    **
  ! **  URL Rewriting Module, Version 3.0.0 (06-Mar-1997)
    **
    **  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 3.0.1 (17-Mar-1997)
    **
    **  This module uses a rule-based rewriting engine (based on a
    **  regular-expression parser) to rewrite requested URLs on the fly. 
  ***************
  *** 935,958 ****
                rewritelog(r, 1, "go-ahead with proxy request %s [OK]", r->filename);
                return OK; 
            }
  ! #ifdef APACHE_SSL
  !         else if (  (!r->connection->client->ssl &&
  !                     strlen(r->filename) > 7     &&
                        strncmp(r->filename, "http://", 7) == 0)
  !                 || (r->connection->client->ssl  &&
  !                     strlen(r->filename) > 8     &&
  !                     strncmp(r->filename, "https://", 8) == 0) ) {
  ! #else
  !         else if (strlen(r->filename) > 7 &&
  !                  strncmp(r->filename, "http://", 7) == 0) {
  ! #endif
  !             /* it was finally rewritten to a remote path */
    
  ! #ifdef APACHE_SSL
  !             for (cp = r->filename+strlen(http_method(r))+3; *cp != '/' && *cp != '\0'; cp++)
  ! #else
  !             for (cp = r->filename+7; *cp != '/' && *cp != '\0'; cp++)
  ! #endif
                    ;
                if (*cp != '\0') {
                    rewritelog(r, 1, "escaping %s for redirect", r->filename);
  --- 935,957 ----
                rewritelog(r, 1, "go-ahead with proxy request %s [OK]", r->filename);
                return OK; 
            }
  !         else if (  (strlen(r->filename) > 7 &&
                        strncmp(r->filename, "http://", 7) == 0)
  !                 || (strlen(r->filename) > 8 &&
  !                     strncmp(r->filename, "https://", 8) == 0)
  !                 || (strlen(r->filename) > 9 &&
  !                     strncmp(r->filename, "gopher://", 9) == 0)
  !                 || (strlen(r->filename) > 6 &&
  !                     strncmp(r->filename, "ftp://", 6) == 0)    ) {
  !             /* it was finally rewritten to a remote URL */
    
  !             /* skip 'scheme:' */
  !             for (cp = r->filename; *cp != ':' && *cp != '\0'; cp++)
  !                 ;
  !             /* skip '//' */
  !             cp += 2;
  !             /* skip host part */
  !             for ( ; *cp != '/' && *cp != '\0'; cp++)
                    ;
                if (*cp != '\0') {
                    rewritelog(r, 1, "escaping %s for redirect", r->filename);
  ***************
  *** 1160,1187 ****
                rewritelog(r, 1, "[per-dir %s] go-ahead with proxy request %s [OK]", dconf->directory, r->filename);
                return OK; 
            }
  ! #ifdef APACHE_SSL
  !         else if (  (!r->connection->client->ssl &&
  !                     strlen(r->filename) > 7     &&
                        strncmp(r->filename, "http://", 7) == 0)
  !                 || (r->connection->client->ssl  &&
  !                     strlen(r->filename) > 8     &&
  !                     strncmp(r->filename, "https://", 8) == 0) ) {
  ! #else
  !         else if (strlen(r->filename) > 7 &&
  !                  strncmp(r->filename, "http://", 7) == 0) {
  ! #endif
  !             /* it was finally rewritten to a remote path */
    
                /* because we are in a per-dir context
                   first try to replace the directory with its base-URL
                   if there is a base-URL available */
                if (dconf->baseurl != NULL) {
  ! #ifdef APACHE_SSL
  !                 if ((cp = strchr(r->filename+strlen(http_method(r))+3, '/')) != NULL) {
  ! #else
  !                 if ((cp = strchr(r->filename+7, '/')) != NULL) {
  ! #endif
                        rewritelog(r, 2, "[per-dir %s] trying to replace prefix %s with %s", dconf->directory, dconf->directory, dconf->baseurl);
                        cp2 = subst_prefix_path(r, cp, dconf->directory, dconf->baseurl);
                        if (strcmp(cp2, cp) != 0) {
  --- 1159,1184 ----
                rewritelog(r, 1, "[per-dir %s] go-ahead with proxy request %s [OK]", dconf->directory, r->filename);
                return OK; 
            }
  !         else if (  (strlen(r->filename) > 7 &&
                        strncmp(r->filename, "http://", 7) == 0)
  !                 || (strlen(r->filename) > 8 &&
  !                     strncmp(r->filename, "https://", 8) == 0)
  !                 || (strlen(r->filename) > 9 &&
  !                     strncmp(r->filename, "gopher://", 9) == 0)
  !                 || (strlen(r->filename) > 6 &&
  !                     strncmp(r->filename, "ftp://", 6) == 0)    ) {
  !             /* it was finally rewritten to a remote URL */
    
                /* because we are in a per-dir context
                   first try to replace the directory with its base-URL
                   if there is a base-URL available */
                if (dconf->baseurl != NULL) {
  !                 /* skip 'scheme:' */
  !                 for (cp = r->filename; *cp != ':' && *cp != '\0'; cp++)
  !                     ;
  !                 /* skip '//' */
  !                 cp += 2;
  !                 if ((cp = strchr(cp, '/')) != NULL) {
                        rewritelog(r, 2, "[per-dir %s] trying to replace prefix %s with %s", dconf->directory, dconf->directory, dconf->baseurl);
                        cp2 = subst_prefix_path(r, cp, dconf->directory, dconf->baseurl);
                        if (strcmp(cp2, cp) != 0) {
  ***************
  *** 1192,1202 ****
                }
    
                /* now prepare the redirect... */
  ! #ifdef APACHE_SSL
  !             for (cp = r->filename+strlen(http_method(r))+3; *cp != '/' && *cp != '\0'; cp++)
  ! #else
  !             for (cp = r->filename+7; *cp != '/' && *cp != '\0'; cp++)
  ! #endif
                    ;
                if (*cp != '\0') {
                    rewritelog(r, 1, "[per-dir %s] escaping %s for redirect", dconf->directory, r->filename);
  --- 1189,1202 ----
                }
    
                /* now prepare the redirect... */
  ! 
  !             /* skip 'scheme:' */
  !             for (cp = r->filename; *cp != ':' && *cp != '\0'; cp++)
  !                 ;
  !             /* skip '//' */
  !             cp += 2;
  !             /* skip host part */
  !             for ( ; *cp != '/' && *cp != '\0'; cp++)
                    ;
                if (*cp != '\0') {
                    rewritelog(r, 1, "[per-dir %s] escaping %s for redirect", dconf->directory, r->filename);
  ***************
  *** 1523,1536 ****
            }
    
            /* if this is a implicit redirect in a per-dir rule */
  ! #ifdef APACHE_SSL
  !         if (perdir != NULL && (  (!r->connection->client->ssl &&
  !                                   strncmp(output, "http://", 7) == 0)
  !                               || (r->connection->client->ssl &&
  !                                   strncmp(output, "https://", 8) == 0) )) { 
  ! #else
  !         if (perdir != NULL && strncmp(output, "http://", 7) == 0) {
  ! #endif
                if (p->flags & RULEFLAG_NOTMATCH) {
                    strncpy(newuri, output, sizeof(newuri)-1);
                    EOS_PARANOIA(newuri);
  --- 1523,1534 ----
            }
    
            /* if this is a implicit redirect in a per-dir rule */
  !         i = strlen(output);
  !         if (perdir != NULL
  !             && (   (i > 7 && strncmp(output, "http://", 7) == 0)
  !                 || (i > 8 && strncmp(output, "https://", 8) == 0)
  !                 || (i > 9 && strncmp(output, "gopher://", 9) == 0)
  !                 || (i > 6 && strncmp(output, "ftp://", 6) == 0)   ) ) {
                if (p->flags & RULEFLAG_NOTMATCH) {
                    strncpy(newuri, output, sizeof(newuri)-1);
                    EOS_PARANOIA(newuri);
  ***************
  *** 1591,1597 ****
    
            r->filename = pstrdup(r->pool, newuri);
    
  !         /* reduce http://<ourhost>[:<port>] */
            reduce_uri(r);
    
            /* split out on-the-fly generated QUERY_STRING '....?xxxxx&xxxx...' */
  --- 1589,1595 ----
    
            r->filename = pstrdup(r->pool, newuri);
    
  !         /* reduce http[s]://<ourhost>[:<port>] */
            reduce_uri(r);
    
            /* split out on-the-fly generated QUERY_STRING '....?xxxxx&xxxx...' */
  ***************
  *** 1607,1622 ****
            }
    
            /* if we are forced to do a explicit redirect by [R] flag
  !            finally prefix the new URI with http://<ourname> explicitly */
            if (flags & RULEFLAG_FORCEREDIRECT) {
  ! #ifdef APACHE_SSL
  !            if ( (!r->connection->client->ssl &&
  !                  strncmp(r->filename, "http://", 7) != 0) ||
  !                 (r->connection->client->ssl &&
  !                  strncmp(r->filename, "https://", 8) != 0)) {
  ! #else
  !             if (strncmp(r->filename, "http://", 7) != 0) {
  ! #endif
    #ifdef APACHE_SSL
                    if ((!r->connection->client->ssl && r->server->port == 80) ||
                        ( r->connection->client->ssl && r->server->port == 443)  )
  --- 1605,1622 ----
            }
    
            /* if we are forced to do a explicit redirect by [R] flag
  !            and the current URL still is not a fully qualified one we
  !            finally prefix it with http[s]://<ourname> explicitly */
            if (flags & RULEFLAG_FORCEREDIRECT) {
  !             if (  !(strlen(r->filename) > 7 &&
  !                     strncmp(r->filename, "http://", 7) == 0)
  !                && !(strlen(r->filename) > 8 &&
  !                     strncmp(r->filename, "https://", 8) == 0)
  !                && !(strlen(r->filename) > 9 &&
  !                     strncmp(r->filename, "gopher://", 9) == 0)
  !                && !(strlen(r->filename) > 6 &&
  !                     strncmp(r->filename, "ftp://", 6) == 0)    ) {
  ! 
    #ifdef APACHE_SSL
                    if ((!r->connection->client->ssl && r->server->port == 80) ||
                        ( r->connection->client->ssl && r->server->port == 443)  )
  ***************
  *** 1736,1741 ****
  --- 1736,1750 ----
                destroy_sub_req(rsub);
            }
        }
  +     else if (strlen(p->pattern) > 1 && *(p->pattern) == '>') {
  +         rc = (compare_lexicography(input, p->pattern+1) == 1 ? 1 : 0);
  +     }
  +     else if (strlen(p->pattern) > 1 && *(p->pattern) == '<') {
  +         rc = (compare_lexicography(input, p->pattern+1) == -1 ? 1 : 0);
  +     }
  +     else if (strlen(p->pattern) > 1 && *(p->pattern) == '=') {
  +         rc = (strcmp(input, p->pattern+1) == 0 ? 1 : 0);
  +     }
        else {
            /* it is really a regexp pattern, so apply it */
            rc = (regexec(p->regexp, input, 0, NULL, 0) == 0);
  ***************
  *** 1790,1796 ****
    
    /*
    **
  ! **  strip 'http://ourhost/' from URI
    **
    */
    
  --- 1799,1805 ----
    
    /*
    **
  ! **  strip 'http[s]://ourhost/' from URI
    **
    */
    
  ***************
  *** 2613,2618 ****
  --- 2622,2636 ----
        else if (strcasecmp(var, "TIME_WDAY") == 0) {
            MKTIMESTR("%d", tm_wday)
        }
  +     else if (strcasecmp(var, "TIME") == 0) {
  +         tc = time(NULL);
  +         tm = localtime(&tc);
  +         ap_snprintf(resultbuf, sizeof(resultbuf), "%02d%02d%02d%02d%02d%02d%02d",
  +             (tm->tm_year / 100) + 19, (tm->tm_year % 100),
  +             tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
  +         result = resultbuf;
  +         rewritelog(r, 1, "RESULT='%s'", result);
  +     }
    
        /* all other env-variables from the parent Apache process */
        else if (strlen(var) > 4 && strncasecmp(var, "ENV:", 4) == 0) {
  ***************
  *** 3225,3230 ****
  --- 3243,3274 ----
            fprintf(stderr, "Error freeing lock. Exiting!");
            exit(1);
        }
  + }
  + 
  + /*
  + **
  + **  Lexicographic Compare
  + **
  + */
  + 
  + int compare_lexicography(char *cpNum1, char *cpNum2)
  + {
  +     int i;
  +     int n1, n2;
  + 
  +     n1 = strlen(cpNum1);
  +     n2 = strlen(cpNum2);
  +     if (n1 > n2)
  +         return 1;
  +     if (n1 < n2)
  +         return -1;
  +     for (i = 0; i < n1; i++) {
  +         if (cpNum1[i] > cpNum2[i])
  +             return 1;
  +         if (cpNum1[i] < cpNum2[i])
  +             return -1;
  +     }
  +     return 0;
    }