if (body_ptr && *body_ptr) {
body = *body_ptr;
- ++body->refcount;
+ php_http_message_body_addref(body);
return body;
}
body->refcount = 1;
if (stream) {
- php_stream_auto_cleanup(stream);
body->res = stream->res;
++GC_REFCOUNT(body->res);
} else {
stream = php_stream_temp_create(TEMP_STREAM_DEFAULT, 0xffff);
- php_stream_auto_cleanup(stream);
body->res = stream->res;
}
+ php_stream_auto_cleanup(stream);
if (body_ptr) {
*body_ptr = body;
php_http_message_body_t *body = *body_ptr;
if (!--body->refcount) {
- /* NOFIXME: shows leakinfo in DEBUG mode */
zend_list_delete(body->res);
PTR_FREE(body->boundary);
efree(body);
if (!body->boundary) {
union { double dbl; int num[2]; } data;
- data.dbl = php_combined_lcg(TSRMLS_C);
+ data.dbl = php_combined_lcg();
spprintf(&body->boundary, 0, "%x.%x", data.num[0], data.num[1]);
}
return body->boundary;
char *php_http_message_body_etag(php_http_message_body_t *body)
{
- const php_stream_statbuf *ssb = php_http_message_body_stat(body);
+ php_http_etag_t *etag;
+ php_stream *s = php_http_message_body_stream(body);
/* real file or temp buffer ? */
- if (ssb->sb.st_mtime) {
- char *etag;
+ if (s->ops != &php_stream_temp_ops && s->ops != &php_stream_memory_ops) {
+ php_stream_stat(php_http_message_body_stream(body), &body->ssb);
- spprintf(&etag, 0, "%lx-%lx-%lx", ssb->sb.st_ino, ssb->sb.st_mtime, ssb->sb.st_size);
- return etag;
- } else {
- php_http_etag_t *etag = php_http_etag_init(PHP_HTTP_G->env.etag_mode);
+ if (body->ssb.sb.st_mtime) {
+ char *etag;
- if (etag) {
- php_http_message_body_to_callback(body, (php_http_pass_callback_t) php_http_etag_update, etag, 0, 0);
- return php_http_etag_finish(etag);
- } else {
- return NULL;
+ spprintf(&etag, 0, "%lx-%lx-%lx", body->ssb.sb.st_ino, body->ssb.sb.st_mtime, body->ssb.sb.st_size);
+ return etag;
}
}
+
+ /* content based */
+ if ((etag = php_http_etag_init(PHP_HTTP_G->env.etag_mode))) {
+ php_http_message_body_to_callback(body, (php_http_pass_callback_t) php_http_etag_update, etag, 0, 0);
+ return php_http_etag_finish(etag);
+ }
+
+ return NULL;
}
zend_string *php_http_message_body_to_string(php_http_message_body_t *body, off_t offset, size_t forlen)
written = php_stream_write(s, buf, len);
if (written != len) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to append %zu bytes to body; wrote %zu", len, written);
+ php_error_docref(NULL, E_WARNING, "Failed to append %zu bytes to body; wrote %zu", len, written);
}
return len;
ZEND_RESULT_CODE php_http_message_body_add_form_field(php_http_message_body_t *body, const char *name, const char *value_str, size_t value_len)
{
- zend_string *safe_name;
+ zend_string *safe_name = zend_string_init(name, strlen(name), 0);
- safe_name = php_addslashes(estrdup(name), strlen(name), 1);
+ safe_name = php_addslashes(safe_name, 1);
BOUNDARY_OPEN(body);
php_http_message_body_appendf(
{
size_t path_len = strlen(path);
char *path_dup = estrndup(path, path_len);
- zend_string *safe_name, *base_name;
+ zend_string *base_name, *safe_name = zend_string_init(name, strlen(name), 0);
- safe_name = php_addslashes(estrdup(name), strlen(name), 1);
+ safe_name = php_addslashes(safe_name, 1);
base_name = php_basename(path_dup, path_len, NULL, 0);
BOUNDARY_OPEN(body);
if (!ZEND_HASH_GET_APPLY_COUNT(fields)) {
ZEND_HASH_INC_APPLY_COUNT(fields);
- ZEND_HASH_FOREACH_KEY_VAL(fields, key.h, key.key, val)
+ ZEND_HASH_FOREACH_KEY_VAL_IND(fields, key.h, key.key, val)
{
char *str = format_key(&key, name);
if (!ZEND_HASH_GET_APPLY_COUNT(files)) {
ZEND_HASH_INC_APPLY_COUNT(files);
- ZEND_HASH_FOREACH_KEY_VAL(files, key.h, key.key, val)
+ ZEND_HASH_FOREACH_KEY_VAL_IND(files, key.h, key.key, val)
{
if (Z_TYPE_P(val) == IS_ARRAY || Z_TYPE_P(val) == IS_OBJECT) {
char *str = format_key(&key, name);
{
php_http_message_body_object_t *o;
- o = ecalloc(1, sizeof(php_http_message_body_object_t) + (ce->default_properties_count - 1) * sizeof(zval));
+ o = ecalloc(1, sizeof(*o) + zend_object_properties_size(ce));
zend_object_std_init(&o->zo, php_http_message_body_class_entry);
object_properties_init(&o->zo, ce);
php_http_message_body_object_t *obj = PHP_HTTP_OBJ(object, NULL);
php_http_message_body_free(&obj->body);
- zend_object_std_dtor(object TSRMLS_CC);
+ zend_object_std_dtor(object);
}
#define PHP_HTTP_MESSAGE_BODY_OBJECT_INIT(obj) \
php_http_message_body_to_callback(obj->body, php_http_pass_fcall_callback, &fcd, offset, forlen);
zend_fcall_info_args_clear(&fcd.fci, 1);
zval_ptr_dtor(&fcd.fcz);
- RETURN_ZVAL_FAST(getThis());
+ RETURN_ZVAL(getThis(), 1, 0);
}
}
php_http_expect(len == php_http_message_body_append(obj->body, str, len), runtime, return);
- RETURN_ZVAL_FAST(getThis());
+ RETURN_ZVAL(getThis(), 1, 0);
}
ZEND_BEGIN_ARG_INFO_EX(ai_HttpMessageBody_addForm, 0, 0, 0)
php_http_expect(SUCCESS == php_http_message_body_add_form(obj->body, fields, files), runtime, return);
- RETURN_ZVAL_FAST(getThis());
+ RETURN_ZVAL(getThis(), 1, 0);
}
ZEND_BEGIN_ARG_INFO_EX(ai_HttpMessageBody_addPart, 0, 0, 1)
zend_restore_error_handling(&zeh);
if (!EG(exception)) {
- RETURN_ZVAL_FAST(getThis());
+ RETURN_ZVAL(getThis(), 1, 0);
}
}
char *field_str = NULL;
size_t field_len = 0;
- if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &field_str, &field_len)) {
+ if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &field_str, &field_len)) {
php_http_message_body_object_t *obj = PHP_HTTP_OBJ(NULL, getThis());
const php_stream_statbuf *sb;
php_http_message_body_class_entry = zend_register_internal_class(&ce);
php_http_message_body_class_entry->create_object = php_http_message_body_object_new;
memcpy(&php_http_message_body_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ php_http_message_body_object_handlers.offset = XtOffsetOf(php_http_message_body_object_t, zo);
php_http_message_body_object_handlers.clone_obj = php_http_message_body_object_clone;
php_http_message_body_object_handlers.free_obj = php_http_message_body_object_free;
zend_class_implements(php_http_message_body_class_entry, 1, zend_ce_serializable);