summaryrefslogtreecommitdiff
path: root/ext/phar/phar_object.c
diff options
context:
space:
mode:
authorGreg Beaver <cellog@php.net>2009-07-25 23:45:45 +0000
committerGreg Beaver <cellog@php.net>2009-07-25 23:45:45 +0000
commitcfbd6d852f727c8322d73a2f5f406d798df7daf4 (patch)
tree5f70fcb32c519f50455f8045cfd69e25322baebf /ext/phar/phar_object.c
parent42afb1f209fcca40e83a889be83a06a4340a74c1 (diff)
downloadphp-git-cfbd6d852f727c8322d73a2f5f406d798df7daf4.tar.gz
more php6 fixes for phar, fix more tests
Diffstat (limited to 'ext/phar/phar_object.c')
-rwxr-xr-xext/phar/phar_object.c183
1 files changed, 170 insertions, 13 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
}
}
/* }}} */