1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
<?php
declare(strict_types=1);
namespace GuzzleHttp\Tests\Psr7;
use GuzzleHttp\Psr7;
use GuzzleHttp\Psr7\InflateStream;
use GuzzleHttp\Psr7\NoSeekStream;
use PHPUnit\Framework\TestCase;
/**
* @requires extension zlib
*/
class InflateStreamTest extends TestCase
{
public function testInflatesRfc1952Streams(): void
{
$content = gzencode('test');
$a = Psr7\Utils::streamFor($content);
$b = new InflateStream($a);
self::assertSame('test', (string) $b);
}
public function testInflatesStreamsRfc1952WithFilename(): void
{
$content = $this->getGzipStringWithFilename('test');
$a = Psr7\Utils::streamFor($content);
$b = new InflateStream($a);
self::assertSame('test', (string) $b);
}
public function testInflatesRfc1950Streams(): void
{
$content = gzcompress('test');
$a = Psr7\Utils::streamFor($content);
$b = new InflateStream($a);
self::assertSame('test', (string) $b);
}
public function testInflatesRfc1952StreamsWithExtraFlags(): void
{
$content = gzdeflate('test'); // RFC 1951. Raw deflate. No header.
// +---+---+---+---+---+---+---+---+---+---+
// |ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->)
// +---+---+---+---+---+---+---+---+---+---+
$header = "\x1f\x8B\x08";
// set flags FHCRC, FEXTRA, FNAME and FCOMMENT
$header .= chr(0b00011110);
$header .= "\x00\x00\x00\x00"; // MTIME
$header .= "\x02\x03"; // XFL, OS
// 4 byte extra data
$header .= "\x04\x00\x41\x70\x00\x00"; /* XLEN + EXTRA */
// file name (2 bytes + terminator)
$header .= "\x41\x70\x00";
// file comment (3 bytes + terminator)
$header .= "\x41\x42\x43\x00";
// crc16
$header .= pack('v', crc32($header));
$a = Psr7\Utils::streamFor($header.$content);
$b = new InflateStream($a);
self::assertSame('test', (string) $b);
}
public function testInflatesStreamsPreserveSeekable(): void
{
$content = gzencode('test');
$seekable = Psr7\Utils::streamFor($content);
$seekableInflate = new InflateStream($seekable);
self::assertTrue($seekableInflate->isSeekable());
self::assertSame('test', (string) $seekableInflate);
$nonSeekable = new NoSeekStream(Psr7\Utils::streamFor($content));
$nonSeekableInflate = new InflateStream($nonSeekable);
self::assertFalse($nonSeekableInflate->isSeekable());
self::assertSame('test', (string) $nonSeekableInflate);
}
private function getGzipStringWithFilename($original_string)
{
$gzipped = bin2hex(gzencode($original_string));
$header = substr($gzipped, 0, 20);
// set FNAME flag
$header[6] = 0;
$header[7] = 8;
// make a dummy filename
$filename = '64756d6d7900';
$rest = substr($gzipped, 20);
return hex2bin($header.$filename.$rest);
}
}
|