PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.3
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.3
16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / vendor / wp-php-toolkit / bytestream / ReadStream / class-inflatereadstream.php
jetpack / vendor / wp-php-toolkit / bytestream / ReadStream Last commit date
class-basebytereadstream.php 1 week ago class-deflatereadstream.php 1 week ago class-filereadstream.php 1 week ago class-inflatereadstream.php 1 week ago class-limitedbytereadstream.php 1 week ago class-transformedreadstream.php 1 week ago interface-bytereadstream.php 1 week ago
class-inflatereadstream.php
151 lines
1 <?php
2
3 namespace WordPress\ByteStream\ReadStream;
4
5 use Exception;
6 use WordPress\ByteStream\ByteStreamException;
7
8 class InflateReadStream extends BaseByteReadStream {
9
10 protected $inflate_context;
11 protected $inflate_encoding;
12 protected $upstream;
13
14 /**
15 * The offset of the underlying reader at the time of the first read
16 * from the InflateReader.
17 *
18 * It's the only way to seek to an earlier offset when reading from
19 * a git-like object that has a plaintext header and gzipped body:
20 *
21 * blob <size>\x00
22 * <gzip-compressed-data>
23 *
24 * If we just seeked to offset=0, we'd start inflating the plaintext,
25 * not the deflated body, and get an error.
26 *
27 * @var int|null
28 */
29 protected $delegate_offset_0;
30
31 /**
32 * Ensure properties are defined or inherited.
33 *
34 * @var bool
35 */
36 protected $is_closed = false;
37 protected $buffer = '';
38 protected $bytes_already_forgotten = 0;
39 protected $offset_in_current_buffer = 0;
40
41 public function __construct( ByteReadStream $upstream, $encoding = ZLIB_ENCODING_DEFLATE ) {
42 $this->inflate_encoding = $encoding;
43 $this->inflate_init();
44 $this->upstream = $upstream;
45 }
46
47 protected function internal_pull( $n ): string {
48 if ( null === $this->delegate_offset_0 ) {
49 $this->delegate_offset_0 = $this->upstream->tell();
50 }
51
52 if ( ! $this->inflate_context ) {
53 return '';
54 }
55
56 if ( $this->upstream->reached_end_of_data() ) {
57 $bytes = inflate_add( $this->inflate_context, '', ZLIB_FINISH );
58 $this->inflate_context = null;
59
60 return $bytes;
61 }
62
63 $n = max( 200, $n );
64 $available = $this->upstream->pull( $n );
65
66 $inflated = inflate_add( $this->inflate_context, $this->upstream->consume( $available ) );
67 if ( false === $inflated ) {
68 throw new ByteStreamException( esc_html( 'Inflate error: ' . $this->get_error_string() ) );
69 }
70
71 return $inflated;
72 }
73
74 public function length(): ?int {
75 return null;
76 }
77
78 protected function internal_close_reading(): void {
79 $this->inflate_context = null;
80 }
81
82 protected function internal_reached_end_of_data(): bool {
83 return null === $this->inflate_context && $this->upstream->reached_end_of_data();
84 }
85
86 public function seek( $offset ): void {
87 if ( null !== $this->length() && $offset > $this->length() ) {
88 throw new ByteStreamException( 'Cannot seek past the available data. Call append_bytes() first.' );
89 }
90
91 if ( $offset < $this->tell() ) {
92 $this->upstream->seek( $this->delegate_offset_0 ?? 0 );
93 $this->buffer = '';
94 $this->bytes_already_forgotten = 0;
95 $this->offset_in_current_buffer = 0;
96
97 $this->inflate_init();
98 }
99
100 while ( $this->tell() < $offset ) {
101 $remaining_bytes = $offset - $this->tell();
102 $next_chunk_size = min( 50 * 1024, $remaining_bytes );
103 $pulled = $this->pull( $next_chunk_size );
104 // Keep skipping bytes until we've consumed enough.
105 $this->consume( min( $remaining_bytes, $pulled ) );
106 }
107 }
108
109 private function inflate_init() {
110 $this->inflate_context = inflate_init( $this->inflate_encoding );
111 if ( ! $this->inflate_context ) {
112 throw new Exception( 'Failed to initialize inflate context' );
113 }
114 }
115
116 protected function get_error_string() {
117 $status = inflate_get_status( $this->inflate_context );
118 switch ( $status ) {
119 case ZLIB_OK:
120 $error_string = 'ZLIB_OK';
121 break;
122 case ZLIB_STREAM_END:
123 $error_string = 'ZLIB_STREAM_END';
124 break;
125 case ZLIB_NEED_DICT:
126 $error_string = 'ZLIB_NEED_DICT';
127 break;
128 case ZLIB_ERRNO:
129 $error_string = 'ZLIB_ERRNO';
130 break;
131 case ZLIB_STREAM_ERROR:
132 $error_string = 'ZLIB_STREAM_ERROR';
133 break;
134 case ZLIB_DATA_ERROR:
135 $error_string = 'ZLIB_DATA_ERROR';
136 break;
137 case ZLIB_BUF_ERROR:
138 $error_string = 'ZLIB_BUF_ERROR';
139 break;
140 case ZLIB_MEM_ERROR:
141 $error_string = 'ZLIB_MEM_ERROR';
142 break;
143 default:
144 $error_string = 'Unknown error';
145 break;
146 }
147
148 return "Error $status: $error_string";
149 }
150 }
151