]> granicus.if.org Git - php/commitdiff
Add support for zlib/level context option
authorSara Golemon <pollita@php.net>
Tue, 24 Oct 2017 02:10:56 +0000 (22:10 -0400)
committerSara Golemon <pollita@php.net>
Tue, 24 Oct 2017 02:14:52 +0000 (22:14 -0400)
NEWS
ext/zlib/tests/zlib_wrapper_level.phpt [new file with mode: 0644]
ext/zlib/zlib_fopen_wrapper.c

diff --git a/NEWS b/NEWS
index 576e66544fac97468e5e2fe679ea6b9d6ec9d92e..58b2e59ee090de0425e879381e88e579e7736827 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -110,4 +110,7 @@ PHP                                                                        NEWS
   . Fixed unzserialize(), to disable creation of unsupported data structures
     through manually crafted strings. (Dmitry)
 
+- Zlib:
+  . Added zlib/level context option for compress.zlib wrapper. (Sara)
+
 <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
diff --git a/ext/zlib/tests/zlib_wrapper_level.phpt b/ext/zlib/tests/zlib_wrapper_level.phpt
new file mode 100644 (file)
index 0000000..135ef9c
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+compress.zlib:// wrapper with compression level
+--SKIPIF--
+<?php in_array('compress.zlib', stream_get_wrappers()) || print 'skip No zlib wrapper';
+--FILE--
+<?php declare(strict_types=1);
+
+$filename = tempnam(sys_get_temp_dir(), "php-zlib-test-");
+$thisfile = file_get_contents(__FILE__);
+
+function write_at_level(int $level) {
+  global $filename, $thisfile;
+
+  $ctx = stream_context_create(['zlib' => ['level' => $level] ]);
+  $fp = fopen("compress.zlib://$filename", 'w', false, $ctx);
+  for ($i = 0; $i < 10; ++$i) {
+    fwrite($fp, $thisfile);
+  }
+  fclose($fp);
+  $size = filesize($filename);
+  unlink($filename);
+  return $size;
+}
+
+$size1 = write_at_level(1);
+$size9 = write_at_level(9);
+
+var_dump(10 * strlen($thisfile));
+var_dump($size1);
+var_dump($size9);
+var_dump($size9 < $size1);
+--EXPECTF--
+int(%d)
+int(%d)
+int(%d)
+bool(true)
index 01539aec5c71008ec4653dd08f958a5d6b26019b..60147999fe16d30cc18166eb5eea9ebe9b4f3a9d 100644 (file)
@@ -141,6 +141,11 @@ php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, const char *path, con
                        self->gz_file = gzdopen(dup(fd), mode);
 
                        if (self->gz_file) {
+                               zval *zlevel = context ? php_stream_context_get_option(context, "zlib", "level") : NULL;
+                               if (zlevel && (Z_OK != gzsetparams(self->gz_file, zval_get_long(zlevel), Z_DEFAULT_STRATEGY))) {
+                                       php_error(E_WARNING, "failed setting compression level");
+                               }
+
                                stream = php_stream_alloc_rel(&php_stream_gzio_ops, self, 0, mode);
                                if (stream) {
                                        stream->flags |= PHP_STREAM_FLAG_NO_BUFFER;