cellog          Thu Feb  7 23:42:02 2008 UTC

  Modified files:              
    /pecl/phar  phar_object.c 
    /pecl/phar/tests    frontcontroller10.phpt frontcontroller21.phpt 
                        frontcontroller3.phar frontcontroller3.phar.inc 
                        frontcontroller4.phar frontcontroller4.phar.inc 
                        frontcontroller6.phpt frontcontroller8.phpt 
                        withphar_web.phpt 
    /pecl/phar/tests/tar        frontcontroller10.phar.phpt 
                                frontcontroller21.phar.phpt 
                                frontcontroller3.phar.inc 
                                frontcontroller3.phar.tar 
                                frontcontroller4.phar.inc 
                                frontcontroller4.phar.tar 
                                frontcontroller6.phar.phpt 
                                frontcontroller8.phar.phpt 
    /pecl/phar/tests/zip        frontcontroller10.phar.phpt 
                                frontcontroller21.phar.phpt 
                                frontcontroller3.phar.inc 
                                frontcontroller3.phar.zip 
                                frontcontroller4.phar.inc 
                                frontcontroller4.phar.zip 
                                frontcontroller6.phar.phpt 
                                frontcontroller8.phar.phpt 
  Log:
  [DOC]
  refactor the $rewrites parameter in Phar::webPhar.  Now it is a callback
  that accepts the path requested.  This callback should return the actual 
filename
  requested as a string, or false to deny access as HTTP 403.
  Also fix incorrect munging of SCRIPT_NAME variable in mungServer
  More importantly, Phar::webPhar now finds the filename hidden in:
  http://localhost/myphar.phar/internal/file.php/extra/stuff
  as 'internal/file.php' in phar 'myphar.phar' with REQUEST_URI 
'/internal/file.php/extra/stuff'
  this will allow pharring up apps that use REQUEST_URI for front controller 
stuff.
  
http://cvs.php.net/viewvc.cgi/pecl/phar/phar_object.c?r1=1.143&r2=1.144&diff_format=u
Index: pecl/phar/phar_object.c
diff -u pecl/phar/phar_object.c:1.143 pecl/phar/phar_object.c:1.144
--- pecl/phar/phar_object.c:1.143       Thu Feb  7 04:24:56 2008
+++ pecl/phar/phar_object.c     Thu Feb  7 23:42:02 2008
@@ -17,7 +17,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: phar_object.c,v 1.143 2008/02/07 04:24:56 cellog Exp $ */
+/* $Id: phar_object.c,v 1.144 2008/02/07 23:42:02 cellog Exp $ */
 
 #include "phar_internal.h"
 #include "func_interceptors.h"
@@ -74,7 +74,7 @@
 }
 /* }}} */
 
-static void phar_mung_server_vars(char *fname, char *entry, int entry_len, 
char *basename, int basename_len TSRMLS_DC)
+static void phar_mung_server_vars(char *fname, char *entry, int entry_len, 
char *basename, int basename_len, char *request_uri, int request_uri_len 
TSRMLS_DC)
 {
        zval **_SERVER, **stuff;
        char *path_info;
@@ -83,66 +83,67 @@
        if (SUCCESS != zend_hash_find(&EG(symbol_table), "_SERVER", 
sizeof("_SERVER"), (void **) &_SERVER)) {
                return;
        }
-#define PHAR_MUNG_REPLACE(vname) \
-       if (zend_hash_exists(&(PHAR_GLOBALS->phar_SERVER_mung_list), #vname, 
sizeof(#vname)-1)) { \
-               if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(_SERVER), #vname, 
sizeof(#vname), (void **) &stuff)) { \
-                       int code; \
-                       zval *temp; \
-                       char newname[sizeof("SCRIPT_FILENAME")+4]; \
-                                                       \
-                       path_info = Z_STRVAL_PP(stuff); \
-                       code = Z_STRLEN_PP(stuff); \
-                       Z_STRVAL_PP(stuff) = estrndup(Z_STRVAL_PP(stuff) + 
basename_len, Z_STRLEN_PP(stuff) - basename_len); \
-                       Z_STRLEN_PP(stuff) -= basename_len; \
-                                                       \
-                       MAKE_STD_ZVAL(temp); \
-                       Z_TYPE_P(temp) = IS_STRING; \
-                       Z_STRVAL_P(temp) = path_info; \
-                       Z_STRLEN_P(temp) = code; \
-                       memset(newname, 0, sizeof("SCRIPT_FILENAME")+4); \
-                       memcpy(newname, "PHAR_", 5); \
-                       memcpy(newname + 5, #vname, sizeof(#vname)); \
-                       zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
strlen(newname)+1, (void *) &temp, sizeof(zval **), NULL); \
-               } \
-       }
 
        /* PATH_INFO and PATH_TRANSLATED should always be munged */
        if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(_SERVER), "PATH_INFO", 
sizeof("PATH_INFO"), (void **) &stuff)) { 
                int code; 
                zval *temp; 
                char newname[] = "PHAR_PATH_INFO";
-                                               
+
                path_info = Z_STRVAL_PP(stuff); 
                code = Z_STRLEN_PP(stuff); 
-               Z_STRVAL_PP(stuff) = estrndup(Z_STRVAL_PP(stuff) + entry_len, 
Z_STRLEN_PP(stuff) - entry_len);
-               Z_STRLEN_PP(stuff) -= entry_len;
-                                               
+               ZVAL_STRINGL(*stuff, Z_STRVAL_PP(stuff) + entry_len, 
Z_STRLEN_PP(stuff) - entry_len - request_uri_len, 1);
+
                MAKE_STD_ZVAL(temp); 
-               Z_TYPE_P(temp) = IS_STRING; 
-               Z_STRVAL_P(temp) = path_info; 
-               Z_STRLEN_P(temp) = code; 
-               zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
strlen(newname)+1, (void *) &temp, sizeof(zval **), NULL); 
+               ZVAL_STRINGL(temp, path_info, code, 0);
+               zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
sizeof(newname), (void *) &temp, sizeof(zval **), NULL); 
        }
        if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(_SERVER), "PATH_TRANSLATED", 
sizeof("PATH_TRANSLATED"), (void **) &stuff)) { 
                int code; 
                zval *temp; 
                char newname[] = "PHAR_PATH_TRANSLATED";
-                                               
+
                path_info = Z_STRVAL_PP(stuff); 
                code = Z_STRLEN_PP(stuff); 
                Z_STRLEN_PP(stuff) = spprintf(&(Z_STRVAL_PP(stuff)), 4096, 
"phar://%s%s", fname, entry);
-                                               
-               MAKE_STD_ZVAL(temp); 
-               Z_TYPE_P(temp) = IS_STRING; 
-               Z_STRVAL_P(temp) = path_info; 
-               Z_STRLEN_P(temp) = code; 
-               zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
strlen(newname)+1, (void *) &temp, sizeof(zval **), NULL); 
+
+               MAKE_STD_ZVAL(temp);
+               ZVAL_STRINGL(temp, path_info, code, 0);
+               zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
sizeof(newname), (void *) &temp, sizeof(zval **), NULL); 
        }
        if (!PHAR_GLOBALS->phar_SERVER_mung_list.arBuckets || 
!zend_hash_num_elements(&(PHAR_GLOBALS->phar_SERVER_mung_list))) {
                return;
        }
-       PHAR_MUNG_REPLACE(REQUEST_URI);
-       PHAR_MUNG_REPLACE(PHP_SELF);
+       if (zend_hash_exists(&(PHAR_GLOBALS->phar_SERVER_mung_list), 
"REQUEST_URI", sizeof("REQUEST_URI")-1)) {
+               if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(_SERVER), 
"REQUEST_URI", sizeof("REQUEST_URI"), (void **) &stuff)) { 
+                       int code;
+                       zval *temp;
+                       char newname[] = "PHAR_REQUEST_URI";
+
+                       path_info = Z_STRVAL_PP(stuff);
+                       code = Z_STRLEN_PP(stuff);
+                       ZVAL_STRINGL(*stuff, Z_STRVAL_PP(stuff) + basename_len, 
Z_STRLEN_PP(stuff) - basename_len, 1);
+
+                       MAKE_STD_ZVAL(temp);
+                       ZVAL_STRINGL(temp, path_info, code, 0);
+                       zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
sizeof(newname), (void *) &temp, sizeof(zval **), NULL);
+               }
+       }
+       if (zend_hash_exists(&(PHAR_GLOBALS->phar_SERVER_mung_list), 
"PHP_SELF", sizeof("PHP_SELF")-1)) {
+               if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(_SERVER), "PHP_SELF", 
sizeof("PHP_SELF"), (void **) &stuff)) { 
+                       int code;
+                       zval *temp;
+                       char newname[] = "PHAR_PHP_SELF";
+
+                       path_info = Z_STRVAL_PP(stuff);
+                       code = Z_STRLEN_PP(stuff);
+                       ZVAL_STRINGL(*stuff, Z_STRVAL_PP(stuff) + basename_len, 
Z_STRLEN_PP(stuff) - basename_len, 1);
+
+                       MAKE_STD_ZVAL(temp);
+                       ZVAL_STRINGL(temp, path_info, code, 0);
+                       zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
sizeof(newname), (void *) &temp, sizeof(zval **), NULL);
+               }
+       }
 
        if (zend_hash_exists(&(PHAR_GLOBALS->phar_SERVER_mung_list), 
"SCRIPT_NAME", sizeof("SCRIPT_NAME")-1)) {
                if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(_SERVER), 
"SCRIPT_NAME", sizeof("SCRIPT_NAME"), (void **) &stuff)) { 
@@ -152,13 +153,15 @@
                                                        
                        path_info = Z_STRVAL_PP(stuff); 
                        code = Z_STRLEN_PP(stuff); 
-                       Z_STRLEN_PP(stuff) = spprintf(&(Z_STRVAL_PP(stuff)), 
4096, "phar://%s%s", fname, entry);
+                       if (entry[0] != '/') {
+                               Z_STRLEN_PP(stuff) = 
spprintf(&(Z_STRVAL_PP(stuff)), 4096, "phar://%s%s", fname, entry);
+                       } else {
+                               ZVAL_STRINGL(*stuff, entry, entry_len, 1);
+                       }
                                                        
-                       MAKE_STD_ZVAL(temp); 
-                       Z_TYPE_P(temp) = IS_STRING; 
-                       Z_STRVAL_P(temp) = path_info; 
-                       Z_STRLEN_P(temp) = code; 
-                       zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
strlen(newname)+1, (void *) &temp, sizeof(zval **), NULL); 
+                       MAKE_STD_ZVAL(temp);
+                       ZVAL_STRINGL(temp, path_info, code, 0);
+                       zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
sizeof(newname), (void *) &temp, sizeof(zval **), NULL); 
                } 
        }
 
@@ -167,21 +170,19 @@
                        int code; 
                        zval *temp; 
                        char newname[] = "PHAR_SCRIPT_FILENAME";
-                                                       
+
                        path_info = Z_STRVAL_PP(stuff); 
                        code = Z_STRLEN_PP(stuff); 
                        Z_STRLEN_PP(stuff) = spprintf(&(Z_STRVAL_PP(stuff)), 
4096, "phar://%s%s", fname, entry);
-                                                       
-                       MAKE_STD_ZVAL(temp); 
-                       Z_TYPE_P(temp) = IS_STRING; 
-                       Z_STRVAL_P(temp) = path_info; 
-                       Z_STRLEN_P(temp) = code; 
-                       zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
strlen(newname)+1, (void *) &temp, sizeof(zval **), NULL); 
+
+                       MAKE_STD_ZVAL(temp);
+                       ZVAL_STRINGL(temp, path_info, code, 0);
+                       zend_hash_update(Z_ARRVAL_PP(_SERVER), newname, 
sizeof(newname), (void *) &temp, sizeof(zval **), NULL); 
                }
        }
 }
 
-static int phar_file_action(phar_entry_data *phar, char *mime_type, int code, 
char *entry, int entry_len, char *arch, int arch_len, char *basename, int 
basename_len TSRMLS_DC)
+static int phar_file_action(phar_entry_data *phar, char *mime_type, int code, 
char *entry, int entry_len, char *arch, int arch_len, char *basename, int 
basename_len, char *ru, int ru_len TSRMLS_DC)
 {
        char *name = NULL, buf[8192], *cwd;
        zend_syntax_highlighter_ini syntax_highlighter_ini;
@@ -203,8 +204,7 @@
                        }
                        php_get_highlight_struct(&syntax_highlighter_ini);
 
-                       if (highlight_file(name, &syntax_highlighter_ini 
TSRMLS_CC) == FAILURE) {
-                       }
+                       highlight_file(name, &syntax_highlighter_ini TSRMLS_CC);
 
                        phar_entry_delref(phar TSRMLS_CC);
                        efree(name);
@@ -255,7 +255,7 @@
                        return PHAR_MIME_OTHER;
                case PHAR_MIME_PHP:
                        if (basename) {
-                               phar_mung_server_vars(arch, entry, entry_len, 
basename, basename_len TSRMLS_CC);
+                               phar_mung_server_vars(arch, entry, entry_len, 
basename, basename_len, ru, ru_len TSRMLS_CC);
                                efree(basename);
                        }
                        phar_entry_delref(phar TSRMLS_CC);
@@ -327,7 +327,21 @@
        return -1;
 }
 
-void phar_do_404(char *fname, int fname_len, char *f404, int f404_len, char 
*entry, int entry_len TSRMLS_DC)
+static void phar_do_403(char *entry, int entry_len TSRMLS_DC)
+{
+       sapi_header_line ctr = {0};
+
+       ctr.response_code = 403;
+       ctr.line_len = sizeof("HTTP/1.0 403 Access Denied");
+       ctr.line = "HTTP/1.0 403 Access Denied";
+       sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC);
+       sapi_send_headers(TSRMLS_C);
+       PHPWRITE("<html>\n <head>\n  <title>Access Denied</title>\n </head>\n 
<body>\n  <h1>403 - File ", sizeof("<html>\n <head>\n  <title>Access 
Denied</title>\n </head>\n <body>\n  <h1>403 - File ") - 1);
+       PHPWRITE(entry, entry_len);
+       PHPWRITE(" Access Denied</h1>\n </body>\n</html>", sizeof(" Access 
Denied</h1>\n </body>\n</html>") - 1);
+}
+
+static void phar_do_404(char *fname, int fname_len, char *f404, int f404_len, 
char *entry, int entry_len TSRMLS_DC)
 {
        int hi;
        phar_entry_data *phar;
@@ -339,7 +353,7 @@
                        }
                        goto nofile;
                }
-               hi = phar_file_action(phar, "text/html", PHAR_MIME_PHP, f404, 
f404_len, fname, fname_len, NULL, 0 TSRMLS_CC);
+               hi = phar_file_action(phar, "text/html", PHAR_MIME_PHP, f404, 
f404_len, fname, fname_len, NULL, 0, NULL, 0 TSRMLS_CC);
        } else {
                sapi_header_line ctr = {0};
 nofile:
@@ -348,13 +362,54 @@
                ctr.line = "HTTP/1.0 404 Not Found";
                sapi_header_op(SAPI_HEADER_REPLACE, &ctr TSRMLS_CC);
                sapi_send_headers(TSRMLS_C);
-               PHPWRITE("<html>\n <head>\n  <title>File Not Found<title>\n 
</head>\n <body>\n  <h1>404 - File ", sizeof("<html>\n <head>\n  <title>File 
Not Found<title>\n </head>\n <body>\n  <h1>404 - File ") - 1);
+               PHPWRITE("<html>\n <head>\n  <title>File Not Found</title>\n 
</head>\n <body>\n  <h1>404 - File ", sizeof("<html>\n <head>\n  <title>File 
Not Found</title>\n </head>\n <body>\n  <h1>404 - File ") - 1);
                PHPWRITE(entry, entry_len);
                PHPWRITE(" Not Found</h1>\n </body>\n</html>",  sizeof(" Not 
Found</h1>\n </body>\n</html>") - 1);
        }
 }
 
-/* {{{ proto void Phar::webPhar([string alias, [string index, [string f404, 
[array mimetypes, [array rewrites]]]]])
+static void phar_postprocess_ru_web(char *fname, int fname_len, char **entry,
+                                       int *entry_len, char **ru, int *ru_len 
TSRMLS_DC)
+{
+       char *e = *entry + 1, *u = NULL, *saveu = NULL;
+       int e_len = *entry_len - 1, u_len = 0;
+       phar_archive_data **pphar;
+
+       /* we already know we can retrieve the phar if we reach here */
+       zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), fname, fname_len, (void 
**) &pphar);
+
+       do {
+               if (zend_hash_exists(&((*pphar)->manifest), e, e_len)) {
+                       if (u) {
+                               u[0] = '/';
+                               *ru = estrndup(u, u_len+1);
+                               u_len++;
+                               u[0] = '\0';
+                       } else {
+                               *ru = NULL;
+                       }
+                       *ru_len = u_len;
+                       *entry_len = e_len + 1;
+                       return;
+               }
+               if (u) {
+                       u[0] = '/';
+                       saveu = u;
+               }
+               u = strrchr(e, '/');
+               if (!u) {
+                       if (saveu) {
+                               saveu[0] = '/';
+                       }
+                       return;
+               }
+               u[0] = '\0';
+               u_len = strlen(u + 1);
+               e_len -= u_len + 1;
+       } while (1);
+}
+
+/* {{{ proto void Phar::webPhar([string alias, [string index, [string f404, 
[array mimetypes, [callback rewrites]]]]])
  * mapPhar for web-based phars. Reads the currently executed file (a phar)
  * and registers its manifest. When executed in the CLI or CGI command-line 
sapi,
  * this works exactly like mapPhar().  When executed by a web-based sapi, this
@@ -365,15 +420,14 @@
 {
        HashTable mimetypes;
        phar_mime_type mime;
-       zval *mimeoverride = NULL, *rewrites = NULL;
-       char *alias = NULL, *error, *plain_map, *index_php, *f404 = NULL;
-       int alias_len = 0, ret, f404_len = 0, free_pathinfo = 0;
+       zval *mimeoverride = NULL, *rewrite = NULL;
+       char *alias = NULL, *error, *plain_map, *index_php, *f404 = NULL, *ru = 
NULL;
+       int alias_len = 0, ret, f404_len = 0, free_pathinfo = 0, ru_len = 0;
        char *fname, *basename, *path_info, *mime_type, *entry, *pt;
        int fname_len, entry_len, code, index_php_len = 0;
        phar_entry_data *phar;
-       zval **fd_ptr;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!saa", 
&alias, &alias_len, &index_php, &index_php_len, &f404, &f404_len, 
&mimeoverride, &rewrites) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!saz", 
&alias, &alias_len, &index_php, &index_php_len, &f404, &f404_len, 
&mimeoverride, &rewrite) == FAILURE) {
                return;
        }
 
@@ -435,23 +489,92 @@
                        entry_len = 0;
                }
                pt = estrndup(testit, (pt - testit) + (fname_len - (basename - 
fname)));
-               goto skip_entry_dupe;
        } else {
                path_info = SG(request_info).request_uri;
-       }
 
-       if (!(pt = strstr(path_info, basename))) {
-               /* this can happen with rewrite rules - and we have no idea 
what to do then, so return */
-               return;
+               if (!(pt = strstr(path_info, basename))) {
+                       /* this can happen with rewrite rules - and we have no 
idea what to do then, so return */
+                       return;
+               }
+               entry_len = strlen(path_info);
+
+               entry_len -= (pt - path_info) + (fname_len - (basename - 
fname));
+               entry = estrndup(pt + (fname_len - (basename - fname)), 
entry_len);
+
+               pt = estrndup(path_info, (pt - path_info) + (fname_len - 
(basename - fname)));
        }
-       entry_len = strlen(path_info);
 
-       entry_len -= (pt - path_info) + (fname_len - (basename - fname));
-       entry = estrndup(pt + (fname_len - (basename - fname)), entry_len);
+       if (rewrite) {
+               zend_fcall_info fci;
+               zend_fcall_info_cache fcc;
+               zval *params, *retval_ptr, **zp[1];
 
-       pt = estrndup(path_info, (pt - path_info) + (fname_len - (basename - 
fname)));
+               MAKE_STD_ZVAL(params);
+               ZVAL_STRINGL(params, entry, entry_len, 1);
+               zp[0] = &params;
 
-skip_entry_dupe:
+               if (FAILURE == zend_fcall_info_init(rewrite, &fci, &fcc, NULL 
TSRMLS_CC)) {
+                       zend_throw_exception_ex(spl_ce_RuntimeException, 0 
TSRMLS_CC, "phar error: invalid rewrite callback");
+                       if (free_pathinfo) {
+                               efree(path_info);
+                       }
+                       return;
+               }
+
+               fci.param_count = 1;
+               fci.params = zp;
+#if PHP_VERSION_ID < 50300
+               params->refcount++;
+#else
+               Z_ADDREF_P(params);
+#endif
+               fci.retval_ptr_ptr = &retval_ptr;
+
+               if (FAILURE == zend_call_function(&fci, &fcc TSRMLS_CC)) {
+                       if (!EG(exception)) {
+                               
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "phar error: 
failed to call rewrite callback");
+                       }
+                       if (free_pathinfo) {
+                               efree(path_info);
+                       }
+                       return;
+               }
+               if (!retval_ptr) {
+                       if (free_pathinfo) {
+                               efree(path_info);
+                       }
+                       zend_throw_exception_ex(spl_ce_RuntimeException, 0 
TSRMLS_CC, "phar error: rewrite callback must return a string or false");
+                       return;
+               }
+               switch (Z_TYPE_P(retval_ptr)) {
+                       case IS_STRING :
+                               efree(entry);
+                               entry = Z_STRVAL_P(retval_ptr);
+                               entry_len = Z_STRLEN_P(retval_ptr);
+                               break;
+                       case IS_BOOL :
+                               phar_do_403(entry, entry_len TSRMLS_CC);
+                               if (free_pathinfo) {
+                                       efree(path_info);
+                               }
+                               zend_bailout();
+                               return;
+                       case IS_NULL :
+                               /* just use what we have now */
+                               break;
+                       default:
+                               efree(retval_ptr);
+                               if (free_pathinfo) {
+                                       efree(path_info);
+                               }
+                               
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "phar error: 
rewrite callback must return a string or false");
+                               return;
+               }
+       }
+
+       if (entry_len) {
+               phar_postprocess_ru_web(fname, fname_len, &entry, &entry_len, 
&ru, &ru_len TSRMLS_CC);
+       }
        if (!entry_len || (entry_len == 1 && entry[0] == '/')) {
                efree(entry);
                /* direct request */
@@ -507,24 +630,6 @@
                }
        }
 
-       if (rewrites) {
-               /* check for "rewrite" urls */
-               if (SUCCESS == zend_hash_find(Z_ARRVAL_P(rewrites), entry, 
entry_len+1, (void **) &fd_ptr)) {
-                       if (IS_STRING != Z_TYPE_PP(fd_ptr)) {
-#ifdef PHP_WIN32
-                               efree(fname);
-#endif
-                               
zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "phar 
rewrite value for \"%s\" was not a string", entry);
-                               return;
-                       }
-                       if (entry != index_php) {
-                               efree(entry);
-                       }
-                       entry = Z_STRVAL_PP(fd_ptr);
-                       entry_len = Z_STRLEN_PP(fd_ptr);
-               }
-       }
-
        if (FAILURE == phar_get_entry_data(&phar, fname, fname_len, entry, 
entry_len, "r", 0, &error TSRMLS_CC)) {
                phar_do_404(fname, fname_len, f404, f404_len, entry, entry_len 
TSRMLS_CC);
 #ifdef PHP_WIN32
@@ -649,7 +754,7 @@
 
 no_mimes:
        code = phar_file_type(&mimetypes, entry, &mime_type TSRMLS_CC);
-       ret = phar_file_action(phar, mime_type, code, entry, entry_len, fname, 
fname_len, pt, strlen(pt) TSRMLS_CC);
+       ret = phar_file_action(phar, mime_type, code, entry, entry_len, fname, 
fname_len, pt, strlen(pt), ru, ru_len TSRMLS_CC);
        zend_hash_destroy(&mimetypes);
 #ifdef PHP_WIN32
        efree(fname);
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/frontcontroller10.phpt?r1=1.2&r2=1.3&diff_format=u
Index: pecl/phar/tests/frontcontroller10.phpt
diff -u pecl/phar/tests/frontcontroller10.phpt:1.2 
pecl/phar/tests/frontcontroller10.phpt:1.3
--- pecl/phar/tests/frontcontroller10.phpt:1.2  Thu Feb  7 04:24:56 2008
+++ pecl/phar/tests/frontcontroller10.phpt      Thu Feb  7 23:42:02 2008
@@ -10,9 +10,13 @@
 frontcontroller4.phar
 --EXPECTHEADERS--
 Content-type: text/html
---EXPECTF--
-Fatal error: Uncaught exception 'UnexpectedValueException' with message 'phar 
rewrite value for "/hi" was not a string' in %sfrontcontroller10.php:2
-Stack trace:
-#0 %sfrontcontroller10.php(2): Phar::webPhar('whatever', 'index.php', '', 
Array, Array)
-#1 {main}
-  thrown in %sfrontcontroller10.php on line 2
\ No newline at end of file
+Status: 403 Access Denied
+--EXPECT--
+<html>
+ <head>
+  <title>Access Denied</title>
+ </head>
+ <body>
+  <h1>403 - File /hi Access Denied</h1>
+ </body>
+</html>
\ No newline at end of file
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/frontcontroller21.phpt?r1=1.4&r2=1.5&diff_format=u
Index: pecl/phar/tests/frontcontroller21.phpt
diff -u pecl/phar/tests/frontcontroller21.phpt:1.4 
pecl/phar/tests/frontcontroller21.phpt:1.5
--- pecl/phar/tests/frontcontroller21.phpt:1.4  Thu Feb  7 04:24:56 2008
+++ pecl/phar/tests/frontcontroller21.phpt      Thu Feb  7 23:42:02 2008
@@ -13,7 +13,7 @@
 Content-type: text/html
 --EXPECTF--
 string(10) "/index.php"
-string(%d) "phar://%sfrontcontroller21.php/index.php"
+string(10) "/index.php"
 string(%d) "phar://%sfrontcontroller21.php/index.php"
 string(18) "/index.php?test=hi"
 string(32) "/frontcontroller21.php/index.php"
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/frontcontroller3.phar?r1=1.3&r2=1.4&diff_format=u
Index: pecl/phar/tests/frontcontroller3.phar
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/frontcontroller3.phar.inc?r1=1.2&r2=1.3&diff_format=u
Index: pecl/phar/tests/frontcontroller3.phar.inc
diff -u pecl/phar/tests/frontcontroller3.phar.inc:1.2 
pecl/phar/tests/frontcontroller3.phar.inc:1.3
--- pecl/phar/tests/frontcontroller3.phar.inc:1.2       Sat Jan  5 04:30:29 2008
+++ pecl/phar/tests/frontcontroller3.phar.inc   Thu Feb  7 23:42:02 2008
@@ -5,7 +5,12 @@
 $a['a.jpg'] = 'hio';
 $a['a.phps'] = '<?php function hio(){}';
 $a->setStub('<?php
-Phar::webPhar("whatever", "index.php", null, array(), array("/hi" => 
"a.phps"));
+function s($a)
+{
+    static $b = array("/hi" => "a.phps");
+    if (isset($b[$a])) return $b[$a];
+}
+Phar::webPhar("whatever", "/index.php", null, array(), "s");
 echo "oops did not run\n";
 var_dump($_ENV, $_SERVER);
 __HALT_COMPILER();');
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/frontcontroller4.phar?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/frontcontroller4.phar
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/frontcontroller4.phar.inc?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/frontcontroller4.phar.inc
diff -u pecl/phar/tests/frontcontroller4.phar.inc:1.1 
pecl/phar/tests/frontcontroller4.phar.inc:1.2
--- pecl/phar/tests/frontcontroller4.phar.inc:1.1       Sat Jan  5 05:12:43 2008
+++ pecl/phar/tests/frontcontroller4.phar.inc   Thu Feb  7 23:42:02 2008
@@ -5,7 +5,13 @@
 $a['a.jpg'] = 'hio';
 $a['a.phps'] = '<?php function hio(){}';
 $a->setStub('<?php
-Phar::webPhar("whatever", "index.php", null, array(), array("/hi" => true));
+function s($a)
+{
+    static $b = array("/hi" => false);
+    if (isset($b[$a])) return $b[$a];
+    return $a;
+}
+Phar::webPhar("whatever", "index.php", null, array(), "s");
 echo "oops did not run\n";
 var_dump($_ENV, $_SERVER);
 __HALT_COMPILER();');
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/frontcontroller6.phpt?r1=1.2&r2=1.3&diff_format=u
Index: pecl/phar/tests/frontcontroller6.phpt
diff -u pecl/phar/tests/frontcontroller6.phpt:1.2 
pecl/phar/tests/frontcontroller6.phpt:1.3
--- pecl/phar/tests/frontcontroller6.phpt:1.2   Thu Feb  7 04:24:57 2008
+++ pecl/phar/tests/frontcontroller6.phpt       Thu Feb  7 23:42:02 2008
@@ -13,7 +13,7 @@
 --EXPECT--
 <html>
  <head>
-  <title>File Not Found<title>
+  <title>File Not Found</title>
  </head>
  <body>
   <h1>404 - File /notfound.php Not Found</h1>
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/frontcontroller8.phpt?r1=1.3&r2=1.4&diff_format=u
Index: pecl/phar/tests/frontcontroller8.phpt
diff -u pecl/phar/tests/frontcontroller8.phpt:1.3 
pecl/phar/tests/frontcontroller8.phpt:1.4
--- pecl/phar/tests/frontcontroller8.phpt:1.3   Thu Feb  7 04:24:57 2008
+++ pecl/phar/tests/frontcontroller8.phpt       Thu Feb  7 23:42:02 2008
@@ -13,9 +13,9 @@
 --EXPECT--
 <html>
  <head>
-  <title>File Not Found<title>
+  <title>File Not Found</title>
  </head>
  <body>
-  <h1>404 - File index.php Not Found</h1>
+  <h1>404 - File /index.php Not Found</h1>
  </body>
 </html>
\ No newline at end of file
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/withphar_web.phpt?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/withphar_web.phpt
diff -u pecl/phar/tests/withphar_web.phpt:1.1 
pecl/phar/tests/withphar_web.phpt:1.2
--- pecl/phar/tests/withphar_web.phpt:1.1       Sun Jan 20 00:49:44 2008
+++ pecl/phar/tests/withphar_web.phpt   Thu Feb  7 23:42:02 2008
@@ -3,8 +3,9 @@
 --SKIPIF--
 <?php if (!extension_loaded("phar")) die("skip");?>
 --ENV--
-SCRIPT_NAME=/withphar_web.php/web.php
+SCRIPT_NAME=/withphar_web.php
 REQUEST_URI=/withphar_web.php/web.php
+PATH_INFO=/web.php
 --FILE_EXTERNAL--
 nophar.phar
 --EXPECTHEADERS--
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/tar/frontcontroller10.phar.phpt?r1=1.3&r2=1.4&diff_format=u
Index: pecl/phar/tests/tar/frontcontroller10.phar.phpt
diff -u pecl/phar/tests/tar/frontcontroller10.phar.phpt:1.3 
pecl/phar/tests/tar/frontcontroller10.phar.phpt:1.4
--- pecl/phar/tests/tar/frontcontroller10.phar.phpt:1.3 Thu Feb  7 04:24:57 2008
+++ pecl/phar/tests/tar/frontcontroller10.phar.phpt     Thu Feb  7 23:42:02 2008
@@ -10,9 +10,13 @@
 frontcontroller4.phar.tar
 --EXPECTHEADERS--
 Content-type: text/html
---EXPECTF--
-Fatal error: Uncaught exception 'UnexpectedValueException' with message 'phar 
rewrite value for "/hi" was not a string' in %sfrontcontroller10.phar.php:2
-Stack trace:
-#0 %sfrontcontroller10.phar.php(2): Phar::webPhar('whatever', 'index.php', '', 
Array, Array)
-#1 {main}
-  thrown in %sfrontcontroller10.phar.php on line 2
\ No newline at end of file
+Status: 403 Access Denied
+--EXPECT--
+<html>
+ <head>
+  <title>Access Denied</title>
+ </head>
+ <body>
+  <h1>403 - File /hi Access Denied</h1>
+ </body>
+</html>
\ No newline at end of file
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/tar/frontcontroller21.phar.phpt?r1=1.3&r2=1.4&diff_format=u
Index: pecl/phar/tests/tar/frontcontroller21.phar.phpt
diff -u pecl/phar/tests/tar/frontcontroller21.phar.phpt:1.3 
pecl/phar/tests/tar/frontcontroller21.phar.phpt:1.4
--- pecl/phar/tests/tar/frontcontroller21.phar.phpt:1.3 Thu Feb  7 04:24:57 2008
+++ pecl/phar/tests/tar/frontcontroller21.phar.phpt     Thu Feb  7 23:42:02 2008
@@ -13,7 +13,7 @@
 Content-type: text/html
 --EXPECTF--
 string(10) "/index.php"
-string(%d) "phar://%sfrontcontroller21.phar.php/index.php"
+string(10) "/index.php"
 string(%d) "phar://%sfrontcontroller21.phar.php/index.php"
 string(18) "/index.php?test=hi"
 string(37) "/frontcontroller21.phar.php/index.php"
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/tar/frontcontroller3.phar.inc?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/tar/frontcontroller3.phar.inc
diff -u pecl/phar/tests/tar/frontcontroller3.phar.inc:1.1 
pecl/phar/tests/tar/frontcontroller3.phar.inc:1.2
--- pecl/phar/tests/tar/frontcontroller3.phar.inc:1.1   Mon Jan  7 05:35:16 2008
+++ pecl/phar/tests/tar/frontcontroller3.phar.inc       Thu Feb  7 23:42:02 2008
@@ -5,7 +5,12 @@
 $a['a.jpg'] = 'hio';
 $a['a.phps'] = '<?php function hio(){}';
 $a->setStub('<?php
-Phar::webPhar("whatever", "index.php", null, array(), array("/hi" => 
"a.phps"));
+function s($a)
+{
+    static $b = array("/hi" => "a.phps");
+    if (isset($b[$a])) return $b[$a];
+}
+Phar::webPhar("whatever", "/index.php", null, array(), "s");
 echo "oops did not run\n";
 var_dump($_ENV, $_SERVER);
 __HALT_COMPILER();');
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/tar/frontcontroller3.phar.tar?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/tar/frontcontroller3.phar.tar
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/tar/frontcontroller4.phar.inc?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/tar/frontcontroller4.phar.inc
diff -u pecl/phar/tests/tar/frontcontroller4.phar.inc:1.1 
pecl/phar/tests/tar/frontcontroller4.phar.inc:1.2
--- pecl/phar/tests/tar/frontcontroller4.phar.inc:1.1   Mon Jan  7 05:35:16 2008
+++ pecl/phar/tests/tar/frontcontroller4.phar.inc       Thu Feb  7 23:42:02 2008
@@ -5,7 +5,13 @@
 $a['a.jpg'] = 'hio';
 $a['a.phps'] = '<?php function hio(){}';
 $a->setStub('<?php
-Phar::webPhar("whatever", "index.php", null, array(), array("/hi" => true));
+function s($a)
+{
+    static $b = array("/hi" => false);
+    if (isset($b[$a])) return $b[$a];
+    return $a;
+}
+Phar::webPhar("whatever", "index.php", null, array(), "s");
 echo "oops did not run\n";
 var_dump($_ENV, $_SERVER);
 __HALT_COMPILER();');
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/tar/frontcontroller4.phar.tar?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/tar/frontcontroller4.phar.tar
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/tar/frontcontroller6.phar.phpt?r1=1.2&r2=1.3&diff_format=u
Index: pecl/phar/tests/tar/frontcontroller6.phar.phpt
diff -u pecl/phar/tests/tar/frontcontroller6.phar.phpt:1.2 
pecl/phar/tests/tar/frontcontroller6.phar.phpt:1.3
--- pecl/phar/tests/tar/frontcontroller6.phar.phpt:1.2  Thu Feb  7 04:24:57 2008
+++ pecl/phar/tests/tar/frontcontroller6.phar.phpt      Thu Feb  7 23:42:02 2008
@@ -13,7 +13,7 @@
 --EXPECT--
 <html>
  <head>
-  <title>File Not Found<title>
+  <title>File Not Found</title>
  </head>
  <body>
   <h1>404 - File /notfound.php Not Found</h1>
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/tar/frontcontroller8.phar.phpt?r1=1.2&r2=1.3&diff_format=u
Index: pecl/phar/tests/tar/frontcontroller8.phar.phpt
diff -u pecl/phar/tests/tar/frontcontroller8.phar.phpt:1.2 
pecl/phar/tests/tar/frontcontroller8.phar.phpt:1.3
--- pecl/phar/tests/tar/frontcontroller8.phar.phpt:1.2  Thu Feb  7 04:24:57 2008
+++ pecl/phar/tests/tar/frontcontroller8.phar.phpt      Thu Feb  7 23:42:02 2008
@@ -13,9 +13,9 @@
 --EXPECT--
 <html>
  <head>
-  <title>File Not Found<title>
+  <title>File Not Found</title>
  </head>
  <body>
-  <h1>404 - File index.php Not Found</h1>
+  <h1>404 - File /index.php Not Found</h1>
  </body>
 </html>
\ No newline at end of file
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/zip/frontcontroller10.phar.phpt?r1=1.4&r2=1.5&diff_format=u
Index: pecl/phar/tests/zip/frontcontroller10.phar.phpt
diff -u pecl/phar/tests/zip/frontcontroller10.phar.phpt:1.4 
pecl/phar/tests/zip/frontcontroller10.phar.phpt:1.5
--- pecl/phar/tests/zip/frontcontroller10.phar.phpt:1.4 Thu Feb  7 04:24:57 2008
+++ pecl/phar/tests/zip/frontcontroller10.phar.phpt     Thu Feb  7 23:42:02 2008
@@ -10,9 +10,13 @@
 frontcontroller4.phar.zip
 --EXPECTHEADERS--
 Content-type: text/html
---EXPECTF--
-Fatal error: Uncaught exception 'UnexpectedValueException' with message 'phar 
rewrite value for "/hi" was not a string' in %sfrontcontroller10.phar.php:2
-Stack trace:
-#0 %sfrontcontroller10.phar.php(2): Phar::webPhar('whatever', 'index.php', '', 
Array, Array)
-#1 {main}
-  thrown in %sfrontcontroller10.phar.php on line 2
\ No newline at end of file
+Status: 403 Access Denied
+--EXPECT--
+<html>
+ <head>
+  <title>Access Denied</title>
+ </head>
+ <body>
+  <h1>403 - File /hi Access Denied</h1>
+ </body>
+</html>
\ No newline at end of file
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/zip/frontcontroller21.phar.phpt?r1=1.5&r2=1.6&diff_format=u
Index: pecl/phar/tests/zip/frontcontroller21.phar.phpt
diff -u pecl/phar/tests/zip/frontcontroller21.phar.phpt:1.5 
pecl/phar/tests/zip/frontcontroller21.phar.phpt:1.6
--- pecl/phar/tests/zip/frontcontroller21.phar.phpt:1.5 Thu Feb  7 04:24:57 2008
+++ pecl/phar/tests/zip/frontcontroller21.phar.phpt     Thu Feb  7 23:42:02 2008
@@ -13,7 +13,7 @@
 Content-type: text/html
 --EXPECTF--
 string(10) "/index.php"
-string(%d) "phar://%sfrontcontroller21.phar.php/index.php"
+string(10) "/index.php"
 string(%d) "phar://%sfrontcontroller21.phar.php/index.php"
 string(18) "/index.php?test=hi"
 string(37) "/frontcontroller21.phar.php/index.php"
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/zip/frontcontroller3.phar.inc?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/zip/frontcontroller3.phar.inc
diff -u pecl/phar/tests/zip/frontcontroller3.phar.inc:1.1 
pecl/phar/tests/zip/frontcontroller3.phar.inc:1.2
--- pecl/phar/tests/zip/frontcontroller3.phar.inc:1.1   Tue Jan  8 07:08:45 2008
+++ pecl/phar/tests/zip/frontcontroller3.phar.inc       Thu Feb  7 23:42:02 2008
@@ -5,7 +5,12 @@
 $a['a.jpg'] = 'hio';
 $a['a.phps'] = '<?php function hio(){}';
 $a->setStub('<?php
-Phar::webPhar("whatever", "index.php", null, array(), array("/hi" => 
"a.phps"));
+function s($a)
+{
+    static $b = array("/hi" => "a.phps");
+    if (isset($b[$a])) return $b[$a];
+}
+Phar::webPhar("whatever", "/index.php", null, array(), "s");
 echo "oops did not run\n";
 var_dump($_ENV, $_SERVER);
 __HALT_COMPILER();');
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/zip/frontcontroller3.phar.zip?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/zip/frontcontroller3.phar.zip
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/zip/frontcontroller4.phar.inc?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/zip/frontcontroller4.phar.inc
diff -u pecl/phar/tests/zip/frontcontroller4.phar.inc:1.1 
pecl/phar/tests/zip/frontcontroller4.phar.inc:1.2
--- pecl/phar/tests/zip/frontcontroller4.phar.inc:1.1   Tue Jan  8 07:08:45 2008
+++ pecl/phar/tests/zip/frontcontroller4.phar.inc       Thu Feb  7 23:42:02 2008
@@ -5,7 +5,13 @@
 $a['a.jpg'] = 'hio';
 $a['a.phps'] = '<?php function hio(){}';
 $a->setStub('<?php
-Phar::webPhar("whatever", "index.php", null, array(), array("/hi" => true));
+function s($a)
+{
+    static $b = array("/hi" => false);
+    if (isset($b[$a])) return $b[$a];
+    return $a;
+}
+Phar::webPhar("whatever", "index.php", null, array(), "s");
 echo "oops did not run\n";
 var_dump($_ENV, $_SERVER);
 __HALT_COMPILER();');
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/zip/frontcontroller4.phar.zip?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/zip/frontcontroller4.phar.zip
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/zip/frontcontroller6.phar.phpt?r1=1.4&r2=1.5&diff_format=u
Index: pecl/phar/tests/zip/frontcontroller6.phar.phpt
diff -u pecl/phar/tests/zip/frontcontroller6.phar.phpt:1.4 
pecl/phar/tests/zip/frontcontroller6.phar.phpt:1.5
--- pecl/phar/tests/zip/frontcontroller6.phar.phpt:1.4  Thu Feb  7 04:24:57 2008
+++ pecl/phar/tests/zip/frontcontroller6.phar.phpt      Thu Feb  7 23:42:02 2008
@@ -13,7 +13,7 @@
 --EXPECT--
 <html>
  <head>
-  <title>File Not Found<title>
+  <title>File Not Found</title>
  </head>
  <body>
   <h1>404 - File /notfound.php Not Found</h1>
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/zip/frontcontroller8.phar.phpt?r1=1.4&r2=1.5&diff_format=u
Index: pecl/phar/tests/zip/frontcontroller8.phar.phpt
diff -u pecl/phar/tests/zip/frontcontroller8.phar.phpt:1.4 
pecl/phar/tests/zip/frontcontroller8.phar.phpt:1.5
--- pecl/phar/tests/zip/frontcontroller8.phar.phpt:1.4  Thu Feb  7 04:24:57 2008
+++ pecl/phar/tests/zip/frontcontroller8.phar.phpt      Thu Feb  7 23:42:02 2008
@@ -13,9 +13,9 @@
 --EXPECT--
 <html>
  <head>
-  <title>File Not Found<title>
+  <title>File Not Found</title>
  </head>
  <body>
-  <h1>404 - File index.php Not Found</h1>
+  <h1>404 - File /index.php Not Found</h1>
  </body>
 </html>
\ No newline at end of file

Reply via email to