|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #29045 gzopen for URL
Submitted: 2004-07-07 12:38 UTC Modified: 2004-07-08 11:22 UTC
Avg. Score:4.0 ± 0.9
Reproduced:4 of 5 (80.0%)
Same Version:1 (25.0%)
Same OS:0 (0.0%)
From: fcartegnie at nordnet dot fr Assigned: pollita
Status: Suspended Package: Documentation problem
PHP Version: 4.3.7 OS: *
Private report: No CVE-ID:
Have you experienced this issue?
Rate the importance of this bug to you:

 [2004-07-07 12:38 UTC] fcartegnie at nordnet dot fr
Current Zlib wrapper does not allow using gzopen()
on remote URL.

results in a "cannot make seekable" error (from streams.c)

Seems a bug reopen.
Patch attached.

Reproduce code:
gzopen("http://aaa/truc.gz", "r");

Expected result:
diff -u php-4.3.6/ext/zlib/zlib_fopen_wrapper.c php-4.3.6_perso/ext/zlib/zlib_fopen_wrapper.c
--- php-4.3.6/ext/zlib/zlib_fopen_wrapper.c	2003-07-24 02:03:51.000000000 +0200
+++ php-4.3.6_perso/ext/zlib/zlib_fopen_wrapper.c	2004-07-07 12:23:34.000000000 +0200
@@ -97,6 +97,7 @@
 	struct php_gz_stream_data_t *self;
 	php_stream *stream = NULL, *innerstream = NULL;
+	int seekoption;
 	/* sanity check the stream: it can be either read-only or write-only */
 	if (strchr(mode, '+')) {
@@ -113,7 +114,12 @@
 	else if (strncasecmp("zlib:", path, 5) == 0)
 		path += 5;
-	innerstream = php_stream_open_wrapper(path, mode, STREAM_MUST_SEEK|options|STREAM_WILL_CAST, opened_path);
+	if ( (strncasecmp("http://", path, 7) == 0) || (strncasecmp("ftp://", path, 6) == 0) )
+	{
+		seekoption = 0;
+	} else 	seekoption = STREAM_MUST_SEEK;
+	innerstream = php_stream_open_wrapper(path, mode, seekoption|options|STREAM_WILL_CAST, opened_path);
 	if (innerstream) {
 		int fd;


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2004-07-07 13:09 UTC]
Why not use fopen("compress.zlib://") and all the other normal file operations?
 [2004-07-07 14:33 UTC] fcartegnie at nordnet dot fr
I did not see this syntax in the documentation.

How would you specify HTTP or FTP ?
 [2004-07-07 14:39 UTC] fcartegnie at nordnet dot fr
compress.zlib://http:// seems to work

Maybe we could add some deprecation/pointer info in the documentation of gzopen()

Changing for documentation problem
 [2004-07-07 16:12 UTC]
compress.zlib://host/path isn't actually valid.

What is valid however (as of PHP5) is:

$fp = fopen('http://host/path/file.gz', 'r');
/* Maybe a small fread() here to consume gzip headers, I don't recall if they're sent with deflated content */
stream_filter_append($fp, 'zlib.inflate');

Note: For PHP 5.0 you need PECL package zlib_filter, it'll be rolled into the core in PHP 5.1 .

The patch supplied above needs further review as I see a big potential for zlib stream errors with the read buffer blocks that come in with the headers.
 [2004-07-07 16:16 UTC]
compress.zlib://http://host.file.gz should work fine in php 4, not?

include "compress.zlib://file.php.gz"; works too ;-)
 [2004-07-07 22:17 UTC]
Wez needs to chime in on this...  

I stated that it wouldn't work for http (with or without the patch) because I thought we had disabled shrinking the chunk_size to 1 while reading into the HTTP headers (for performance reasons).  Looking back at the code I see that the temporary shift into small chuck sizes *IS* enabled when the STREAM_WILL_CAST flag is set (which it is for the zlib fopen wrapper).

Maybe it was the conditional set based on the option flag that was the compromise... in which case I'd say: Go ahead and use fopen('compress.zlib://http://blah...',... but the patch provided for gzopen() seems completely unnecessary.

 [2004-07-08 11:22 UTC]
You cannot drop STREAM_MUST_SEEK because the handler uses
seek. In case of http or ftp or what ever forward streams a temporary file is created automatically so it still works as expected.
 [2007-02-19 13:20 UTC] infos at firmalarsirketler dot com
thank you for this nice site
 [2010-04-05 17:52 UTC] zelnaga at gmail dot com
This doesn't seem to work.

fopen('compress.zlib://php://temp', 'r+');

When I try it I get the following:

Warning: fopen(compress.zlib://php://temp): failed to open stream: operation failed in C:\htdocs\www\test.php on line 1

Per this, though, it seems like it should work?
 [2011-09-21 14:39 UTC] ascii88 at mail dot ru
fopen('compress.zlib://php://temp', 'r'); works fine.
PHP Copyright © 2001-2015 The PHP Group
All rights reserved.
Last updated: Fri May 22 16:02:18 2015 UTC