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 / class-clientstate.php
jetpack / vendor / wp-php-toolkit / http-client Last commit date
ByteStream 6 days ago Middleware 6 days ago Transport 6 days ago examples 6 days ago LICENSE.md 6 days ago README.md 6 days ago class-client.php 6 days ago class-clientstate.php 6 days ago class-connection.php 6 days ago class-crawler.php 6 days ago class-httpclientexception.php 6 days ago class-httperror.php 6 days ago class-request.php 6 days ago class-response.php 6 days ago composer.json 6 days ago
class-clientstate.php
209 lines
1 <?php
2
3 namespace WordPress\HttpClient;
4
5 class ClientState {
6
7 /**
8 * Microsecond is 1 millionth of a second.
9 *
10 * @var int
11 */
12 const MICROSECONDS_TO_SECONDS = 1000000;
13
14 /**
15 * 5/100th of a second
16 */
17 const NONBLOCKING_TIMEOUT_MICROSECONDS = 0.05 * self::MICROSECONDS_TO_SECONDS;
18
19 /**
20 * The maximum number of concurrent connections allowed.
21 *
22 * This is as a safeguard against:
23 * * Spreading our network bandwidth too thin and not making any real progress on any
24 * request.
25 * * Overwhelming the server with too many requests.
26 *
27 * @var int
28 */
29 public $concurrency;
30
31 /**
32 * All the HTTP requests ever enqueued with this Client.
33 *
34 * Each Request may have a different state, and this Client will manage them
35 * asynchronously, moving them through the various states as the network
36 * operations progress.
37 *
38 * @since Next Release
39 * @var Request[]
40 */
41 public $requests = array();
42
43 /**
44 * Network connection details managed privately by this Client.
45 *
46 * Each Request has a corresponding Connection object that contains
47 * the connection handle, response buffer, and other details.
48 *
49 * These are internal, will change without warning, and should not be
50 * exposed to the outside world.
51 *
52 * @var array
53 */
54 public $connections = array();
55 public $events = array();
56 public $event = null;
57 public $request = null;
58 public $response_body_chunk = null;
59 public $request_timeout_ms = null;
60
61 public function __construct( $options = array() ) {
62 $this->concurrency = $options['concurrency'] ?? 10;
63 $this->request_timeout_ms = $options['timeout_ms'] ?? 30000;
64 }
65
66 public function has_pending_event( $request, $event_type ) {
67 return $this->events[ $request->id ][ $event_type ] ?? false;
68 }
69
70 /**
71 * Returns the next event found by await_next_event().
72 *
73 * @return string|bool The next event, or false if no event is set.
74 */
75 public function get_event() {
76 if ( null === $this->event ) {
77 return false;
78 }
79
80 return $this->event;
81 }
82
83 /**
84 * Returns the request associated with the last event found
85 * by await_next_event().
86 *
87 * @return Request
88 */
89 public function get_request() {
90 if ( null === $this->request ) {
91 return false;
92 }
93
94 return $this->request;
95 }
96
97 /**
98 * Returns the response body chunk associated with the EVENT_BODY_CHUNK_AVAILABLE
99 * event found by await_next_event().
100 *
101 * @return string|false
102 */
103 public function get_response_body_chunk() {
104 if ( null === $this->response_body_chunk ) {
105 return false;
106 }
107
108 return $this->response_body_chunk;
109 }
110
111 public function get_active_requests( $states = null ) {
112 $processed_requests = $this->get_requests(
113 array(
114 Request::STATE_WILL_ENABLE_CRYPTO,
115 Request::STATE_WILL_SEND_HEADERS,
116 Request::STATE_WILL_SEND_BODY,
117 Request::STATE_SENT,
118 Request::STATE_RECEIVING_HEADERS,
119 Request::STATE_RECEIVING_BODY,
120 Request::STATE_RECEIVED,
121 )
122 );
123 $available_slots = $this->concurrency - count( $processed_requests );
124 $enqueued_requests = $this->get_requests( Request::STATE_ENQUEUED );
125 for ( $i = 0; $i < $available_slots; $i++ ) {
126 if ( ! isset( $enqueued_requests[ $i ] ) ) {
127 break;
128 }
129 $processed_requests[] = $enqueued_requests[ $i ];
130 }
131 if ( null !== $states ) {
132 $processed_requests = static::filter_requests_by_state( $processed_requests, $states );
133 }
134
135 return $processed_requests;
136 }
137
138 public function get_requests( $states ) {
139 if ( ! is_array( $states ) ) {
140 $states = array( $states );
141 }
142
143 return static::filter_requests_by_state( $this->requests, $states );
144 }
145
146 public static function filter_requests_by_state( array $requests, $states ) {
147 if ( ! is_array( $states ) ) {
148 $states = array( $states );
149 }
150 $results = array();
151 foreach ( $requests as $request ) {
152 if ( in_array( $request->state, $states, true ) ) {
153 $results[] = $request;
154 }
155 }
156
157 return $results;
158 }
159
160 public function get_request_by_id( $request_id ) {
161 foreach ( $this->requests as $request ) {
162 if ( $request->id === $request_id ) {
163 return $request;
164 }
165 }
166 }
167
168 /**
169 * Consumes $length bytes received in response to a given request.
170 *
171 * @return string
172 */
173 public function consume_buffered_response_body( $request_id ) {
174 $request = $this->get_request_by_id( $request_id );
175 if ( null === $request ) {
176 return false;
177 }
178 $connection = $this->connections[ $request->id ];
179 if (
180 Request::STATE_RECEIVING_BODY === $request->state ||
181 Request::STATE_RECEIVED === $request->state ||
182 Request::STATE_FINISHED === $request->state
183 ) {
184 return $connection->consume_buffer();
185 }
186
187 $end_of_data = Request::STATE_FINISHED === $request->state && (
188 ! is_resource( $this->connections[ $request->id ]->http_socket ) ||
189 $this->connections[ $request->id ]->decoded_response_stream->reached_end_of_data()
190 );
191 if ( $end_of_data ) {
192 return false;
193 }
194
195 return '';
196 }
197
198 public function set_request_error( Request $request, $error ) {
199 $request->error = $error;
200 $request->state = Request::STATE_FAILED;
201 $this->events[ $request->id ][ Client::EVENT_FAILED ] = true;
202 }
203
204 public function set_request_finished( Request $request ) {
205 $request->state = Request::STATE_FINISHED;
206 $this->events[ $request->id ][ Client::EVENT_FINISHED ] = true;
207 }
208 }
209