use the new params parser
[m6w6/ext-http] / php_http_env.c
index 511b878efbe134543e7791ea13c616c0d74447d5..8cdbb73e198072edc4b7f43e8854665fdbe2f48f 100644 (file)
@@ -6,12 +6,10 @@
     | modification, are permitted provided that the conditions mentioned |
     | in the accompanying LICENSE file are met.                          |
     +--------------------------------------------------------------------+
-    | Copyright (c) 2004-2010, Michael Wallner <mike@php.net>            |
+    | Copyright (c) 2004-2011, Michael Wallner <mike@php.net>            |
     +--------------------------------------------------------------------+
 */
 
-/* $Id $ */
-
 #include "php_http.h"
 
 #include <main/SAPI.h>
@@ -62,7 +60,7 @@ PHP_HTTP_API void php_http_env_get_request_headers(HashTable *headers TSRMLS_DC)
 
                                        zend_hash_get_current_data_ex(Z_ARRVAL_PP(hsv), (void *) &header, &pos);
                                        Z_ADDREF_P(*header);
-                                       zend_hash_add(PHP_HTTP_G->env.request.headers, key.str, key.len, (void *) header, sizeof(zval *), NULL);
+                                       zend_symtable_update(PHP_HTTP_G->env.request.headers, key.str, key.len, (void *) header, sizeof(zval *), NULL);
 
                                        efree(key.str);
                                }
@@ -82,7 +80,7 @@ PHP_HTTP_API char *php_http_env_get_request_header(const char *name_str, size_t
 
        php_http_env_get_request_headers(NULL TSRMLS_CC);
 
-       if (SUCCESS == zend_hash_find(PHP_HTTP_G->env.request.headers, key, name_len + 1, (void *) &zvalue)) {
+       if (SUCCESS == zend_symtable_find(PHP_HTTP_G->env.request.headers, key, name_len + 1, (void *) &zvalue)) {
                zval *zcopy = php_http_ztyp(IS_STRING, *zvalue);
 
                val = estrndup(Z_STRVAL_P(zcopy), Z_STRLEN_P(zcopy));
@@ -100,7 +98,7 @@ PHP_HTTP_API int php_http_env_got_request_header(const char *name_str, size_t na
        int got;
 
        php_http_env_get_request_headers(NULL TSRMLS_CC);
-       got = zend_hash_exists(PHP_HTTP_G->env.request.headers, key, name_len + 1);
+       got = zend_symtable_exists(PHP_HTTP_G->env.request.headers, key, name_len + 1);
        efree(key);
 
        return got;
@@ -129,7 +127,7 @@ PHP_HTTP_API zval *php_http_env_get_server_var(const char *key, size_t key_len,
        if ((SUCCESS != zend_hash_find(&EG(symbol_table), ZEND_STRS("_SERVER"), (void *) &hsv)) || (Z_TYPE_PP(hsv) != IS_ARRAY)) {
                return NULL;
        }
-       if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv), key, key_len + 1, (void *) &var))) {
+       if ((SUCCESS != zend_symtable_find(Z_ARRVAL_PP(hsv), key, key_len + 1, (void *) &var))) {
                return NULL;
        }
        if (check && !((Z_TYPE_PP(var) == IS_STRING) && Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) {
@@ -355,7 +353,7 @@ PHP_HTTP_API char *php_http_env_get_response_header(const char *name_str, size_t
                zval **zvalue;
                char *key = php_http_pretty_key(estrndup(name_str, name_len), name_len, 1, 1);
 
-               if (SUCCESS == zend_hash_find(&headers, key, name_len + 1, (void *) &zvalue)) {
+               if (SUCCESS == zend_symtable_find(&headers, key, name_len + 1, (void *) &zvalue)) {
                        zval *zcopy = php_http_ztyp(IS_STRING, *zvalue);
 
                        val = estrndup(Z_STRVAL_P(zcopy), Z_STRLEN_P(zcopy));
@@ -589,8 +587,9 @@ PHP_HTTP_BEGIN_ARGS(persistentHandlesClean, 0)
        PHP_HTTP_ARG_VAL(ident, 0)
 PHP_HTTP_END_ARGS;
 
-PHP_HTTP_BEGIN_ARGS(persistentHandlesIdent, 0)
-       PHP_HTTP_ARG_VAL(name, 0)
+PHP_HTTP_BEGIN_ARGS(parseParams, 1)
+       PHP_HTTP_ARG_VAL(params, 0)
+       PHP_HTTP_ARG_VAL(flags, 0)
 PHP_HTTP_END_ARGS;
 
 zend_function_entry php_http_env_method_entry[] = {
@@ -612,6 +611,8 @@ zend_function_entry php_http_env_method_entry[] = {
        PHP_HTTP_ENV_ME(persistentHandlesStat)
        PHP_HTTP_ENV_ME(persistentHandlesClean)
 
+       PHP_HTTP_ENV_ME(parseParams)
+
        EMPTY_FUNCTION_ENTRY
 };
 
@@ -766,7 +767,7 @@ PHP_METHOD(HttpEnv, setResponseCode)
 #define PHP_HTTP_DO_NEGOTIATE(type, supported, rs_array) \
        { \
                HashTable *result; \
-               if ((result = php_http_negotiate_ ##type(supported))) { \
+               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); \
@@ -834,7 +835,7 @@ PHP_METHOD(HttpEnv, negotiate)
                        array_init(rs_array);
                }
 
-               if ((rs = php_http_negotiate(value_str, supported, php_http_negotiate_default_func))) {
+               if ((rs = php_http_negotiate(value_str, supported, php_http_negotiate_default_func TSRMLS_CC))) {
                        PHP_HTTP_DO_NEGOTIATE_HANDLE_RESULT(rs, supported, rs_array);
                } else {
                        PHP_HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array);
@@ -847,7 +848,7 @@ PHP_METHOD(HttpEnv, persistentHandlesStat)
 {
        if (SUCCESS == zend_parse_parameters_none()) {
                object_init(return_value);
-               if (php_http_persistent_handle_statall(HASH_OF(return_value))) {
+               if (php_http_persistent_handle_statall(HASH_OF(return_value) TSRMLS_CC)) {
                        return;
                }
                zval_dtor(return_value);
@@ -865,6 +866,23 @@ PHP_METHOD(HttpEnv, persistentHandlesClean)
        }
 }
 
+PHP_METHOD(HttpEnv, parseParams)
+{
+       char *param_str;
+       int param_len;
+       long flags = PHP_HTTP_PARAMS_DEFAULT;
+
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &param_str, &param_len, &flags)) {
+               RETURN_FALSE;
+       }
+
+       array_init(return_value);
+       if (SUCCESS != php_http_params_parse(param_str, flags, php_http_params_parse_default_func, Z_ARRVAL_P(return_value) TSRMLS_CC)) {
+               zval_dtor(return_value);
+               RETURN_FALSE;
+       }
+}
+
 zend_class_entry *php_http_env_request_class_entry;
 
 #undef PHP_HTTP_BEGIN_ARGS
@@ -897,7 +915,14 @@ PHP_METHOD(HttpEnvRequest, __construct)
 PHP_MINIT_FUNCTION(http_env)
 {
        PHP_HTTP_REGISTER_CLASS(http, Env, http_env, NULL, 0);
-       PHP_HTTP_REGISTER_CLASS(http\\env, Request, http_env_request, php_http_message_class_entry, 0);
+
+       zend_declare_class_constant_long(php_http_env_class_entry, ZEND_STRL("PARAMS_ALLOW_COMMA"), PHP_HTTP_PARAMS_ALLOW_COMMA TSRMLS_CC);
+       zend_declare_class_constant_long(php_http_env_class_entry, ZEND_STRL("PARAMS_ALLOW_FAILURE"), PHP_HTTP_PARAMS_ALLOW_FAILURE TSRMLS_CC);
+       zend_declare_class_constant_long(php_http_env_class_entry, ZEND_STRL("PARAMS_RAISE_ERROR"), PHP_HTTP_PARAMS_RAISE_ERROR TSRMLS_CC);
+       zend_declare_class_constant_long(php_http_env_class_entry, ZEND_STRL("PARAMS_DEFAULT"), PHP_HTTP_PARAMS_DEFAULT TSRMLS_CC);
+       zend_declare_class_constant_long(php_http_env_class_entry, ZEND_STRL("PARAMS_COLON_SEPARATOR"), PHP_HTTP_PARAMS_COLON_SEPARATOR TSRMLS_CC);
+
+       PHP_HTTP_REGISTER_CLASS(http\\Env, Request, http_env_request, php_http_message_class_entry, 0);
 
        return SUCCESS;
 }