X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_message_body.c;h=22179e413a52555f11c04a3af1286a2c739cfdd3;hp=3ecd89536a9290740304a4fbeefb98b2adda2de4;hb=b4085b7b9a6b51fd893dc7fc263f49ff570c90bb;hpb=d8beb35c8d7194ef1688cfd8dd6ed40ec8e31464 diff --git a/php_http_message_body.c b/php_http_message_body.c index 3ecd895..22179e4 100644 --- a/php_http_message_body.c +++ b/php_http_message_body.c @@ -45,14 +45,13 @@ php_http_message_body_t *php_http_message_body_init(php_http_message_body_t **bo 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; @@ -94,8 +93,7 @@ void php_http_message_body_free(php_http_message_body_t **body_ptr) php_http_message_body_t *body = *body_ptr; if (!--body->refcount) { - /* NOFIXME: shows leakinfo in DEBUG mode */ - zend_list_delete(body->res); + //zend_list_close(body->res); PTR_FREE(body->boundary); efree(body); } @@ -114,7 +112,7 @@ const char *php_http_message_body_boundary(php_http_message_body_t *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; @@ -122,24 +120,28 @@ const char *php_http_message_body_boundary(php_http_message_body_t *body) 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) @@ -213,7 +215,7 @@ size_t php_http_message_body_append(php_http_message_body_t *body, const char *b 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; @@ -261,9 +263,9 @@ void php_http_message_body_add_part(php_http_message_body_t *body, php_http_mess 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( @@ -283,9 +285,9 @@ ZEND_RESULT_CODE php_http_message_body_add_form_file(php_http_message_body_t *bo { 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); @@ -340,7 +342,7 @@ static ZEND_RESULT_CODE add_recursive_fields(php_http_message_body_t *body, cons 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); @@ -378,7 +380,7 @@ static ZEND_RESULT_CODE add_recursive_files(php_http_message_body_t *body, const 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); @@ -555,7 +557,7 @@ php_http_message_body_object_t *php_http_message_body_object_new_ex(zend_class_e { 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); @@ -585,7 +587,7 @@ void php_http_message_body_object_free(zend_object *object) 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) \ @@ -814,7 +816,7 @@ PHP_METHOD(HttpMessageBody, stat) 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; @@ -882,6 +884,7 @@ PHP_MINIT_FUNCTION(http_message_body) 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);