X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_env_response.c;h=66f4782d5135dd7b91c85b739ad30413d5df7908;hp=2f75eca9e71f95833ff6807e3e79fb3282962353;hb=8191c55421fb6ecc86185608a8b0510da1525e1e;hpb=6f61c56b9d16c4fd68e388e629cc5a9248fe8281 diff --git a/php_http_env_response.c b/php_http_env_response.c index 2f75eca..66f4782 100644 --- a/php_http_env_response.c +++ b/php_http_env_response.c @@ -15,27 +15,24 @@ 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; @@ -363,7 +358,7 @@ static STATUS php_http_env_response_send_head(php_http_env_response_t *r, php_ht if ((zoption = get_option(options, ZEND_STRL("headers") TSRMLS_CC))) { if (Z_TYPE_P(zoption) == IS_ARRAY) { - php_http_headers_to_callback(Z_ARRVAL_P(zoption), 0, r->ops->set_header, r TSRMLS_CC); + php_http_headers_to_callback(Z_ARRVAL_P(zoption), 0, (php_http_pass_format_callback_t) r->ops->set_header, r TSRMLS_CC); } zval_ptr_dtor(&zoption); } @@ -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,8 +1160,10 @@ 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); - 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_copy(&obj->message->body, NULL, 0), NULL TSRMLS_CC)) { - php_http_message_body_append(&obj->message->body, ob_str, ob_len); + 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; } RETURN_FALSE;