Skip to content

Commit 9baad07

Browse files
[HttpClient] make pushed responses retry-able
1 parent 8d25d58 commit 9baad07

File tree

2 files changed

+26
-21
lines changed

2 files changed

+26
-21
lines changed

CurlHttpClient.php

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -116,23 +116,6 @@ public function request(string $method, string $url, array $options = []): Respo
116116
$options['normalized_headers']['user-agent'][] = $options['headers'][] = 'User-Agent: Symfony HttpClient/Curl';
117117
}
118118

119-
if ($pushedResponse = $this->multi->pushedResponses[$url] ?? null) {
120-
unset($this->multi->pushedResponses[$url]);
121-
122-
if (self::acceptPushForRequest($method, $options, $pushedResponse)) {
123-
$this->logger && $this->logger->debug(sprintf('Accepting pushed response: "%s %s"', $method, $url));
124-
125-
// Reinitialize the pushed response with request's options
126-
$pushedResponse->response->__construct($this->multi, $url, $options, $this->logger);
127-
128-
return $pushedResponse->response;
129-
}
130-
131-
$this->logger && $this->logger->debug(sprintf('Rejecting pushed response: "%s".', $url));
132-
}
133-
134-
$this->logger && $this->logger->info(sprintf('Request: "%s %s"', $method, $url));
135-
136119
$curlopts = [
137120
CURLOPT_URL => $url,
138121
CURLOPT_TCP_NODELAY => true,
@@ -267,7 +250,26 @@ public function request(string $method, string $url, array $options = []): Respo
267250
$curlopts[file_exists($options['bindto']) ? CURLOPT_UNIX_SOCKET_PATH : CURLOPT_INTERFACE] = $options['bindto'];
268251
}
269252

270-
$ch = curl_init();
253+
if ($pushedResponse = $this->multi->pushedResponses[$url] ?? null) {
254+
unset($this->multi->pushedResponses[$url]);
255+
256+
if (self::acceptPushForRequest($method, $options, $pushedResponse)) {
257+
$this->logger && $this->logger->debug(sprintf('Accepting pushed response: "%s %s"', $method, $url));
258+
259+
// Reinitialize the pushed response with request's options
260+
$ch = $pushedResponse->handle;
261+
$pushedResponse = $pushedResponse->response;
262+
$pushedResponse->__construct($this->multi, $url, $options, $this->logger);
263+
} else {
264+
$this->logger && $this->logger->debug(sprintf('Rejecting pushed response: "%s".', $url));
265+
$pushedResponse = null;
266+
}
267+
}
268+
269+
if (!$pushedResponse) {
270+
$ch = curl_init();
271+
$this->logger && $this->logger->info(sprintf('Request: "%s %s"', $method, $url));
272+
}
271273

272274
foreach ($curlopts as $opt => $value) {
273275
if (null !== $value && !curl_setopt($ch, $opt, $value) && CURLOPT_CERTINFO !== $opt) {
@@ -279,7 +281,7 @@ public function request(string $method, string $url, array $options = []): Respo
279281
}
280282
}
281283

282-
return new CurlResponse($this->multi, $ch, $options, $this->logger, $method, self::createRedirectResolver($options, $host));
284+
return $pushedResponse ?? new CurlResponse($this->multi, $ch, $options, $this->logger, $method, self::createRedirectResolver($options, $host));
283285
}
284286

285287
/**
@@ -369,7 +371,7 @@ private static function handlePush($parent, $pushed, array $requestHeaders, Curl
369371
$url .= $headers[':path'][0];
370372
$logger && $logger->debug(sprintf('Queueing pushed response: "%s"', $url));
371373

372-
$multi->pushedResponses[$url] = new PushedResponse(new CurlResponse($multi, $pushed), $headers, $multi->openHandles[(int) $parent][1] ?? []);
374+
$multi->pushedResponses[$url] = new PushedResponse(new CurlResponse($multi, $pushed), $headers, $multi->openHandles[(int) $parent][1] ?? [], $pushed);
373375

374376
return CURL_PUSH_OK;
375377
}

Internal/PushedResponse.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@ final class PushedResponse
2929

3030
public $parentOptions = [];
3131

32-
public function __construct(CurlResponse $response, array $requestHeaders, array $parentOptions)
32+
public $handle;
33+
34+
public function __construct(CurlResponse $response, array $requestHeaders, array $parentOptions, $handle)
3335
{
3436
$this->response = $response;
3537
$this->requestHeaders = $requestHeaders;
3638
$this->parentOptions = $parentOptions;
39+
$this->handle = $handle;
3740
}
3841
}

0 commit comments

Comments
 (0)