- fix bug #11929 http_negotiate_* does not return default value on non-match
[m6w6/ext-http] / http_functions.c
index 83764e9a57f58c287c3168391a92e4037ac54000..d915b3f832e2cda66de129102afd397686c9f4b7 100644 (file)
@@ -6,7 +6,7 @@
     | modification, are permitted provided that the conditions mentioned |
     | in the accompanying LICENSE file are met.                          |
     +--------------------------------------------------------------------+
-    | Copyright (c) 2004-2006, Michael Wallner <mike@php.net>            |
+    | Copyright (c) 2004-2007, Michael Wallner <mike@php.net>            |
     +--------------------------------------------------------------------+
 */
 
@@ -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; \
@@ -229,7 +233,7 @@ PHP_FUNCTION(http_negotiate_charset)
 }
 /* }}} */
 
-/* {{{ proto string http_negotiate_ctype(array supported[, array &result])
+/* {{{ proto string http_negotiate_content_type(array supported[, array &result])
        Negotiate the clients preferred content type. */
 PHP_FUNCTION(http_negotiate_content_type)
 {
@@ -802,10 +806,6 @@ PHP_FUNCTION(http_match_request_header)
 }
 /* }}} */
 
-/* {{{ HAVE_CURL */
-#ifdef HTTP_HAVE_CURL
-#ifdef HTTP_HAVE_PERSISTENT_HANDLES
-
 /* {{{ proto object http_persistent_handles_count() */
 PHP_FUNCTION(http_persistent_handles_count)
 {
@@ -830,20 +830,23 @@ PHP_FUNCTION(http_persistent_handles_clean)
 }
 /* }}} */
 
-/* {{{ proto string http_persistent_handles_ident(string ident) */
+/* {{{ proto string http_persistent_handles_ident([string ident]) */
 PHP_FUNCTION(http_persistent_handles_ident)
 {
-       char *ident_str = "";
+       char *ident_str = NULL;
        int ident_len = 0;
        
        if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &ident_str, &ident_len)) {
                RETVAL_STRING(zend_ini_string(ZEND_STRS("http.persistent.handles.ident"), 0), 1);
-               zend_alter_ini_entry(ZEND_STRS("http.persistent.handles.ident"), ident_str, ident_len, ZEND_INI_USER, PHP_INI_STAGE_RUNTIME);
+               if (ident_str && ident_len) {
+                       zend_alter_ini_entry(ZEND_STRS("http.persistent.handles.ident"), ident_str, ident_len, ZEND_INI_USER, PHP_INI_STAGE_RUNTIME);
+               }
        }
 }
 /* }}} */
 
-#endif /* HTTP_HAVE_PERSISTENT_HANDLES */
+/* {{{ HAVE_CURL */
+#ifdef HTTP_HAVE_CURL
 
 #define RETVAL_RESPONSE_OR_BODY(request) \
        { \