- add ob_(deflate|inflate)handler
[m6w6/ext-http] / http_functions.c
index 1b71506b7dcbe8f35e14d15431732bf47b77ec48..41afd28e3733664ab0d7ad22e3f47fd2420002a1 100644 (file)
@@ -41,8 +41,6 @@
 #include "php_http_send_api.h"
 #include "php_http_url_api.h"
 
-ZEND_EXTERN_MODULE_GLOBALS(http)
-
 /* {{{ proto string http_date([int timestamp])
  *
  * Compose a valid HTTP date regarding RFC 822/1123
@@ -1578,48 +1576,44 @@ PHP_FUNCTION(http_build_query)
 /* {{{ */
 #ifdef HTTP_HAVE_ZLIB
 
-/* {{{ proto string http_gzencode(string data[, int level = -1[, int mtime = 0]])
+/* {{{  proto string http_deflate(string data[, int flags = 0])
  *
- * Compress data with the HTTP compatible GZIP encoding.
+ * Compress data with gzip, zlib AKA deflate or raw deflate encoding.
  * 
- * Expects the first parameter to be a string which contains the data that
- * should be encoded.  Additionally accepts an optional in paramter specifying
- * the compression level, where -1 is default, 0 is no compression and 9 is
- * best compression ratio.
+ * Expects the first parameter to be a string containing the data that should
+ * be encoded.
  * 
  * Returns the encoded string on success, or NULL on failure.
  */
-PHP_FUNCTION(http_gzencode)
+PHP_FUNCTION(http_deflate)
 {
        char *data;
        int data_len;
-       long level = -1, mtime = 0;
-
+       long flags = 0;
+       
        RETVAL_NULL();
        
-       if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &data, &data_len, &level, &mtime)) {
-               HTTP_CHECK_GZIP_LEVEL(level, return);
-               {
-                       char *encoded;
-                       size_t encoded_len;
-                       
-                       if (SUCCESS == http_encoding_gzencode(level, mtime, data, data_len, &encoded, &encoded_len)) {
-                               RETURN_STRINGL(encoded, (int) encoded_len, 0);
-                       }
+       if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &data, &data_len, &flags)) {
+               char *encoded;
+               size_t encoded_len;
+               
+               if (SUCCESS == http_encoding_deflate(flags, data, data_len, &encoded, &encoded_len)) {
+                       RETURN_STRINGL(encoded, (int) encoded_len, 0);
                }
        }
 }
 /* }}} */
 
-/* {{{ proto string http_gzdecode(string data)
+/* {{{ proto string http_inflate(string data)
  *
- * Uncompress data compressed with the HTTP compatible GZIP encoding.
+ * Uncompress data compressed with either gzip, deflate AKA zlib or raw
+ * deflate encoding.
  * 
  * Expects a string as parameter containing the compressed data.
  * 
  * Returns the decoded string on success, or NULL on failure.
  */
-PHP_FUNCTION(http_gzdecode)
+PHP_FUNCTION(http_inflate)
 {
        char *data;
        int data_len;
@@ -1630,70 +1624,51 @@ PHP_FUNCTION(http_gzdecode)
                char *decoded;
                size_t decoded_len;
                
-               if (SUCCESS == http_encoding_gzdecode(data, data_len, &decoded, &decoded_len)) {
+               if (SUCCESS == http_encoding_inflate(data, data_len, &decoded, &decoded_len)) {
                        RETURN_STRINGL(decoded, (int) decoded_len, 0);
                }
        }
 }
 /* }}} */
 
-/* {{{  proto string http_deflate(string data[, int level = -1[, bool zlib_header = false]])
+/* {{{ proto string ob_deflatehandler(string data, int mode)
  *
- * Compress data with the HTTP compatible DEFLATE encoding.
- * 
- * Expects the first parameter to be a string containing the data that should
- * be encoded.  Additionally accepts an optional int parameter specifying the
- * compression level, where -1 is default, 0 is no compression and 9 is best
- * compression ratio.
- * 
- * Returns the encoded string on success, or NULL on failure.
+ * For use with ob_start(). The deflate output buffer handler can only be used once.
+ * It conflicts with ob_gzhanlder and zlib.output_compression as well and should
+ * not be used after ext/mbstrings mb_output_handler and ext/sessions URL-Rewriter (AKA
+ * session.use_trans_sid).
  */
-PHP_FUNCTION(http_deflate)
+PHP_FUNCTION(ob_deflatehandler)
 {
        char *data;
        int data_len;
-       long level = -1;
-       zend_bool zhdr = 0;
-       
-       RETVAL_NULL();
-       
-       if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lb", &data, &data_len, &level, &zhdr)) {
-               HTTP_CHECK_GZIP_LEVEL(level, return);
-               {
-                       char *encoded;
-                       size_t encoded_len;
-                       
-                       if (SUCCESS == http_encoding_deflate(level, zhdr, data, data_len, &encoded, &encoded_len)) {
-                               RETURN_STRINGL(encoded, (int) encoded_len, 0);
-                       }
-               }
+       long mode;
+
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &data, &data_len, &mode)) {
+               RETURN_FALSE;
        }
+
+       http_ob_deflatehandler(data, data_len, &Z_STRVAL_P(return_value), (uint *) &Z_STRLEN_P(return_value), mode);
+       Z_TYPE_P(return_value) = Z_STRVAL_P(return_value) ? IS_STRING : IS_NULL;
 }
 /* }}} */
 
-/* {{{ proto string http_inflate(string data)
+/* {{{ proto string ob_inflatehandler(string data, int mode)
  *
- * Uncompress data compressed with the HTTP compatible DEFLATE encoding.
- * 
- * Expects a string as parameter containing the compressed data.
- * 
- * Returns the decoded string on success, or NULL on failure.
+ * For use with ob_start().  Same restrictions as with ob_deflatehandler apply.
  */
-PHP_FUNCTION(http_inflate)
+PHP_FUNCTION(ob_inflatehandler)
 {
        char *data;
        int data_len;
+       long mode;
        
-       RETVAL_NULL();
-       
-       if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len)) {
-               char *decoded;
-               size_t decoded_len;
-               
-               if (SUCCESS == http_encoding_inflate(data, data_len, &decoded, &decoded_len)) {
-                       RETURN_STRINGL(decoded, (int) decoded_len, 0);
-               }
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &data, &data_len, &mode)) {
+               RETURN_FALSE;
        }
+       
+       http_ob_inflatehandler(data, data_len, &Z_STRVAL_P(return_value), (uint *) &Z_STRLEN_P(return_value), mode);
+       Z_TYPE_P(return_value) = Z_STRVAL_P(return_value) ? IS_STRING : IS_NULL;
 }
 /* }}} */