|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2004-07-07 12:38 UTC] fcartegnie at nordnet dot fr
Description:
------------
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;
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Oct 29 09:00:01 2025 UTC |
Why not use fopen("compress.zlib://host.com/file.gz") and all the other normal file operations?I did not see this syntax in the documentation. fopen("compress.zlib://host.com/file.gz") How would you specify HTTP or FTP ?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.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.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?fopen('compress.zlib://php://temp', 'r'); works fine.