branch off v1 as R_1_7
[m6w6/ext-http] / http_functions.c
index 079996986697c361a73f6c6a9e6ce520d24db4cc..8fc26f2cd4ef46b93ef2197daa68a845923e7cc3 100644 (file)
@@ -165,10 +165,22 @@ PHP_FUNCTION(http_build_str)
                        RETVAL_NULL(); \
                } \
        }
-#define HTTP_DO_NEGOTIATE(type, supported, rs_array) \
-{ \
-       HashTable *result; \
-       if ((result = http_negotiate_ ##type(supported))) { \
+
+#define HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array) \
+       HTTP_DO_NEGOTIATE_DEFAULT(supported); \
+       if (rs_array) { \
+               HashPosition pos; \
+               zval **value_ptr; \
+                \
+               FOREACH_VAL(pos, supported, value_ptr) { \
+                       zval *value = http_zsep(IS_STRING, *value_ptr); \
+                       add_assoc_double(rs_array, Z_STRVAL_P(value), 1.0); \
+                       zval_ptr_dtor(&value); \
+               } \
+       }
+
+#define HTTP_DO_NEGOTIATE_HANDLE_RESULT(result, supported, rs_array) \
+       { \
                char *key; \
                uint key_len; \
                ulong idx; \
@@ -185,22 +197,17 @@ PHP_FUNCTION(http_build_str)
                \
                zend_hash_destroy(result); \
                FREE_HASHTABLE(result); \
-               \
-       } else { \
-               HTTP_DO_NEGOTIATE_DEFAULT(supported); \
-               \
-               if (rs_array) { \
-                       HashPosition pos; \
-                       zval **value_ptr; \
-                        \
-                       FOREACH_VAL(pos, supported, value_ptr) { \
-                               zval *value = http_zsep(IS_STRING, *value_ptr); \
-                               add_assoc_double(rs_array, Z_STRVAL_P(value), 1.0); \
-                               zval_ptr_dtor(&value); \
-                       } \
+       }
+
+#define HTTP_DO_NEGOTIATE(type, supported, rs_array) \
+       { \
+               HashTable *result; \
+               if ((result = http_negotiate_ ##type(supported))) { \
+                       HTTP_DO_NEGOTIATE_HANDLE_RESULT(result, supported, rs_array); \
+               } else { \
+                       HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array); \
                } \
-       } \
-}
+       }
 
 /* {{{ proto string http_negotiate_language(array supported[, array &result])
        Negotiate the clients preferred language. */
@@ -259,6 +266,30 @@ PHP_FUNCTION(http_negotiate_content_type)
 }
 /* }}} */
 
+/* {{{ proto string http_negotiate(mixed value, array supported[, array &result])
+       Negotiate the user supplied value. */
+PHP_FUNCTION(http_negotiate)
+{
+       zval *value, *supported, *rs_array = NULL;
+       HashTable *rs;
+
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "za|z", &value, &supported, &rs_array)) {
+               RETURN_FALSE;
+       }
+
+       if (rs_array) {
+               zval_dtor(rs_array);
+               array_init(rs_array);
+       }
+
+       if ((rs = http_negotiate_z(value, Z_ARRVAL_P(supported), http_negotiate_default_func))) {
+               HTTP_DO_NEGOTIATE_HANDLE_RESULT(rs, supported, rs_array);
+       } else {
+               HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array);
+       }
+}
+/* }}} */
+
 /* {{{ proto bool http_send_status(int status)
        Send HTTP status code. */
 PHP_FUNCTION(http_send_status)