InflateStreamTest.php 3.0 KB

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