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 / Middleware / class-httpmiddleware.php
jetpack / vendor / wp-php-toolkit / http-client / Middleware Last commit date
class-cachemiddleware.php 6 days ago class-httpmiddleware.php 6 days ago class-redirectionmiddleware.php 6 days ago middleware-interface.php 6 days ago
class-httpmiddleware.php
161 lines
1 <?php
2
3 namespace WordPress\HttpClient\Middleware;
4
5 use WordPress\HttpClient\Client;
6 use WordPress\HttpClient\ClientState;
7 use WordPress\HttpClient\HttpClientException;
8 use WordPress\HttpClient\Request;
9 use WordPress\HttpClient\Connection;
10 use WordPress\HttpClient\Transport\CurlTransport;
11 use WordPress\HttpClient\Transport\SocketTransport;
12 use WordPress\HttpClient\Transport\TransportInterface;
13
14 class HttpMiddleware implements MiddlewareInterface {
15
16 const EVENT_GOT_HEADERS = 'EVENT_GOT_HEADERS';
17 const EVENT_BODY_CHUNK_AVAILABLE = 'EVENT_BODY_CHUNK_AVAILABLE';
18 const EVENT_FAILED = 'EVENT_FAILED';
19 const EVENT_FINISHED = 'EVENT_FINISHED';
20
21 /**
22 * @var ClientState
23 */
24 private $state;
25 /**
26 * @var TransportInterface
27 */
28 private $transport;
29
30 public function __construct( $client_state, $options = array() ) {
31 $this->state = $client_state;
32 $this->transport = $options['transport'];
33 }
34
35 /**
36 * Enqueues one or multiple HTTP requests for asynchronous processing.
37 * It does not open the network sockets, only adds the Request objects to
38 * an internal queue. Network transmission is delayed until one of the returned
39 * streams is read from.
40 *
41 * @param Request $request The HTTP request to enqueue.
42 */
43 public function enqueue( Request $request ) {
44 $request->state = Request::STATE_ENQUEUED;
45 $this->state->requests[] = apply_filters( 'wp_http_client_request', $request );
46 $this->state->events[ $request->id ] = array();
47 $this->state->connections[ $request->id ] = new Connection( $request );
48 }
49
50 /**
51 * Returns the next event related to any of the HTTP
52 * requests enqueued in this client.
53 *
54 * ## Events
55 *
56 * The returned event is a ClientEvent with $event->name
57 * being one of the following:
58 *
59 * * `Client::EVENT_GOT_HEADERS`
60 * * `Client::EVENT_BODY_CHUNK_AVAILABLE`
61 * * `Client::EVENT_FAILED`
62 * * `Client::EVENT_FINISHED`
63 *
64 * See the ClientEvent class for details on each event.
65 *
66 * Once an event is consumed, it is removed from the
67 * event queue and will not be returned again.
68 *
69 * When there are no events available, this function
70 * blocks and waits for the next one. If all requests
71 * have already finished, and we are not waiting for
72 * any more events, it returns false.
73 *
74 * ## Filtering
75 *
76 * The $query parameter can be used to filter the events
77 * that are returned. It can contain the following keys:
78 *
79 * * `request_id` – The ID of the request to consider.
80 *
81 * For example, to only consider the next `EVENT_GOT_HEADERS`
82 * event for a specific request, you can use:
83 *
84 * ```php
85 * $request = new Request( "https://w.org" );
86 *
87 * $client = new HttpClientClient();
88 * $client->enqueue( $request );
89 * $event = $client->await_next_event( [
90 * 'request_id' => $request->id,
91 * ] );
92 * ```
93 *
94 * Importantly, filtering does not consume unrelated events.
95 * You can await all the events for a request #2, and
96 * then await the next event for request #1 even if the
97 * request #1 has finished before you started awaiting
98 * events for request #2.
99 *
100 * @param $query
101 *
102 * @return bool
103 */
104 public function await_next_event( $requests_ids ): bool {
105 $ordered_events = array(
106 Client::EVENT_GOT_HEADERS,
107 Client::EVENT_BODY_CHUNK_AVAILABLE,
108 Client::EVENT_FAILED,
109 Client::EVENT_FINISHED,
110 );
111 $this->state->event = null;
112 $this->state->request = null;
113 $this->state->response_body_chunk = null;
114
115 // Give the requests an opportunity to time out; 10% more, but at least 300ms.
116 $timeout_ms = $this->state->request_timeout_ms + max( 300, $this->state->request_timeout_ms * 0.1 );
117 $start_time = microtime( true );
118
119 do {
120 foreach ( $requests_ids as $request_id ) {
121 foreach ( $ordered_events as $considered_event ) {
122 $needs_emitting = $this->state->events[ $request_id ][ $considered_event ] ?? false;
123 if ( ! $needs_emitting ) {
124 continue;
125 }
126
127 $this->state->events[ $request_id ][ $considered_event ] = false;
128 $this->state->event = $considered_event;
129 $this->state->request = $this->state->get_request_by_id( $request_id );
130 switch ( $this->state->event ) {
131 case Client::EVENT_BODY_CHUNK_AVAILABLE:
132 $this->state->response_body_chunk = $this->state->consume_buffered_response_body( $request_id );
133 break;
134 case Client::EVENT_FAILED:
135 case Client::EVENT_FINISHED:
136 // We don't need the response buffer anymore. It's
137 // safe to clean up the connection object now. The
138 // HTTP resource have been closed by now via the
139 // close_connection() method.
140 unset( $this->state->connections[ $request_id ] );
141 break;
142 }
143
144 return true;
145 }
146 }
147
148 // After we've checked for any available events, see if we've run out of time.
149 // This way, we always return any events that were ready before worrying about the timeout
150 // If we checked the timeout first, we might miss events that were already waiting for us
151 // when the timeout is set to zero.
152 $time_elapsed_ms = ( microtime( true ) - $start_time ) * 1000;
153 if ( $timeout_ms && $time_elapsed_ms >= $timeout_ms ) {
154 return false;
155 }
156 } while ( $this->transport->event_loop_tick() );
157
158 return false;
159 }
160 }
161