diff options
author | Greg Beaver <cellog@php.net> | 2009-07-25 23:45:45 +0000 |
---|---|---|
committer | Greg Beaver <cellog@php.net> | 2009-07-25 23:45:45 +0000 |
commit | cfbd6d852f727c8322d73a2f5f406d798df7daf4 (patch) | |
tree | 5f70fcb32c519f50455f8045cfd69e25322baebf | |
parent | 42afb1f209fcca40e83a889be83a06a4340a74c1 (diff) | |
download | php-git-cfbd6d852f727c8322d73a2f5f406d798df7daf4.tar.gz |
more php6 fixes for phar, fix more tests
-rwxr-xr-x | ext/phar/phar_object.c | 183 | ||||
-rw-r--r-- | ext/phar/tests/files/frontcontroller12.phar | bin | 581 -> 588 bytes | |||
-rw-r--r-- | ext/phar/tests/files/frontcontroller12.phar.inc | 14 | ||||
-rw-r--r-- | ext/phar/tests/files/frontcontroller14.phar | bin | 448 -> 450 bytes | |||
-rw-r--r-- | ext/phar/tests/files/frontcontroller14.phar.inc | 4 | ||||
-rw-r--r-- | ext/phar/tests/files/frontcontroller4.phar | bin | 442 -> 433 bytes | |||
-rw-r--r-- | ext/phar/tests/files/frontcontroller4.phar.inc | 2 | ||||
-rw-r--r-- | ext/phar/tests/frontcontroller21.phpt | 2 | ||||
-rw-r--r-- | ext/phar/tests/frontcontroller22.phpt | 4 |
9 files changed, 183 insertions, 26 deletions
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 247e8e1ef8..f5b89c873b 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -56,12 +56,51 @@ static int phar_file_type(HashTable *mimes, char *file, char **mime_type TSRMLS_ } /* }}} */ +#if PHP_MAJOR_VERSION >= 6 +static inline int phar_make_unicode(zstr *c_var, char *arKey, uint nKeyLength TSRMLS_DC) +{ + int c_var_len; + UConverter *conv = ZEND_U_CONVERTER(UG(runtime_encoding_conv)); + + c_var->u = NULL; + if (zend_string_to_unicode(conv, &c_var->u, &c_var_len, arKey, nKeyLength TSRMLS_CC) == FAILURE) { + + if (c_var->u) { + efree(c_var->u); + } + return 0; + + } + return c_var_len; +} +static inline int phar_find_key(HashTable *_SERVER, char *key, int len, void **stuff TSRMLS_DC) +{ + if (SUCCESS == zend_hash_find(_SERVER, key, len, stuff)) { + return 1; + } else { + int s = len; + zstr var; + s = phar_make_unicode(&var, key, len TSRMLS_CC); + if (SUCCESS == zend_u_hash_find(_SERVER, IS_UNICODE, var, s, stuff)) { + efree(var.u); + return 1; + } + efree(var.u); + return 0; + } +} +#endif static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char *basename, int request_uri_len TSRMLS_DC) /* {{{ */ { +#if PHP_MAJOR_VERSION >= 6 + int is_unicode = 0; +#endif HashTable *_SERVER; zval **stuff; char *path_info; int basename_len = strlen(basename); + int code; + zval *temp; /* "tweak" $_SERVER variables requested in earlier call to Phar::mungServer() */ if (!PG(http_globals)[TRACK_VARS_SERVER]) { @@ -71,9 +110,17 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char _SERVER = Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]); /* PATH_INFO and PATH_TRANSLATED should always be munged */ +#if PHP_MAJOR_VERSION >= 6 + if (phar_find_key(_SERVER, "PATH_INFO", sizeof("PATH_INFO"), (void **) &stuff TSRMLS_CC)) { + if (Z_TYPE_PP(stuff) == IS_UNICODE) { + is_unicode = 1; + zval_unicode_to_string(*stuff TSRMLS_CC); + } else { + is_unicode = 0; + } +#else if (SUCCESS == zend_hash_find(_SERVER, "PATH_INFO", sizeof("PATH_INFO"), (void **) &stuff)) { - int code; - zval *temp; +#endif path_info = Z_STRVAL_PP(stuff); code = Z_STRLEN_PP(stuff); @@ -83,13 +130,26 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char MAKE_STD_ZVAL(temp); ZVAL_STRINGL(temp, path_info, code, 0); - zend_hash_update(_SERVER, "PHAR_PATH_INFO", sizeof("PHAR_PATH_INFO"), (void *) &temp, sizeof(zval **), NULL); +#if PHP_MAJOR_VERSION >= 6 + if (is_unicode) { + zval_string_to_unicode(*stuff TSRMLS_CC); + } +#endif + zend_hash_update(_SERVER, "PHAR_PATH_INFO", sizeof("PHAR_PATH_INFO"), &temp, sizeof(zval **), NULL); } } +#if PHP_MAJOR_VERSION >= 6 + if (phar_find_key(_SERVER, "PATH_TRANSLATED", sizeof("PATH_TRANSLATED"), (void **) &stuff TSRMLS_CC)) { + if (Z_TYPE_PP(stuff) == IS_UNICODE) { + is_unicode = 1; + zval_unicode_to_string(*stuff TSRMLS_CC); + } else { + is_unicode = 0; + } +#else if (SUCCESS == zend_hash_find(_SERVER, "PATH_TRANSLATED", sizeof("PATH_TRANSLATED"), (void **) &stuff)) { - int code; - zval *temp; +#endif path_info = Z_STRVAL_PP(stuff); code = Z_STRLEN_PP(stuff); @@ -97,6 +157,11 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char MAKE_STD_ZVAL(temp); ZVAL_STRINGL(temp, path_info, code, 0); +#if PHP_MAJOR_VERSION >= 6 + if (is_unicode) { + zval_string_to_unicode(*stuff TSRMLS_CC); + } +#endif zend_hash_update(_SERVER, "PHAR_PATH_TRANSLATED", sizeof("PHAR_PATH_TRANSLATED"), (void *) &temp, sizeof(zval **), NULL); } @@ -105,9 +170,17 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char } if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_REQUEST_URI) { +#if PHP_MAJOR_VERSION >= 6 + if (phar_find_key(_SERVER, "REQUEST_URI", sizeof("REQUEST_URI"), (void **) &stuff TSRMLS_CC)) { + if (Z_TYPE_PP(stuff) == IS_UNICODE) { + is_unicode = 1; + zval_unicode_to_string(*stuff TSRMLS_CC); + } else { + is_unicode = 0; + } +#else if (SUCCESS == zend_hash_find(_SERVER, "REQUEST_URI", sizeof("REQUEST_URI"), (void **) &stuff)) { - int code; - zval *temp; +#endif path_info = Z_STRVAL_PP(stuff); code = Z_STRLEN_PP(stuff); @@ -117,15 +190,28 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char MAKE_STD_ZVAL(temp); ZVAL_STRINGL(temp, path_info, code, 0); +#if PHP_MAJOR_VERSION >= 6 + if (is_unicode) { + zval_string_to_unicode(*stuff TSRMLS_CC); + } +#endif zend_hash_update(_SERVER, "PHAR_REQUEST_URI", sizeof("PHAR_REQUEST_URI"), (void *) &temp, sizeof(zval **), NULL); } } } if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_PHP_SELF) { +#if PHP_MAJOR_VERSION >= 6 + if (phar_find_key(_SERVER, "PHP_SELF", sizeof("PHP_SELF"), (void **) &stuff TSRMLS_CC)) { + if (Z_TYPE_PP(stuff) == IS_UNICODE) { + is_unicode = 1; + zval_unicode_to_string(*stuff TSRMLS_CC); + } else { + is_unicode = 0; + } +#else if (SUCCESS == zend_hash_find(_SERVER, "PHP_SELF", sizeof("PHP_SELF"), (void **) &stuff)) { - int code; - zval *temp; +#endif path_info = Z_STRVAL_PP(stuff); code = Z_STRLEN_PP(stuff); @@ -135,15 +221,28 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char MAKE_STD_ZVAL(temp); ZVAL_STRINGL(temp, path_info, code, 0); +#if PHP_MAJOR_VERSION >= 6 + if (is_unicode) { + zval_string_to_unicode(*stuff TSRMLS_CC); + } +#endif zend_hash_update(_SERVER, "PHAR_PHP_SELF", sizeof("PHAR_PHP_SELF"), (void *) &temp, sizeof(zval **), NULL); } } } if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_SCRIPT_NAME) { +#if PHP_MAJOR_VERSION >= 6 + if (phar_find_key(_SERVER, "SCRIPT_NAME", sizeof("SCRIPT_NAME"), (void **) &stuff TSRMLS_CC)) { + if (Z_TYPE_PP(stuff) == IS_UNICODE) { + is_unicode = 1; + zval_unicode_to_string(*stuff TSRMLS_CC); + } else { + is_unicode = 0; + } +#else if (SUCCESS == zend_hash_find(_SERVER, "SCRIPT_NAME", sizeof("SCRIPT_NAME"), (void **) &stuff)) { - int code; - zval *temp; +#endif path_info = Z_STRVAL_PP(stuff); code = Z_STRLEN_PP(stuff); @@ -151,14 +250,27 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char MAKE_STD_ZVAL(temp); ZVAL_STRINGL(temp, path_info, code, 0); +#if PHP_MAJOR_VERSION >= 6 + if (is_unicode) { + zval_string_to_unicode(*stuff TSRMLS_CC); + } +#endif zend_hash_update(_SERVER, "PHAR_SCRIPT_NAME", sizeof("PHAR_SCRIPT_NAME"), (void *) &temp, sizeof(zval **), NULL); } } if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_SCRIPT_FILENAME) { +#if PHP_MAJOR_VERSION >= 6 + if (phar_find_key(_SERVER, "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME"), (void **) &stuff TSRMLS_CC)) { + if (Z_TYPE_PP(stuff) == IS_UNICODE) { + is_unicode = 1; + zval_unicode_to_string(*stuff TSRMLS_CC); + } else { + is_unicode = 0; + } +#else if (SUCCESS == zend_hash_find(_SERVER, "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME"), (void **) &stuff)) { - int code; - zval *temp; +#endif path_info = Z_STRVAL_PP(stuff); code = Z_STRLEN_PP(stuff); @@ -166,6 +278,11 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char MAKE_STD_ZVAL(temp); ZVAL_STRINGL(temp, path_info, code, 0); +#if PHP_MAJOR_VERSION >= 6 + if (is_unicode) { + zval_string_to_unicode(*stuff TSRMLS_CC); + } +#endif zend_hash_update(_SERVER, "PHAR_SCRIPT_FILENAME", sizeof("PHAR_SCRIPT_FILENAME"), (void *) &temp, sizeof(zval **), NULL); } } @@ -857,7 +974,23 @@ PHP_METHOD(Phar, webPhar) if (ext) { ++ext; +#if PHP_MAJOR_VERSION >= 6 + if (FAILURE == zend_hash_find(Z_ARRVAL_P(mimeoverride), ext, strlen(ext)+1, (void **) &val)) { + /* try unicode extension */ + zstr zext; + zspprintf(IS_UNICODE, &zext, 0, "%s", ext); + if (SUCCESS == zend_u_hash_find(Z_ARRVAL_P(mimeoverride), IS_UNICODE, zext, strlen(ext)+1, (void **) &val)) { + ezfree(zext); + goto unicode_found; + } + ezfree(zext); + goto notfound; + } +unicode_found: + { /* this prevents parse error */ +#else if (SUCCESS == zend_hash_find(Z_ARRVAL_P(mimeoverride), ext, strlen(ext)+1, (void **) &val)) { +#endif switch (Z_TYPE_PP(val)) { case IS_LONG: if (Z_LVAL_PP(val) == PHAR_MIME_PHP || Z_LVAL_PP(val) == PHAR_MIME_PHPS) { @@ -871,6 +1004,11 @@ PHP_METHOD(Phar, webPhar) RETURN_FALSE; } break; +#if PHP_MAJOR_VERSION >= 6 + case IS_UNICODE: + zval_unicode_to_string(*(val) TSRMLS_CC); + /* break intentionally omitted */ +#endif case IS_STRING: mime_type = Z_STRVAL_PP(val); code = PHAR_MIME_OTHER; @@ -886,6 +1024,7 @@ PHP_METHOD(Phar, webPhar) } } +notfound: if (!mime_type) { code = phar_file_type(&PHAR_G(mime_types), entry, &mime_type TSRMLS_CC); } @@ -921,12 +1060,25 @@ PHP_METHOD(Phar, mungServer) for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(mungvalues)); SUCCESS == zend_hash_has_more_elements(Z_ARRVAL_P(mungvalues)); zend_hash_move_forward(Z_ARRVAL_P(mungvalues))) { zval **data = NULL; +#if PHP_MAJOR_VERSION >= 6 + zval *unicopy = NULL; +#endif if (SUCCESS != zend_hash_get_current_data(Z_ARRVAL_P(mungvalues), (void **) &data)) { zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "unable to retrieve array value in Phar::mungServer()"); return; } +#if PHP_MAJOR_VERSION >= 6 + if (Z_TYPE_PP(data) == IS_UNICODE) { + MAKE_STD_ZVAL(unicopy); + *unicopy = **data; + zval_copy_ctor(unicopy); + zval_unicode_to_string(unicopy TSRMLS_CC); + data = &unicopy; + } +#endif + if (Z_TYPE_PP(data) != IS_STRING) { zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Non-string value passed to Phar::mungServer(), expecting an array of any of these strings: PHP_SELF, REQUEST_URI, SCRIPT_FILENAME, SCRIPT_NAME"); return; @@ -948,6 +1100,11 @@ PHP_METHOD(Phar, mungServer) if (Z_STRLEN_PP(data) == sizeof("SCRIPT_FILENAME")-1 && !strncmp(Z_STRVAL_PP(data), "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME")-1)) { PHAR_GLOBALS->phar_SERVER_mung_list |= PHAR_MUNG_SCRIPT_FILENAME; } +#if PHP_MAJOR_VERSION >= 6 + if (unicopy) { + zval_ptr_dtor(&unicopy); + } +#endif } } /* }}} */ diff --git a/ext/phar/tests/files/frontcontroller12.phar b/ext/phar/tests/files/frontcontroller12.phar Binary files differindex 9e45587610..315c2901e0 100644 --- a/ext/phar/tests/files/frontcontroller12.phar +++ b/ext/phar/tests/files/frontcontroller12.phar diff --git a/ext/phar/tests/files/frontcontroller12.phar.inc b/ext/phar/tests/files/frontcontroller12.phar.inc index ba17df37e1..f1e4645e2f 100644 --- a/ext/phar/tests/files/frontcontroller12.phar.inc +++ b/ext/phar/tests/files/frontcontroller12.phar.inc @@ -3,13 +3,13 @@ $a = new Phar(dirname(__FILE__) . '/frontcontroller12.phar'); $a['index.php'] = '<?php var_dump($_SERVER["PHP_SELF"]); -var_dump($_SERVER["SCRIPT_NAME"]); -var_dump($_SERVER["SCRIPT_FILENAME"]); -var_dump($_SERVER["REQUEST_URI"]); -var_dump($_SERVER["PHAR_PHP_SELF"]); -var_dump($_SERVER["PHAR_SCRIPT_NAME"]); -var_dump($_SERVER["PHAR_SCRIPT_FILENAME"]); -var_dump($_SERVER["PHAR_REQUEST_URI"]); +var_dump($_SERVER[b"SCRIPT_NAME"]); +var_dump($_SERVER[b"SCRIPT_FILENAME"]); +var_dump($_SERVER[b"REQUEST_URI"]); +var_dump($_SERVER[b"PHAR_PHP_SELF"]); +var_dump($_SERVER[b"PHAR_SCRIPT_NAME"]); +var_dump($_SERVER[b"PHAR_SCRIPT_FILENAME"]); +var_dump($_SERVER[b"PHAR_REQUEST_URI"]); '; $a->setStub('<?php Phar::mungServer(array("PHP_SELF", "SCRIPT_NAME", "SCRIPT_FILENAME", "REQUEST_URI")); diff --git a/ext/phar/tests/files/frontcontroller14.phar b/ext/phar/tests/files/frontcontroller14.phar Binary files differindex 78a42a999f..2bca006653 100644 --- a/ext/phar/tests/files/frontcontroller14.phar +++ b/ext/phar/tests/files/frontcontroller14.phar diff --git a/ext/phar/tests/files/frontcontroller14.phar.inc b/ext/phar/tests/files/frontcontroller14.phar.inc index d0ebd9a45a..23104a642f 100644 --- a/ext/phar/tests/files/frontcontroller14.phar.inc +++ b/ext/phar/tests/files/frontcontroller14.phar.inc @@ -2,8 +2,8 @@ @unlink(dirname(__FILE__) . '/frontcontroller14.phar'); $a = new Phar(dirname(__FILE__) . '/frontcontroller14.phar'); $a['html/index.php'] = '<?php -var_dump($_SERVER["PATH_INFO"]); -var_dump($_SERVER["PATH_TRANSLATED"]); +var_dump($_SERVER[b"PATH_INFO"]); +var_dump($_SERVER[b"PATH_TRANSLATED"]); '; $a->setStub('<?php function s($a) diff --git a/ext/phar/tests/files/frontcontroller4.phar b/ext/phar/tests/files/frontcontroller4.phar Binary files differindex 4c9a92a197..004d1ffd16 100644 --- a/ext/phar/tests/files/frontcontroller4.phar +++ b/ext/phar/tests/files/frontcontroller4.phar diff --git a/ext/phar/tests/files/frontcontroller4.phar.inc b/ext/phar/tests/files/frontcontroller4.phar.inc index 5c6a43f954..daf807e419 100644 --- a/ext/phar/tests/files/frontcontroller4.phar.inc +++ b/ext/phar/tests/files/frontcontroller4.phar.inc @@ -7,7 +7,7 @@ $a['a.phps'] = '<?php function hio(){}'; $a->setStub('<?php function s($a) { - static $b = array("/hi" => false); + static $b = array(b"/hi" => false); if (isset($b[$a])) return $b[$a]; return $a; } diff --git a/ext/phar/tests/frontcontroller21.phpt b/ext/phar/tests/frontcontroller21.phpt index dcdbf575fe..bf50c6e801 100644 --- a/ext/phar/tests/frontcontroller21.phpt +++ b/ext/phar/tests/frontcontroller21.phpt @@ -14,7 +14,7 @@ files/frontcontroller12.phar --EXPECTHEADERS-- Content-type: text/html; charset=UTF-8 --EXPECTF-- -string(10) "/index.php" +%unicode|string%(10) "/index.php" string(10) "/index.php" string(%d) "phar://%sfrontcontroller21.php/index.php" string(18) "/index.php?test=hi" diff --git a/ext/phar/tests/frontcontroller22.phpt b/ext/phar/tests/frontcontroller22.phpt index 827c5688c7..b85c1eb497 100644 --- a/ext/phar/tests/frontcontroller22.phpt +++ b/ext/phar/tests/frontcontroller22.phpt @@ -13,8 +13,8 @@ files/frontcontroller13.phar --EXPECTHEADERS-- Content-type: text/html; charset=UTF-8 --EXPECTF-- -string(4) "test" -string(12) "oof/test.php" +%unicode|string%(4) "test" +%unicode|string%(12) "oof/test.php" Warning: include(./hi.php): failed to open stream: No such file or directory in phar://%s/oof/test.php on line %d |