[HttpClient] fix scheduling pending NativeResponse

This commit is contained in:
Nicolas Grekas 2019-12-27 11:24:52 +01:00
parent 8855082ffd
commit a90a6c9c48
2 changed files with 22 additions and 25 deletions

View File

@ -11,8 +11,6 @@
namespace Symfony\Component\HttpClient\Internal;
use Symfony\Component\HttpClient\Response\NativeResponse;
/**
* Internal representation of the native client's state.
*
@ -24,8 +22,6 @@ final class NativeClientState extends ClientState
{
/** @var int */
public $id;
/** @var NativeResponse[] */
public $pendingResponses = [];
/** @var int */
public $maxHostConnections = PHP_INT_MAX;
/** @var int */

View File

@ -209,11 +209,7 @@ final class NativeResponse implements ResponseInterface
$runningResponses[$i] = [$response->multi, []];
}
if (null === $response->remaining) {
$response->multi->pendingResponses[] = $response;
} else {
$runningResponses[$i][1][$response->id] = $response;
}
$runningResponses[$i][1][$response->id] = $response;
if (null === $response->buffer) {
// Response already completed
@ -315,25 +311,30 @@ final class NativeResponse implements ResponseInterface
return;
}
if ($multi->pendingResponses && \count($multi->handles) < $multi->maxHostConnections) {
// Open the next pending request - this is a blocking operation so we do only one of them
/** @var self $response */
$response = array_shift($multi->pendingResponses);
$response->open();
$responses[$response->id] = $response;
$multi->sleep = false;
self::perform($response->multi);
if (null !== $response->handle) {
$multi->handles[] = $response->handle;
// Create empty activity lists to tell ResponseTrait::stream() we still have pending requests
foreach ($responses as $i => $response) {
if (null === $response->remaining && null !== $response->buffer) {
$multi->handlesActivity[$i] = [];
}
}
if ($multi->pendingResponses) {
// Create empty activity list to tell ResponseTrait::stream() we still have pending requests
$response = $multi->pendingResponses[0];
$responses[$response->id] = $response;
$multi->handlesActivity[$response->id] = [];
if (\count($multi->handles) >= $multi->maxHostConnections) {
return;
}
// Open the next pending request - this is a blocking operation so we do only one of them
foreach ($responses as $i => $response) {
if (null === $response->remaining && null !== $response->buffer) {
$response->open();
$multi->sleep = false;
self::perform($multi);
if (null !== $response->handle) {
$multi->handles[] = $response->handle;
}
break;
}
}
}