PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.2
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.2
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 / http-client / ByteStream / class-chunkeddecoderreadstream.php
jetpack / vendor / wp-php-toolkit / http-client / ByteStream Last commit date
class-chunkeddecoderreadstream.php 6 days ago class-chunkedencoderbytetransformer.php 6 days ago class-requestreadstream.php 6 days ago class-seekablerequestreadstream.php 6 days ago
class-chunkeddecoderreadstream.php
98 lines
1 <?php
2
3 namespace WordPress\HttpClient\ByteStream;
4
5 use Exception;
6 use WordPress\ByteStream\ReadStream\BaseByteReadStream;
7
8 class ChunkedDecoderReadStream extends BaseByteReadStream {
9
10 private $state = self::SCAN_CHUNK_SIZE;
11 const SCAN_CHUNK_SIZE = 'SCAN_CHUNK_SIZE';
12 const SCAN_CHUNK_DATA = 'SCAN_CHUNK_DATA';
13 const SCAN_CHUNK_TRAILER = 'SCAN_CHUNK_TRAILER';
14 const SCAN_FINAL_CHUNK = 'SCAN_FINAL_CHUNK';
15
16 private $upstream;
17 private $chunk_remaining_bytes = 0;
18
19 public function __construct( BaseByteReadStream $upstream ) {
20 $this->upstream = $upstream;
21 }
22
23 protected function internal_pull( $n ): string {
24 if ( self::SCAN_FINAL_CHUNK === $this->state ) {
25 return '';
26 }
27
28 while ( true ) {
29 if ( self::SCAN_CHUNK_SIZE === $this->state ) {
30 // Try to peek enough bytes to find chunk size and CRLF.
31 $this->upstream->pull( 20 );
32 $peeked = $this->upstream->peek( 20 );
33
34 if ( strlen( $peeked ) < 3 ) { // Need at least "0\r\n".
35 break;
36 }
37
38 $chunk_bytes_nb = strspn( $peeked, '0123456789abcdefABCDEF' );
39 if ( 0 === $chunk_bytes_nb ) {
40 throw new Exception( 'Invalid chunk size format' );
41 }
42
43 $clrf_pos = strpos( $peeked, "\r\n", $chunk_bytes_nb );
44 if ( false === $clrf_pos ) {
45 break;
46 }
47
48 // Now we can safely consume the chunk header.
49 $chunk_header = $this->upstream->consume( $clrf_pos + 2 );
50 $chunk_size = hexdec( substr( $chunk_header, 0, $chunk_bytes_nb ) );
51
52 if ( 0 === $chunk_size ) {
53 $this->state = self::SCAN_FINAL_CHUNK;
54
55 return '';
56 }
57
58 $this->chunk_remaining_bytes = $chunk_size;
59 $this->state = self::SCAN_CHUNK_DATA;
60 } elseif ( self::SCAN_CHUNK_DATA === $this->state ) {
61 $bytes_to_read = min( $this->chunk_remaining_bytes, 65536 );
62 $available = $this->upstream->pull( $bytes_to_read );
63 if ( 0 === $available ) {
64 break;
65 }
66
67 $data = $this->upstream->consume( $available );
68 $this->chunk_remaining_bytes -= strlen( $data );
69 if ( 0 === $this->chunk_remaining_bytes ) {
70 $this->state = self::SCAN_CHUNK_TRAILER;
71 }
72
73 return $data;
74 } elseif ( self::SCAN_CHUNK_TRAILER === $this->state ) {
75 $this->upstream->pull( 2 );
76 $trailer = $this->upstream->peek( 2 );
77
78 if ( strlen( $trailer ) < 2 ) {
79 break;
80 }
81
82 if ( "\r\n" !== $trailer ) {
83 throw new Exception( 'Expected CRLF after chunk data' );
84 }
85
86 $this->upstream->consume( 2 );
87 $this->state = self::SCAN_CHUNK_SIZE;
88 }
89 }
90
91 return '';
92 }
93
94 protected function internal_reached_end_of_data(): bool {
95 return self::SCAN_FINAL_CHUNK === $this->state;
96 }
97 }
98