From: Michael Wallner Date: Mon, 26 Dec 2005 21:15:05 +0000 (+0000) Subject: - add HttpDeflateStream and HttpInflateStream objects X-Git-Tag: RELEASE_0_21_0~27 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=b2e9ffe535660f5de2ec850ddc0dd6e99a34724d;p=m6w6%2Fext-http - add HttpDeflateStream and HttpInflateStream objects --- diff --git a/config.m4 b/config.m4 index 7ff9a6b..fb991ef 100644 --- a/config.m4 +++ b/config.m4 @@ -232,7 +232,8 @@ dnl ---- http_api.c http_cache_api.c http_request_api.c http_date_api.c \ http_headers_api.c http_message_api.c http_send_api.c http_url_api.c \ http_info_api.c http_request_method_api.c http_encoding_api.c \ - http_filter_api.c http_request_body_api.c" + http_filter_api.c http_request_body_api.c \ + http_deflatestream_object.c http_inflatestream_object.c" PHP_NEW_EXTENSION([http], $PHP_HTTP_SOURCES, $ext_shared) PHP_ADD_BUILD_DIR($ext_builddir/phpstr, 1) PHP_SUBST([HTTP_SHARED_LIBADD]) @@ -242,7 +243,8 @@ dnl ---- php_http_request_api.h php_http_request_method_api.h php_http_send_api.h php_http_url_api.h \ php_http_encoding_api.h phpstr/phpstr.h missing.h php_http_request_body_api.h \ php_http_exception_object.h php_http_message_object.h php_http_request_object.h \ - php_http_requestpool_object.h php_http_response_object.h php_http_util_object.h" + php_http_requestpool_object.h php_http_response_object.h php_http_util_object.h \ + php_http_deflatestream_object.h php_http_inflatestream_object.h" ifdef([PHP_INSTALL_HEADERS], [ PHP_INSTALL_HEADERS(ext/http, $PHP_HTTP_HEADERS) ], [ diff --git a/config.w32 b/config.w32 index 7db93da..64cecdc 100644 --- a/config.w32 +++ b/config.w32 @@ -54,7 +54,8 @@ if (PHP_HTTP != "no") { "http_request_api.c http_date_api.c http_headers_api.c "+ "http_message_api.c http_send_api.c http_url_api.c "+ "http_info_api.c http_request_method_api.c http_encoding_api.c "+ - "http_filter_api.c http_request_body_api.c", + "http_filter_api.c http_request_body_api.c "+ + "http_deflatestream_object.c http_inflatestream_object.c", null, "/I\"" + configure_module_dirname + "/phpstr\""); ADD_SOURCES(configure_module_dirname + "/phpstr", "phpstr.c", "http"); diff --git a/http.c b/http.c index 2cc8385..14b25bc 100644 --- a/http.c +++ b/http.c @@ -50,6 +50,10 @@ # include "php_http_request_object.h" # include "php_http_requestpool_object.h" # endif +# ifdef HTTP_HAVE_ZLIB +# include "php_http_deflatestream_object.h" +# include "php_http_inflatestream_object.h" +# endif # include "php_http_exception_object.h" #endif @@ -212,9 +216,9 @@ PHP_INI_BEGIN() #endif HTTP_PHP_INI_ENTRY("http.force_exit", "1", PHP_INI_ALL, OnUpdateBool, force_exit) #ifdef HTTP_HAVE_ZLIB - HTTP_PHP_INI_ENTRY("http.ob_inflate_auto", "0", PHP_INI_PERDIR, OnUpdateBool, send.inflate.start_auto) + HTTP_PHP_INI_ENTRY("http.ob_inflate_auto", "0", PHP_INI_ALL, OnUpdateBool, send.inflate.start_auto) HTTP_PHP_INI_ENTRY("http.ob_inflate_flags", "0", PHP_INI_ALL, OnUpdateLong, send.inflate.start_flags) - HTTP_PHP_INI_ENTRY("http.ob_deflate_auto", "0", PHP_INI_PERDIR, OnUpdateBool, send.deflate.start_auto) + HTTP_PHP_INI_ENTRY("http.ob_deflate_auto", "0", PHP_INI_ALL, OnUpdateBool, send.deflate.start_auto) HTTP_PHP_INI_ENTRY("http.ob_deflate_flags", "0", PHP_INI_ALL, OnUpdateLong, send.deflate.start_flags) #endif PHP_INI_END() @@ -252,6 +256,10 @@ PHP_MINIT_FUNCTION(http) (SUCCESS != PHP_MINIT_CALL(http_request_object)) || (SUCCESS != PHP_MINIT_CALL(http_requestpool_object))|| # endif /* HTTP_HAVE_CURL */ +# ifdef HTTP_HAVE_ZLIB + (SUCCESS != PHP_MINIT_CALL(http_deflatestream_object)) || + (SUCCESS != PHP_MINIT_CALL(http_inflatestream_object)) || +# endif /* HTTP_HAVE_ZLIB */ (SUCCESS != PHP_MINIT_CALL(http_exception_object))) { return FAILURE; } diff --git a/http_deflatestream_object.c b/http_deflatestream_object.c new file mode 100644 index 0000000..4060ba4 --- /dev/null +++ b/http_deflatestream_object.c @@ -0,0 +1,232 @@ +/* + +--------------------------------------------------------------------+ + | PECL :: http | + +--------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted provided that the conditions mentioned | + | in the accompanying LICENSE file are met. | + +--------------------------------------------------------------------+ + | Copyright (c) 2004-2005, Michael Wallner | + +--------------------------------------------------------------------+ +*/ + +/* $Id$ */ + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#define HTTP_WANT_ZLIB +#include "php_http.h" + +#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_ZLIB) + +#include "php_http_api.h" +#include "php_http_encoding_api.h" +#include "php_http_exception_object.h" +#include "php_http_deflatestream_object.h" + +#define HTTP_BEGIN_ARGS(method, ret_ref, req_args) HTTP_BEGIN_ARGS_EX(HttpDeflateStream, method, ret_ref, req_args) +#define HTTP_EMPTY_ARGS(method, ret_ref) HTTP_EMPTY_ARGS_EX(HttpDeflateStream, method, ret_ref) +#define HTTP_DEFLATE_ME(method, visibility) PHP_ME(HttpDeflateStream, method, HTTP_ARGS(HttpDeflateStream, method), visibility) + +HTTP_BEGIN_ARGS(__construct, 0, 0) + HTTP_ARG_VAL(flags, 0) +HTTP_END_ARGS; + +HTTP_BEGIN_ARGS(update, 0, 1) + HTTP_ARG_VAL(data, 0) +HTTP_END_ARGS; + +HTTP_EMPTY_ARGS(finish, 0); + +#define http_deflatestream_object_declare_default_properties() _http_deflatestream_object_declare_default_properties(TSRMLS_C) +static inline void _http_deflatestream_object_declare_default_properties(TSRMLS_D); + +zend_class_entry *http_deflatestream_object_ce; +zend_function_entry http_deflatestream_object_fe[] = { + HTTP_DEFLATE_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) + HTTP_DEFLATE_ME(update, ZEND_ACC_PUBLIC) + HTTP_DEFLATE_ME(finish, ZEND_ACC_PUBLIC) + + EMPTY_FUNCTION_ENTRY +}; +static zend_object_handlers http_deflatestream_object_handlers; + +PHP_MINIT_FUNCTION(http_deflatestream_object) +{ + HTTP_REGISTER_CLASS_EX(HttpDeflateStream, http_deflatestream_object, NULL, 0); + http_deflatestream_object_handlers.clone_obj = _http_deflatestream_object_clone_obj; + return SUCCESS; +} + +zend_object_value _http_deflatestream_object_new(zend_class_entry *ce TSRMLS_DC) +{ + return http_deflatestream_object_new_ex(ce, NULL, NULL); +} + +zend_object_value _http_deflatestream_object_new_ex(zend_class_entry *ce, http_encoding_stream *s, http_deflatestream_object **ptr TSRMLS_DC) +{ + zend_object_value ov; + http_deflatestream_object *o; + + o = ecalloc(1, sizeof(http_deflatestream_object)); + o->zo.ce = ce; + + if (ptr) { + *ptr = o; + } + + if (s) { + o->stream = s; + } + + ALLOC_HASHTABLE(OBJ_PROP(o)); + zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0); + + ov.handle = putObject(http_deflatestream_object, o); + ov.handlers = &http_deflatestream_object_handlers; + + return ov; +} + +zend_object_value _http_deflatestream_object_clone_obj(zval *this_ptr TSRMLS_DC) +{ + http_encoding_stream *s; + getObject(http_deflatestream_object, obj); + + s = ecalloc(1, sizeof(http_encoding_stream)); + s->flags = obj->stream->flags; + deflateCopy(&s->stream, &obj->stream->stream); + s->stream.opaque = phpstr_dup(s->stream.opaque); + + return http_deflatestream_object_new_ex(Z_OBJCE_P(this_ptr), s, NULL); +} + +static inline void _http_deflatestream_object_declare_default_properties(TSRMLS_D) +{ + zend_class_entry *ce = http_deflatestream_object_ce; + +#ifndef WONKY + DCL_CONST(long, "TYPE_GZIP", HTTP_DEFLATE_TYPE_GZIP); + DCL_CONST(long, "TYPE_ZLIB", HTTP_DEFLATE_TYPE_ZLIB); + DCL_CONST(long, "TYPE_RAW", HTTP_DEFLATE_TYPE_RAW); + DCL_CONST(long, "LEVEL_DEF", HTTP_DEFLATE_LEVEL_DEF); + DCL_CONST(long, "LEVEL_MIN", HTTP_DEFLATE_LEVEL_MIN); + DCL_CONST(long, "LEVEL_MAX", HTTP_DEFLATE_LEVEL_MAX); +#endif +} + +void _http_deflatestream_object_free(zend_object *object TSRMLS_DC) +{ + http_deflatestream_object *o = (http_deflatestream_object *) object; + + if (OBJ_PROP(o)) { + zend_hash_destroy(OBJ_PROP(o)); + FREE_HASHTABLE(OBJ_PROP(o)); + } + if (o->stream) { + http_encoding_deflate_stream_free(&o->stream); + } + efree(o); +} + +/* {{{ proto void HttpDeflateStream::__construct([int flags = 0]) + * + * Creates a new HttpDeflateStream object instance. + * + * Accepts an optional int parameter specifying how to initialize the deflate stream. + */ +PHP_METHOD(HttpDeflateStream, __construct) +{ + long flags = 0; + + SET_EH_THROW_HTTP(); + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &flags)) { + getObject(http_deflatestream_object, obj); + + if (!obj->stream) { + obj->stream = http_encoding_deflate_stream_init(NULL, flags); + } else { + http_error_ex(HE_WARNING, HTTP_E_ENCODING, "HttpDeflateStream cannot be initialized twice"); + } + } + SET_EH_NORMAL(); +} +/* }}} */ + +/* {{{ proto string HttpDeflateStream::update(string data) + * + * Passes more data through the deflate stream. + * + * Expects a string parameter containing (a part of) the data to deflate. + * + * Returns deflated data on success or FALSE on failure. + */ +PHP_METHOD(HttpDeflateStream, update) +{ + int data_len; + size_t encoded_len = 0; + char *data, *encoded = NULL; + getObject(http_deflatestream_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len)) { + RETURN_FALSE; + } + + if (!obj->stream) { + if (!(obj->stream = http_encoding_deflate_stream_init(NULL, 0))) { + RETURN_FALSE; + } + } + + if (SUCCESS == http_encoding_deflate_stream_update(obj->stream, data, data_len, &encoded, &encoded_len)) { + RETURN_STRINGL(encoded, encoded_len, 0); + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto string HttpDeflateStream::finish() + * + * Finalizes the deflate stream. The deflate stream can be reused after finalizing. + * + * Returns the final part of deflated data. + */ +PHP_METHOD(HttpDeflateStream, finish) +{ + size_t encoded_len = 0; + char *encoded = NULL; + getObject(http_deflatestream_object, obj); + + NO_ARGS; + + if (!obj->stream) { + RETURN_FALSE; + } + + if (SUCCESS == http_encoding_deflate_stream_finish(obj->stream, &encoded, &encoded_len)) { + RETVAL_STRINGL(encoded, encoded_len, 0); + } else { + RETVAL_FALSE; + } + + http_encoding_deflate_stream_dtor(obj->stream); + http_encoding_deflate_stream_init(obj->stream, obj->stream->flags); +} +/* }}} */ + + +#endif /* ZEND_ENGINE_2 && HTTP_HAVE_ZLIB*/ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ + diff --git a/http_inflatestream_object.c b/http_inflatestream_object.c new file mode 100644 index 0000000..b89a77b --- /dev/null +++ b/http_inflatestream_object.c @@ -0,0 +1,195 @@ +/* + +--------------------------------------------------------------------+ + | PECL :: http | + +--------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted provided that the conditions mentioned | + | in the accompanying LICENSE file are met. | + +--------------------------------------------------------------------+ + | Copyright (c) 2004-2005, Michael Wallner | + +--------------------------------------------------------------------+ +*/ + +/* $Id$ */ + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#define HTTP_WANT_ZLIB +#include "php_http.h" + +#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_ZLIB) + +#include "php_http_api.h" +#include "php_http_encoding_api.h" +#include "php_http_exception_object.h" +#include "php_http_inflatestream_object.h" + +#define HTTP_BEGIN_ARGS(method, ret_ref, req_args) HTTP_BEGIN_ARGS_EX(HttpInflateStream, method, ret_ref, req_args) +#define HTTP_EMPTY_ARGS(method, ret_ref) HTTP_EMPTY_ARGS_EX(HttpInflateStream, method, ret_ref) +#define HTTP_INFLATE_ME(method, visibility) PHP_ME(HttpInflateStream, method, HTTP_ARGS(HttpInflateStream, method), visibility) + +HTTP_BEGIN_ARGS(__construct, 0, 0) + HTTP_ARG_VAL(flags, 0) +HTTP_END_ARGS; + +HTTP_BEGIN_ARGS(update, 0, 1) + HTTP_ARG_VAL(data, 0) +HTTP_END_ARGS; + +HTTP_EMPTY_ARGS(finish, 0); + +zend_class_entry *http_inflatestream_object_ce; +zend_function_entry http_inflatestream_object_fe[] = { + HTTP_INFLATE_ME(update, ZEND_ACC_PUBLIC) + HTTP_INFLATE_ME(finish, ZEND_ACC_PUBLIC) + + EMPTY_FUNCTION_ENTRY +}; +static zend_object_handlers http_inflatestream_object_handlers; + +static inline void http_inflatestream_object_declare_default_properties() { return; } + +PHP_MINIT_FUNCTION(http_inflatestream_object) +{ + HTTP_REGISTER_CLASS_EX(HttpInflateStream, http_inflatestream_object, NULL, 0); + http_inflatestream_object_handlers.clone_obj = _http_inflatestream_object_clone_obj; + return SUCCESS; +} + +zend_object_value _http_inflatestream_object_new(zend_class_entry *ce TSRMLS_DC) +{ + return http_inflatestream_object_new_ex(ce, NULL, NULL); +} + +zend_object_value _http_inflatestream_object_new_ex(zend_class_entry *ce, http_encoding_stream *s, http_inflatestream_object **ptr TSRMLS_DC) +{ + zend_object_value ov; + http_inflatestream_object *o; + + o = ecalloc(1, sizeof(http_inflatestream_object)); + o->zo.ce = ce; + + if (ptr) { + *ptr = o; + } + + if (s) { + o->stream = s; + } + + ALLOC_HASHTABLE(OBJ_PROP(o)); + zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0); + + ov.handle = putObject(http_inflatestream_object, o); + ov.handlers = &http_inflatestream_object_handlers; + + return ov; +} + +zend_object_value _http_inflatestream_object_clone_obj(zval *this_ptr TSRMLS_DC) +{ + http_encoding_stream *s; + getObject(http_inflatestream_object, obj); + + s = ecalloc(1, sizeof(http_encoding_stream)); + s->flags = obj->stream->flags; + inflateCopy(&s->stream, &obj->stream->stream); + s->stream.opaque = phpstr_dup(s->stream.opaque); + + return http_inflatestream_object_new_ex(Z_OBJCE_P(this_ptr), s, NULL); +} + +void _http_inflatestream_object_free(zend_object *object TSRMLS_DC) +{ + http_inflatestream_object *o = (http_inflatestream_object *) object; + + if (OBJ_PROP(o)) { + zend_hash_destroy(OBJ_PROP(o)); + FREE_HASHTABLE(OBJ_PROP(o)); + } + if (o->stream) { + http_encoding_inflate_stream_free(&o->stream); + } + efree(o); +} + +/* {{{ proto string HttpInflateStream::update(string data) + * + * Passes more data through the inflate stream. + * + * Expects a string parameter containing (a part of) the data to inflate. + * + * Returns inflated data on success or FALSE on failure. + */ +PHP_METHOD(HttpInflateStream, update) +{ + int data_len; + size_t decoded_len = 0; + char *data, *decoded = NULL; + getObject(http_inflatestream_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len)) { + RETURN_FALSE; + } + + if (!data_len) { + RETURN_STRING("", 1); + } + + if (!obj->stream) { + if (!(obj->stream = http_encoding_inflate_stream_init(NULL, 0))) { + RETURN_FALSE; + } + } + if (SUCCESS == http_encoding_inflate_stream_update(obj->stream, data, data_len, &decoded, &decoded_len)) { + RETURN_STRINGL(decoded, decoded_len, 0); + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto string HttpInflateStream::finish() + * + * Finalizes the inflate stream. The inflate stream can be reused after finalizing. + * + * Returns the final part of inflated data. + */ +PHP_METHOD(HttpInflateStream, finish) +{ + size_t decoded_len = 0; + char *decoded = NULL; + getObject(http_inflatestream_object, obj); + + NO_ARGS; + + if (!obj->stream) { + RETURN_FALSE; + } + + if (SUCCESS == http_encoding_inflate_stream_finish(obj->stream, &decoded, &decoded_len)) { + RETVAL_STRINGL(decoded, decoded_len, 0); + } else { + RETVAL_FALSE; + } + + http_encoding_inflate_stream_dtor(obj->stream); + http_encoding_inflate_stream_init(obj->stream, obj->stream->flags); +} +/* }}} */ + + +#endif /* ZEND_ENGINE_2 && HTTP_HAVE_ZLIB*/ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ + diff --git a/php_http_deflatestream_object.h b/php_http_deflatestream_object.h new file mode 100644 index 0000000..5a274a8 --- /dev/null +++ b/php_http_deflatestream_object.h @@ -0,0 +1,53 @@ +/* + +--------------------------------------------------------------------+ + | PECL :: http | + +--------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted provided that the conditions mentioned | + | in the accompanying LICENSE file are met. | + +--------------------------------------------------------------------+ + | Copyright (c) 2004-2005, Michael Wallner | + +--------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#ifndef PHP_HTTP_DEFLATESTREAM_OBJECT_H +#define PHP_HTTP_DEFLATESTREAM_OBJECT_H +#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_ZLIB) + +typedef struct { + zend_object zo; + http_encoding_stream *stream; +} http_deflatestream_object; + +extern zend_class_entry *http_deflatestream_object_ce; +extern zend_function_entry http_deflatestream_object_fe[]; + +extern PHP_MINIT_FUNCTION(http_deflatestream_object); + +#define http_deflatestream_object_new(ce) _http_deflatestream_object_new((ce) TSRMLS_CC) +extern zend_object_value _http_deflatestream_object_new(zend_class_entry *ce TSRMLS_DC); +#define http_deflatestream_object_new_ex(ce, s, ptr) _http_deflatestream_object_new_ex((ce), (s), (ptr) TSRMLS_CC) +extern zend_object_value _http_deflatestream_object_new_ex(zend_class_entry *ce, http_encoding_stream *s, http_deflatestream_object **ptr TSRMLS_DC); +#define http_deflatestream_object_clone(zobj) _http_deflatestream_object_clone_obj(zobj TSRMLS_CC) +extern zend_object_value _http_deflatestream_object_clone_obj(zval *object TSRMLS_DC); +#define http_deflatestream_object_free(o) _http_deflatestream_object_free((o) TSRMLS_CC) +extern void _http_deflatestream_object_free(zend_object *object TSRMLS_DC); + +PHP_METHOD(HttpDeflateStream, __construct); +PHP_METHOD(HttpDeflateStream, update); +PHP_METHOD(HttpDeflateStream, finish); + +#endif +#endif + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ + diff --git a/php_http_inflatestream_object.h b/php_http_inflatestream_object.h new file mode 100644 index 0000000..91da740 --- /dev/null +++ b/php_http_inflatestream_object.h @@ -0,0 +1,52 @@ +/* + +--------------------------------------------------------------------+ + | PECL :: http | + +--------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted provided that the conditions mentioned | + | in the accompanying LICENSE file are met. | + +--------------------------------------------------------------------+ + | Copyright (c) 2004-2005, Michael Wallner | + +--------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#ifndef PHP_HTTP_INFLATESTREAM_OBJECT_H +#define PHP_HTTP_INFLATESTREAM_OBJECT_H +#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_ZLIB) + +typedef struct { + zend_object zo; + http_encoding_stream *stream; +} http_inflatestream_object; + +extern zend_class_entry *http_inflatestream_object_ce; +extern zend_function_entry http_inflatestream_object_fe[]; + +extern PHP_MINIT_FUNCTION(http_inflatestream_object); + +#define http_inflatestream_object_new(ce) _http_inflatestream_object_new((ce) TSRMLS_CC) +extern zend_object_value _http_inflatestream_object_new(zend_class_entry *ce TSRMLS_DC); +#define http_inflatestream_object_new_ex(ce, s, ptr) _http_inflatestream_object_new_ex((ce), (s), (ptr) TSRMLS_CC) +extern zend_object_value _http_inflatestream_object_new_ex(zend_class_entry *ce, http_encoding_stream *s, http_inflatestream_object **ptr TSRMLS_DC); +#define http_inflatestream_object_clone(zobj) _http_inflatestream_object_clone_obj(zobj TSRMLS_CC) +extern zend_object_value _http_inflatestream_object_clone_obj(zval *object TSRMLS_DC); +#define http_inflatestream_object_free(o) _http_inflatestream_object_free((o) TSRMLS_CC) +extern void _http_inflatestream_object_free(zend_object *object TSRMLS_DC); + +PHP_METHOD(HttpInflateStream, update); +PHP_METHOD(HttpInflateStream, finish); + +#endif +#endif + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ + diff --git a/tests/encoding_objects_001.phpt b/tests/encoding_objects_001.phpt new file mode 100644 index 0000000..d9cf992 --- /dev/null +++ b/tests/encoding_objects_001.phpt @@ -0,0 +1,24 @@ +--TEST-- +encoding stream objects +--SKIPIF-- + +--FILE-- +update($d->update("Hi ")); +echo $i->update($d->update("there!\n")); +echo $i->update($d->finish()); +echo $i->finish(); +echo "Done\n"; +?> +--EXPECTF-- +%sTEST +Hi there! +Done +