Skip to content

Psr17: replace usage of deprecated PHP-HTTP Factories with PSR-17 factories #439

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Nov 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@

The change log describes what is "Added", "Removed", "Changed" or "Fixed" between each release.

# Version 2

# 2.0.0 - (unreleased)
- Fixed a deprecation when creating a `HttpMethodsClient` via `http_methods_client: true`. Only PSR-17 factories are now passed as constructor arguments.
- Changed the default stream factory argument for the cache plugin. This now requires a PSR-17 StreamFactoryInterface instance.
- Creating a client using the `BuzzFactory` no longer accepts `verify_peer` and `verify_host` config options. Only a boolean `verify` flag is accepted, covering both previous options.
- Removed support of deprecated PHP-HTTP factories, only PSR-17 factories are now supported and used.
- Removed `message_factory`, `uri_factory`, and `stream_factory` classes config option. You can configure your own factories via psr17_*_factory classes config
- Removed support for guzzle5-adapter

# Version 1

# 1.31.0 - 2023-11-06
Expand Down
9 changes: 6 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@
],
"require": {
"php": "^7.3 || ^8.0",
"php-http/client-common": "^1.9 || ^2.0",
"php-http/client-common": "^2.0",
"php-http/client-implementation": "^1.0",
"php-http/discovery": "^1.14",
"php-http/httplug": "^2.0",
"php-http/logger-plugin": "^1.1",
"php-http/message": "^1.9",
"php-http/message-factory": "^1.0.2",
"php-http/stopwatch-plugin": "^1.2",
"psr/http-factory-implementation": "^1.0",
"psr/http-message": "^1.0 || ^2.0",
"symfony/config": "^4.4 || ^5.0 || ^6.0",
"symfony/dependency-injection": "^4.4 || ^5.0 || ^6.0",
Expand All @@ -44,7 +44,10 @@
"conflict": {
"php-http/guzzle6-adapter": "<1.1",
"php-http/curl-client": "<2.0",
"php-http/socket-client": "<2.0"
"php-http/socket-client": "<2.0",
"kriswallsmith/buzz": "<0.17",
"php-http/react-adapter": "<3.0",
"php-http/cache-plugin": "<1.7"
},
"require-dev": {
"guzzlehttp/psr7": "^1.7 || ^2.0",
Expand Down
31 changes: 10 additions & 21 deletions src/ClientFactory/BuzzFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
namespace Http\HttplugBundle\ClientFactory;

use Buzz\Client\FileGetContents;
use Http\Adapter\Buzz\Client as Adapter;
use Http\Message\MessageFactory;
use Psr\Http\Message\ResponseFactoryInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
Expand All @@ -15,33 +14,25 @@
class BuzzFactory implements ClientFactory
{
/**
* @var MessageFactory
* @var ResponseFactoryInterface
*/
private $messageFactory;
private $responseFactory;

public function __construct(MessageFactory $messageFactory)
public function __construct(ResponseFactoryInterface $responseFactory)
{
$this->messageFactory = $messageFactory;
$this->responseFactory = $responseFactory;
}

/**
* {@inheritdoc}
*/
public function createClient(array $config = [])
{
if (!class_exists('Http\Adapter\Buzz\Client')) {
throw new \LogicException('To use the Buzz adapter you need to install the "php-http/buzz-adapter" package.');
if (!class_exists('Buzz\Client\FileGetContents')) {
throw new \LogicException('To use the Buzz you need to install the "kriswallsmith/buzz" package.');
}

$client = new FileGetContents();
$options = $this->getOptions($config);

$client->setTimeout($options['timeout']);
$client->setVerifyPeer($options['verify_peer']);
$client->setVerifyHost($options['verify_host']);
$client->setProxy($options['proxy']);

return new Adapter($client, $this->messageFactory);
return new FileGetContents($this->responseFactory, $this->getOptions($config));
}

/**
Expand All @@ -53,14 +44,12 @@ private function getOptions(array $config = [])

$resolver->setDefaults([
'timeout' => 5,
'verify_peer' => true,
'verify_host' => 2,
'verify' => true,
'proxy' => null,
]);

$resolver->setAllowedTypes('timeout', 'int');
$resolver->setAllowedTypes('verify_peer', 'bool');
$resolver->setAllowedTypes('verify_host', 'int');
$resolver->setAllowedTypes('verify', 'bool');
$resolver->setAllowedTypes('proxy', ['string', 'null']);

return $resolver->resolve($config);
Expand Down
39 changes: 0 additions & 39 deletions src/ClientFactory/Guzzle5Factory.php

This file was deleted.

13 changes: 1 addition & 12 deletions src/ClientFactory/ReactFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,12 @@
namespace Http\HttplugBundle\ClientFactory;

use Http\Adapter\React\Client;
use Http\Message\MessageFactory;

/**
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
*/
class ReactFactory implements ClientFactory
{
/**
* @var MessageFactory
*/
private $messageFactory;

public function __construct(MessageFactory $messageFactory)
{
$this->messageFactory = $messageFactory;
}

/**
* {@inheritdoc}
*/
Expand All @@ -31,6 +20,6 @@ public function createClient(array $config = [])
throw new \LogicException('To use the React adapter you need to install the "php-http/react-adapter" package.');
}

return new Client($this->messageFactory);
return new Client();
}
}
11 changes: 0 additions & 11 deletions src/ClientFactory/SocketFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,12 @@
namespace Http\HttplugBundle\ClientFactory;

use Http\Client\Socket\Client;
use Http\Message\MessageFactory;

/**
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
*/
class SocketFactory implements ClientFactory
{
/**
* @var MessageFactory
*/
private $messageFactory;

public function __construct(MessageFactory $messageFactory)
{
$this->messageFactory = $messageFactory;
}

/**
* {@inheritdoc}
*/
Expand Down
15 changes: 5 additions & 10 deletions src/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,10 @@ public function getConfigTreeBuilder(): TreeBuilder
->validate()
->ifTrue(function ($v) {
return !empty($v['classes']['client'])
|| !empty($v['classes']['message_factory'])
|| !empty($v['classes']['uri_factory'])
|| !empty($v['classes']['stream_factory']);
|| !empty($v['classes']['psr17_request_factory'])
|| !empty($v['classes']['psr17_response_factory'])
|| !empty($v['classes']['psr17_uri_factory'])
|| !empty($v['classes']['psr17_stream_factory']);
})
->then(function ($v) {
foreach ($v['classes'] as $key => $class) {
Expand Down Expand Up @@ -119,9 +120,6 @@ public function getConfigTreeBuilder(): TreeBuilder
->children()
->scalarNode('client')->defaultValue('httplug.client.default')->end()
->scalarNode('psr18_client')->defaultValue('httplug.psr18_client.default')->end()
->scalarNode('message_factory')->defaultValue('httplug.message_factory.default')->end()
->scalarNode('uri_factory')->defaultValue('httplug.uri_factory.default')->end()
->scalarNode('stream_factory')->defaultValue('httplug.stream_factory.default')->end()
->scalarNode('psr17_request_factory')->defaultValue('httplug.psr17_request_factory.default')->end()
->scalarNode('psr17_response_factory')->defaultValue('httplug.psr17_response_factory.default')->end()
->scalarNode('psr17_stream_factory')->defaultValue('httplug.psr17_stream_factory.default')->end()
Expand All @@ -136,9 +134,6 @@ public function getConfigTreeBuilder(): TreeBuilder
->children()
->scalarNode('client')->defaultNull()->end()
->scalarNode('psr18_client')->defaultNull()->end()
->scalarNode('message_factory')->defaultNull()->end()
->scalarNode('uri_factory')->defaultNull()->end()
->scalarNode('stream_factory')->defaultNull()->end()
->scalarNode('psr17_request_factory')->defaultNull()->end()
->scalarNode('psr17_response_factory')->defaultNull()->end()
->scalarNode('psr17_stream_factory')->defaultNull()->end()
Expand Down Expand Up @@ -857,7 +852,7 @@ private function createCachePluginNode(): NodeDefinition
->end()
->scalarNode('stream_factory')
->info('This must be a service id to a service implementing '.StreamFactory::class)
->defaultValue('httplug.stream_factory')
->defaultValue('httplug.psr17_stream_factory')
->cannotBeEmpty()
->end()
->end()
Expand Down
4 changes: 2 additions & 2 deletions src/DependencyInjection/HttplugExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,7 @@ function ($id) {
if ($arguments['http_methods_client']) {
$container
->register($serviceId.'.http_methods', HttpMethodsClient::class)
->setArguments([new Reference($serviceId.'.http_methods.inner'), new Reference('httplug.message_factory')])
->setArguments([new Reference($serviceId.'.http_methods.inner'), new Reference('httplug.psr17_request_factory'), new Reference('httplug.psr17_stream_factory')])
->setPublic($arguments['public'] ? true : false)
->setDecoratedService($serviceId)
;
Expand All @@ -513,7 +513,7 @@ private function createUri(ContainerBuilder $container, $serviceId, $uri): void
$container
->register($serviceId, UriInterface::class)
->setPublic(false)
->setFactory([new Reference('httplug.uri_factory'), 'createUri'])
->setFactory([new Reference('httplug.psr17_uri_factory'), 'createUri'])
->addArgument($uri)
;
}
Expand Down
6 changes: 0 additions & 6 deletions src/Resources/config/data-collector.xml
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,6 @@
<argument type="service" id="httplug.collector.formatter"/>
<argument type="service" id="debug.stopwatch"/>
</service>
<service id="httplug.collector.factory.guzzle5" class="Http\HttplugBundle\Collector\ProfileClientFactory" decorates="httplug.factory.guzzle5" public="false">
<argument type="service" id="httplug.collector.factory.guzzle5.inner"/>
<argument type="service" id="httplug.collector.collector"/>
<argument type="service" id="httplug.collector.formatter"/>
<argument type="service" id="debug.stopwatch"/>
</service>
<service id="httplug.collector.factory.guzzle6" class="Http\HttplugBundle\Collector\ProfileClientFactory" decorates="httplug.factory.guzzle6" public="false">
<argument type="service" id="httplug.collector.factory.guzzle6.inner"/>
<argument type="service" id="httplug.collector.collector"/>
Expand Down
30 changes: 3 additions & 27 deletions src/Resources/config/services.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,23 +22,6 @@
</service>

<!-- Discovery with autowiring support -->
<service id="httplug.message_factory.default" class="Http\Message\MessageFactory">
<factory class="Http\Discovery\MessageFactoryDiscovery" method="find" />
</service>
<service id="Http\Message\MessageFactory" alias="httplug.message_factory" public="false" />
<service id="Http\Message\RequestFactory" alias="httplug.message_factory" public="false" />
<service id="Http\Message\ResponseFactory" alias="httplug.message_factory" public="false" />

<service id="httplug.stream_factory.default" class="Http\Message\StreamFactory">
<factory class="Http\Discovery\StreamFactoryDiscovery" method="find" />
</service>
<service id="Http\Message\StreamFactory" alias="httplug.stream_factory" public="false" />

<service id="httplug.uri_factory.default" class="Http\Message\UriFactory">
<factory class="Http\Discovery\UriFactoryDiscovery" method="find" />
</service>
<service id="Http\Message\UriFactory" alias="httplug.uri_factory" public="false" />

<service id="httplug.async_client.default" class="Http\Client\HttpAsyncClient">
<factory class="Http\Discovery\HttpAsyncClientDiscovery" method="find" />
</service>
Expand Down Expand Up @@ -80,23 +63,16 @@
<!-- ClientFactories -->
<service id="httplug.factory.auto" class="Http\HttplugBundle\ClientFactory\AutoDiscoveryFactory" public="false" />
<service id="httplug.factory.buzz" class="Http\HttplugBundle\ClientFactory\BuzzFactory" public="false">
<argument type="service" id="httplug.message_factory"/>
<argument type="service" id="httplug.psr17_response_factory"/>
</service>
<service id="httplug.factory.curl" class="Http\HttplugBundle\ClientFactory\CurlFactory" public="false">
<argument type="service" id="httplug.psr17_response_factory"/>
<argument type="service" id="httplug.psr17_stream_factory"/>
</service>
<service id="httplug.factory.guzzle5" class="Http\HttplugBundle\ClientFactory\Guzzle5Factory" public="false">
<argument type="service" id="httplug.message_factory"/>
</service>
<service id="httplug.factory.guzzle6" class="Http\HttplugBundle\ClientFactory\Guzzle6Factory" public="false" />
<service id="httplug.factory.guzzle7" class="Http\HttplugBundle\ClientFactory\Guzzle7Factory" public="false" />
<service id="httplug.factory.react" class="Http\HttplugBundle\ClientFactory\ReactFactory" public="false">
<argument type="service" id="httplug.message_factory"/>
</service>
<service id="httplug.factory.socket" class="Http\HttplugBundle\ClientFactory\SocketFactory" public="false">
<argument type="service" id="httplug.message_factory"/>
</service>
<service id="httplug.factory.react" class="Http\HttplugBundle\ClientFactory\ReactFactory" public="false" />
<service id="httplug.factory.socket" class="Http\HttplugBundle\ClientFactory\SocketFactory" public="false" />
<service id="httplug.factory.symfony" class="Http\HttplugBundle\ClientFactory\SymfonyFactory" public="false">
<argument type="service" id="httplug.psr17_response_factory"/>
<argument type="service" id="httplug.psr17_stream_factory"/>
Expand Down
3 changes: 2 additions & 1 deletion tests/Functional/DiscoveredClientsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Http\Discovery\HttpAsyncClientDiscovery;
use Http\Discovery\HttpClientDiscovery;
use Http\Discovery\Strategy\CommonClassesStrategy;
use Http\Discovery\Strategy\CommonPsr17ClassesStrategy;
use Http\HttplugBundle\Collector\ProfileClient;
use Http\HttplugBundle\Discovery\ConfiguredClientsStrategyListener;
use Nyholm\NSA;
Expand Down Expand Up @@ -131,7 +132,7 @@ protected function setUp(): void

// Reset values
$strategy = new ConfiguredClientsStrategyListener(null, null);
HttpClientDiscovery::setStrategies([CommonClassesStrategy::class]);
HttpClientDiscovery::setStrategies([CommonClassesStrategy::class, CommonPsr17ClassesStrategy::class]);
$strategy->onEvent();
}
}
Loading