框架升级及修复升级后的bug

This commit is contained in:
Dev
2026-10-16 18:13:09 +08:00
parent dafb0c96c0
commit 2d342bcbd7
537 changed files with 49836 additions and 40933 deletions
+47 -12
View File
@@ -12,16 +12,20 @@
namespace Symfony\Component\HttpClient;
use Amp\CancelledException;
use Amp\DeferredFuture;
use Amp\Http\Client\DelegateHttpClient;
use Amp\Http\Client\InterceptedHttpClient;
use Amp\Http\Client\PooledHttpClient;
use Amp\Http\Client\Request;
use Amp\Http\HttpMessage;
use Amp\Http\Tunnel\Http1TunnelConnector;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
use Symfony\Component\HttpClient\Exception\TransportException;
use Symfony\Component\HttpClient\Internal\AmpClientState;
use Symfony\Component\HttpClient\Response\AmpResponse;
use Symfony\Component\HttpClient\Internal\AmpClientStateV4;
use Symfony\Component\HttpClient\Internal\AmpClientStateV5;
use Symfony\Component\HttpClient\Response\AmpResponseV4;
use Symfony\Component\HttpClient\Response\AmpResponseV5;
use Symfony\Component\HttpClient\Response\ResponseStream;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Contracts\HttpClient\ResponseInterface;
@@ -32,6 +36,10 @@ if (!interface_exists(DelegateHttpClient::class)) {
throw new \LogicException('You cannot use "Symfony\Component\HttpClient\AmpHttpClient" as the "amphp/http-client" package is not installed. Try running "composer require amphp/http-client:^5".');
}
if (\PHP_VERSION_ID < 80400 && is_subclass_of(Request::class, HttpMessage::class)) {
throw new \LogicException('Using "Symfony\Component\HttpClient\AmpHttpClient" with amphp/http-client >= 5 requires PHP >= 8.4. Try running "composer require amphp/http-client:^4.2.1" or upgrade to PHP >= 8.4.');
}
/**
* A portable implementation of the HttpClientInterface contracts based on Amp's HTTP client.
*
@@ -48,7 +56,7 @@ final class AmpHttpClient implements HttpClientInterface, LoggerAwareInterface,
private array $defaultOptions = self::OPTIONS_DEFAULTS;
private static array $emptyDefaults = self::OPTIONS_DEFAULTS;
private AmpClientState $multi;
private AmpClientStateV4|AmpClientStateV5 $multi;
/**
* @param array $defaultOptions Default requests' options
@@ -67,7 +75,14 @@ final class AmpHttpClient implements HttpClientInterface, LoggerAwareInterface,
[, $this->defaultOptions] = self::prepareRequest(null, null, $defaultOptions, $this->defaultOptions);
}
$this->multi = new AmpClientState($clientConfigurator, $maxHostConnections, $maxPendingPushes, $this->logger);
if (is_subclass_of(Request::class, HttpMessage::class)) {
$this->multi = new AmpClientStateV5($clientConfigurator, $maxHostConnections, $maxPendingPushes, $this->logger);
} else {
if (\PHP_VERSION_ID >= 80400) {
trigger_deprecation('symfony/http-client', '7.4', 'Using amphp/http-client < 5 is deprecated. Try running "composer require amphp/http-client:^5".');
}
$this->multi = new AmpClientStateV4($clientConfigurator, $maxHostConnections, $maxPendingPushes, $this->logger);
}
}
/**
@@ -128,10 +143,18 @@ final class AmpHttpClient implements HttpClientInterface, LoggerAwareInterface,
$request->addHeader($h[0], $h[1]);
}
$request->setTcpConnectTimeout($options['timeout']);
$request->setTlsHandshakeTimeout($options['timeout']);
$request->setTransferTimeout($options['max_duration']);
$request->setInactivityTimeout(0);
if ($request instanceof HttpMessage) {
$request->setTcpConnectTimeout($options['timeout']);
$request->setTlsHandshakeTimeout($options['timeout']);
$request->setTransferTimeout($options['max_duration']);
} else {
$request->setTcpConnectTimeout(ceil(1000 * $options['timeout']));
$request->setTlsHandshakeTimeout(ceil(1000 * $options['timeout']));
$request->setTransferTimeout(ceil(1000 * $options['max_duration']));
}
if (method_exists($request, 'setInactivityTimeout')) {
$request->setInactivityTimeout(0);
}
if ('' !== $request->getUri()->getUserInfo() && !$request->hasHeader('authorization')) {
$auth = explode(':', $request->getUri()->getUserInfo(), 2);
@@ -139,16 +162,24 @@ final class AmpHttpClient implements HttpClientInterface, LoggerAwareInterface,
$request->setHeader('Authorization', 'Basic '.base64_encode(implode(':', $auth)));
}
return new AmpResponse($this->multi, $request, $options, $this->logger);
if ($request instanceof HttpMessage) {
return new AmpResponseV5($this->multi, $request, $options, $this->logger);
}
return new AmpResponseV4($this->multi, $request, $options, $this->logger);
}
public function stream(ResponseInterface|iterable $responses, ?float $timeout = null): ResponseStreamInterface
{
if ($responses instanceof AmpResponse) {
if ($responses instanceof AmpResponseV4 || $responses instanceof AmpResponseV5) {
$responses = [$responses];
}
return new ResponseStream(AmpResponse::stream($responses, $timeout));
if ($this->multi instanceof AmpClientStateV5) {
return new ResponseStream(AmpResponseV5::stream($responses, $timeout));
}
return new ResponseStream(AmpResponseV4::stream($responses, $timeout));
}
public function reset(): void
@@ -157,7 +188,11 @@ final class AmpHttpClient implements HttpClientInterface, LoggerAwareInterface,
foreach ($this->multi->pushedResponses as $pushedResponses) {
foreach ($pushedResponses as [$pushedUrl, $pushDeferred]) {
$pushDeferred->error(new CancelledException());
if ($pushDeferred instanceof DeferredFuture) {
$pushDeferred->error(new CancelledException());
} else {
$pushDeferred->fail(new CancelledException());
}
$this->logger?->debug(\sprintf('Unused pushed response: "%s"', $pushedUrl));
}