- add HttpDeflateStream and HttpInflateStream objects
authorMichael Wallner <mike@php.net>
Mon, 26 Dec 2005 21:15:05 +0000 (21:15 +0000)
committerMichael Wallner <mike@php.net>
Mon, 26 Dec 2005 21:15:05 +0000 (21:15 +0000)
config.m4
config.w32
http.c
http_deflatestream_object.c [new file with mode: 0644]
http_inflatestream_object.c [new file with mode: 0644]
php_http_deflatestream_object.h [new file with mode: 0644]
php_http_inflatestream_object.h [new file with mode: 0644]
tests/encoding_objects_001.phpt [new file with mode: 0644]

index 7ff9a6b5f71252061084ad16dfc4bcc59e007bdf..fb991ef43b71b0cf57f84ab58557890eeb02fc8c 100644 (file)
--- 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_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_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_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)
        ], [
        ifdef([PHP_INSTALL_HEADERS], [
                PHP_INSTALL_HEADERS(ext/http, $PHP_HTTP_HEADERS)
        ], [
index 7db93da54e6daa0067fdcc6d311b53be64c2e163..64cecdcae1b9601548f219f4554d2388f02752e3 100644 (file)
@@ -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_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");
                null,
                "/I\"" + configure_module_dirname + "/phpstr\"");
        ADD_SOURCES(configure_module_dirname + "/phpstr", "phpstr.c", "http");
diff --git a/http.c b/http.c
index 2cc838508ce08922159fa5deb17273fe3119cfa6..14b25bcf49ab67e3cc2a52cdc554aa8af0a5527f 100644 (file)
--- a/http.c
+++ b/http.c
 #              include "php_http_request_object.h"
 #              include "php_http_requestpool_object.h"
 #      endif
 #              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
 
 #      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
 #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_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()
        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 */
                        (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;
        }
                        (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 (file)
index 0000000..4060ba4
--- /dev/null
@@ -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 <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
+ */
+
diff --git a/http_inflatestream_object.c b/http_inflatestream_object.c
new file mode 100644 (file)
index 0000000..b89a77b
--- /dev/null
@@ -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 <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
+ */
+
diff --git a/php_http_deflatestream_object.h b/php_http_deflatestream_object.h
new file mode 100644 (file)
index 0000000..5a274a8
--- /dev/null
@@ -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 <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
+ */
+
diff --git a/php_http_inflatestream_object.h b/php_http_inflatestream_object.h
new file mode 100644 (file)
index 0000000..91da740
--- /dev/null
@@ -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 <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
+ */
+
diff --git a/tests/encoding_objects_001.phpt b/tests/encoding_objects_001.phpt
new file mode 100644 (file)
index 0000000..d9cf992
--- /dev/null
@@ -0,0 +1,24 @@
+--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
+