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])
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)
], [
"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");
# 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
#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()
(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;
}
--- /dev/null
+/*
+ +--------------------------------------------------------------------+
+ | 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 <mike@php.net> |
+ +--------------------------------------------------------------------+
+*/
+
+/* $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
+ */
+
--- /dev/null
+/*
+ +--------------------------------------------------------------------+
+ | 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 <mike@php.net> |
+ +--------------------------------------------------------------------+
+*/
+
+/* $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
+ */
+
--- /dev/null
+/*
+ +--------------------------------------------------------------------+
+ | 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 <mike@php.net> |
+ +--------------------------------------------------------------------+
+*/
+
+/* $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
+ */
+
--- /dev/null
+/*
+ +--------------------------------------------------------------------+
+ | 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 <mike@php.net> |
+ +--------------------------------------------------------------------+
+*/
+
+/* $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
+ */
+
--- /dev/null
+--TEST--
+encoding stream objects
+--SKIPIF--
+<?php
+include 'skip.inc';
+checkver(5);
+skipif(!http_support(HTTP_SUPPORT_ENCODINGS), "need zlib");
+?>
+--FILE--
+<?php
+echo "-TEST\n";
+$d = new HttpDeflateStream;
+$i = new HttpInflateStream;
+echo $i->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
+