Subversion Repositories php-qbpwcf

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 liveuser 1
<?php
2
 
3
namespace GuzzleHttp\Psr7;
4
 
5
use Psr\Http\Message\StreamInterface;
6
 
7
/**
8
 * Uses PHP's zlib.inflate filter to inflate deflate or gzipped content.
9
 *
10
 * This stream decorator skips the first 10 bytes of the given stream to remove
11
 * the gzip header, converts the provided stream to a PHP stream resource,
12
 * then appends the zlib.inflate filter. The stream is then converted back
13
 * to a Guzzle stream resource to be used as a Guzzle stream.
14
 *
15
 * @link http://tools.ietf.org/html/rfc1952
16
 * @link http://php.net/manual/en/filters.compression.php
17
 */
18
class InflateStream implements StreamInterface
19
{
20
    use StreamDecoratorTrait;
21
 
22
    public function __construct(StreamInterface $stream)
23
    {
24
        // read the first 10 bytes, ie. gzip header
25
        $header = $stream->read(10);
26
        $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header);
27
        // Skip the header, that is 10 + length of filename + 1 (nil) bytes
28
        $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength);
29
        $resource = StreamWrapper::getResource($stream);
30
        stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ);
31
        $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource));
32
    }
33
 
34
    /**
35
     * @param StreamInterface $stream
36
     * @param $header
37
     * @return int
38
     */
39
    private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header)
40
    {
41
        $filename_header_length = 0;
42
 
43
        if (substr(bin2hex($header), 6, 2) === '08') {
44
            // we have a filename, read until nil
45
            $filename_header_length = 1;
46
            while ($stream->read(1) !== chr(0)) {
47
                $filename_header_length++;
48
            }
49
        }
50
 
51
        return $filename_header_length;
52
    }
53
}