Mercurial > hg > isophonics-drupal-site
comparison vendor/guzzlehttp/psr7/src/InflateStream.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 129ea1e6d783 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 namespace GuzzleHttp\Psr7; | |
3 | |
4 use Psr\Http\Message\StreamInterface; | |
5 | |
6 /** | |
7 * Uses PHP's zlib.inflate filter to inflate deflate or gzipped content. | |
8 * | |
9 * This stream decorator skips the first 10 bytes of the given stream to remove | |
10 * the gzip header, converts the provided stream to a PHP stream resource, | |
11 * then appends the zlib.inflate filter. The stream is then converted back | |
12 * to a Guzzle stream resource to be used as a Guzzle stream. | |
13 * | |
14 * @link http://tools.ietf.org/html/rfc1952 | |
15 * @link http://php.net/manual/en/filters.compression.php | |
16 */ | |
17 class InflateStream implements StreamInterface | |
18 { | |
19 use StreamDecoratorTrait; | |
20 | |
21 public function __construct(StreamInterface $stream) | |
22 { | |
23 // read the first 10 bytes, ie. gzip header | |
24 $header = $stream->read(10); | |
25 $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header); | |
26 // Skip the header, that is 10 + length of filename + 1 (nil) bytes | |
27 $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength); | |
28 $resource = StreamWrapper::getResource($stream); | |
29 stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ); | |
30 $this->stream = new Stream($resource); | |
31 } | |
32 | |
33 /** | |
34 * @param StreamInterface $stream | |
35 * @param $header | |
36 * @return int | |
37 */ | |
38 private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header) | |
39 { | |
40 $filename_header_length = 0; | |
41 | |
42 if (substr(bin2hex($header), 6, 2) === '08') { | |
43 // we have a filename, read until nil | |
44 $filename_header_length = 1; | |
45 while ($stream->read(1) !== chr(0)) { | |
46 $filename_header_length++; | |
47 } | |
48 } | |
49 | |
50 return $filename_header_length; | |
51 } | |
52 } |