- fix bug #11929 http_negotiate_* does not return default value on non-match
authorMichael Wallner <mike@php.net>
Wed, 29 Aug 2007 16:21:57 +0000 (16:21 +0000)
committerMichael Wallner <mike@php.net>
Wed, 29 Aug 2007 16:21:57 +0000 (16:21 +0000)
http_functions.c
tests/negotiation_001.phpt

index 2c849c1..d915b3f 100644 (file)
@@ -148,6 +148,17 @@ PHP_FUNCTION(http_build_str)
 }
 /* }}} */
 
+#define HTTP_DO_NEGOTIATE_DEFAULT(supported) \
+       { \
+               zval **value; \
+                \
+               zend_hash_internal_pointer_reset(Z_ARRVAL_P(supported)); \
+               if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(supported), (void *) &value)) { \
+                       RETVAL_ZVAL(*value, 1, 0); \
+               } else { \
+                       RETVAL_NULL(); \
+               } \
+       }
 #define HTTP_DO_NEGOTIATE(type, supported, rs_array) \
 { \
        HashTable *result; \
@@ -156,10 +167,10 @@ PHP_FUNCTION(http_build_str)
                uint key_len; \
                ulong idx; \
                 \
-               if (HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(result, &key, &key_len, &idx, 1, NULL)) { \
+               if (zend_hash_num_elements(result) && HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(result, &key, &key_len, &idx, 1, NULL)) { \
                        RETVAL_STRINGL(key, key_len-1, 0); \
                } else { \
-                       RETVAL_NULL(); \
+                       HTTP_DO_NEGOTIATE_DEFAULT(supported); \
                } \
                \
                if (rs_array) { \
@@ -170,14 +181,7 @@ PHP_FUNCTION(http_build_str)
                FREE_HASHTABLE(result); \
                \
        } else { \
-               zval **value; \
-                \
-               zend_hash_internal_pointer_reset(Z_ARRVAL_P(supported)); \
-               if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(supported), (void *) &value)) { \
-                       RETVAL_ZVAL(*value, 1, 0); \
-               } else { \
-                       RETVAL_NULL(); \
-               } \
+               HTTP_DO_NEGOTIATE_DEFAULT(supported); \
                \
                if (rs_array) { \
                        HashPosition pos; \
index d4b13ac..3641455 100644 (file)
@@ -26,10 +26,14 @@ var_dump(http_negotiate_charset($csets[0]));
 var_dump(http_negotiate_charset($csets[0], $cresult));
 var_dump(http_negotiate_content_type($ctype[0]));
 var_dump(http_negotiate_content_type($ctype[0], $tresult));
+var_dump(http_negotiate_language(array("unknown")));
+var_dump(http_negotiate_charset(array("unknown")));
+var_dump(http_negotiate_content_type(array("unknown")));
 print_r($lresult);
 print_r($cresult);
 print_r($tresult);
 echo "Done\n";
+?>
 --EXPECTF--
 %sTEST
 string(2) "de"
@@ -38,6 +42,9 @@ string(10) "iso-8859-1"
 string(10) "iso-8859-1"
 string(21) "application/xhtml+xml"
 string(21) "application/xhtml+xml"
+string(7) "unknown"
+string(7) "unknown"
+string(7) "unknown"
 Array
 (
     [de] => 900