negotiation test & fixes
[m6w6/ext-http] / php_http_env.c
index 789f42b7b84c0ded07280b71402a08aef71091fe..a0232d201e174141fb0061cf7e8a46040e137735 100644 (file)
@@ -575,6 +575,11 @@ PHP_HTTP_BEGIN_ARGS(negotiateCharset, 1)
        PHP_HTTP_ARG_VAL(result_array, 1)
 PHP_HTTP_END_ARGS;
 
+PHP_HTTP_BEGIN_ARGS(negotiateEncoding, 1)
+       PHP_HTTP_ARG_VAL(supported, 0)
+       PHP_HTTP_ARG_VAL(result_array, 1)
+PHP_HTTP_END_ARGS;
+
 PHP_HTTP_BEGIN_ARGS(negotiate, 2)
        PHP_HTTP_ARG_VAL(value, 0)
        PHP_HTTP_ARG_VAL(supported, 0)
@@ -602,6 +607,7 @@ zend_function_entry php_http_env_method_entry[] = {
 
        PHP_HTTP_ENV_ME(negotiateLanguage)
        PHP_HTTP_ENV_ME(negotiateContentType)
+       PHP_HTTP_ENV_ME(negotiateEncoding)
        PHP_HTTP_ENV_ME(negotiateCharset)
        PHP_HTTP_ENV_ME(negotiate)
 
@@ -662,8 +668,8 @@ PHP_METHOD(HttpEnv, getResponseStatusForCode)
 
 PHP_METHOD(HttpEnv, getResponseHeader)
 {
-       char *header_name_str;
-       int header_name_len;
+       char *header_name_str = NULL;
+       int header_name_len = 0;
 
        if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &header_name_str, &header_name_len)) {
                if (header_name_str && header_name_len) {
@@ -694,7 +700,7 @@ PHP_METHOD(HttpEnv, setResponseHeader)
 {
        char *header_name_str;
        int header_name_len;
-       zval *header_value;
+       zval *header_value = NULL;
        long code = 0;
        zend_bool replace_header = 1;
 
@@ -714,62 +720,6 @@ PHP_METHOD(HttpEnv, setResponseCode)
        RETURN_FALSE;
 }
 
-
-#define PHP_HTTP_DO_NEGOTIATE_DEFAULT(supported) \
-       { \
-               zval **value; \
-                \
-               zend_hash_internal_pointer_reset((supported)); \
-               if (SUCCESS == zend_hash_get_current_data((supported), (void *) &value)) { \
-                       RETVAL_ZVAL(*value, 1, 0); \
-               } else { \
-                       RETVAL_NULL(); \
-               } \
-       }
-
-#define PHP_HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array) \
-       PHP_HTTP_DO_NEGOTIATE_DEFAULT(supported); \
-       if (rs_array) { \
-               HashPosition pos; \
-               zval **value_ptr; \
-                \
-               FOREACH_HASH_VAL(pos, supported, value_ptr) { \
-                       zval *value = php_http_ztyp(IS_STRING, *value_ptr); \
-                       add_assoc_double(rs_array, Z_STRVAL_P(value), 1.0); \
-                       zval_ptr_dtor(&value); \
-               } \
-       }
-
-#define PHP_HTTP_DO_NEGOTIATE_HANDLE_RESULT(result, supported, rs_array) \
-       { \
-               char *key; \
-               uint key_len; \
-               ulong idx; \
-                \
-               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 { \
-                       PHP_HTTP_DO_NEGOTIATE_DEFAULT(supported); \
-               } \
-               \
-               if (rs_array) { \
-                       zend_hash_copy(Z_ARRVAL_P(rs_array), result, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); \
-               } \
-               \
-               zend_hash_destroy(result); \
-               FREE_HASHTABLE(result); \
-       }
-
-#define PHP_HTTP_DO_NEGOTIATE(type, supported, rs_array) \
-       { \
-               HashTable *result; \
-               if ((result = php_http_negotiate_ ##type(supported TSRMLS_CC))) { \
-                       PHP_HTTP_DO_NEGOTIATE_HANDLE_RESULT(result, supported, rs_array); \
-               } else { \
-                       PHP_HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array); \
-               } \
-       }
-
 PHP_METHOD(HttpEnv, negotiateLanguage)
 {
        HashTable *supported;
@@ -803,6 +753,22 @@ PHP_METHOD(HttpEnv, negotiateCharset)
        }
 }
 
+PHP_METHOD(HttpEnv, negotiateEncoding)
+{
+       HashTable *supported;
+       zval *rs_array = NULL;
+
+       if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "H|z", &supported, &rs_array)) {
+               if (rs_array) {
+                       zval_dtor(rs_array);
+                       array_init(rs_array);
+               }
+               PHP_HTTP_DO_NEGOTIATE(encoding, supported, rs_array);
+       } else {
+               RETURN_FALSE;
+       }
+}
+
 PHP_METHOD(HttpEnv, negotiateContentType)
 {
        HashTable *supported;