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) {
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;
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);
}
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();
}
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;