split off property proxy
[m6w6/ext-http] / php_http_env_response.c
index 53af327c076ffc59c7991e36c4540f7538900c4f..66f4782d5135dd7b91c85b739ad30413d5df7908 100644 (file)
 static void set_option(zval *options, const char *name_str, size_t name_len, int type, void *value_ptr, size_t value_len TSRMLS_DC)
 {
        if (Z_TYPE_P(options) == IS_OBJECT) {
-               /* stupid non-const api */
-               char *name = estrndup(name_str, name_len);
                if (value_ptr) {
                        switch (type) {
                                case IS_DOUBLE:
-                                       zend_update_property_double(Z_OBJCE_P(options), options, name, name_len, *(double *)value_ptr TSRMLS_CC);
+                                       zend_update_property_double(Z_OBJCE_P(options), options, name_str, name_len, *(double *)value_ptr TSRMLS_CC);
                                        break;
                                case IS_LONG:
-                                       zend_update_property_long(Z_OBJCE_P(options), options, name, name_len, *(long *)value_ptr TSRMLS_CC);
+                                       zend_update_property_long(Z_OBJCE_P(options), options, name_str, name_len, *(long *)value_ptr TSRMLS_CC);
                                        break;
                                case IS_STRING:
-                                       zend_update_property_stringl(Z_OBJCE_P(options), options, name, name_len, value_ptr, value_len TSRMLS_CC);
+                                       zend_update_property_stringl(Z_OBJCE_P(options), options, name_str, name_len, value_ptr, value_len TSRMLS_CC);
                                        break;
                                case IS_OBJECT:
-                                       zend_update_property(Z_OBJCE_P(options), options, name, name_len, value_ptr TSRMLS_CC);
+                                       zend_update_property(Z_OBJCE_P(options), options, name_str, name_len, value_ptr TSRMLS_CC);
                                        break;
                        }
                } else {
-                       zend_update_property_null(Z_OBJCE_P(options), options, name, name_len TSRMLS_CC);
+                       zend_update_property_null(Z_OBJCE_P(options), options, name_str, name_len TSRMLS_CC);
                }
-               efree(name);
        } else {
                convert_to_array(options);
                if (value_ptr) {
@@ -66,9 +63,7 @@ static zval *get_option(zval *options, const char *name_str, size_t name_len TSR
        zval *val, **valptr;
 
        if (Z_TYPE_P(options) == IS_OBJECT) {
-               char *name = estrndup(name_str, name_len);
-               val = zend_read_property(Z_OBJCE_P(options), options, name, name_len, 0 TSRMLS_CC);
-               efree(name);
+               val = zend_read_property(Z_OBJCE_P(options), options, name_str, name_len, 0 TSRMLS_CC);
        } else {
                if (SUCCESS == zend_symtable_find(Z_ARRVAL_P(options), name_str, name_len + 1, (void *) &valptr)) {
                        val = *valptr;
@@ -1134,17 +1129,24 @@ static zend_function_entry php_http_env_response_method_entry[] = {
        EMPTY_FUNCTION_ENTRY
 };
 
+#define PHP_HTTP_ENV_RESPONSE_OBJECT_INIT(obj) \
+       do { \
+               if (!obj->message) { \
+                       obj->message = php_http_message_init_env(NULL, PHP_HTTP_RESPONSE TSRMLS_CC); \
+               } \
+       } while (0)
 
 PHP_METHOD(HttpEnvResponse, __construct)
 {
        with_error_handling(EH_THROW, php_http_exception_get_class_entry()) {
-               if (SUCCESS == zend_parse_parameters_none()) {
-                       php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
+               php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
 
+               if (SUCCESS == zend_parse_parameters_none()) {
                        with_error_handling(EH_THROW, php_http_exception_get_class_entry()) {
                                obj->message = php_http_message_init_env(obj->message, PHP_HTTP_RESPONSE TSRMLS_CC);
                        } end_error_handling();
                }
+               PHP_HTTP_ENV_RESPONSE_OBJECT_INIT(obj);
        } end_error_handling();
 
 }
@@ -1158,6 +1160,8 @@ PHP_METHOD(HttpEnvResponse, __invoke)
        if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &ob_str, &ob_len, &ob_flags)) {
                php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
 
+               PHP_HTTP_ENV_RESPONSE_OBJECT_INIT(obj);
+
                if (obj->body.handle || SUCCESS == php_http_new(&obj->body, php_http_message_body_get_class_entry(), (php_http_new_t) php_http_message_body_object_new_ex, NULL, (void *) php_http_message_body_init(&obj->message->body, NULL TSRMLS_CC), NULL TSRMLS_CC)) {
                        php_http_message_body_append(obj->message->body, ob_str, ob_len);
                        RETURN_TRUE;