Skip to content

Commit a29a7e5

Browse files
committed
Added BaseHostPlugin
1 parent 3d77e7d commit a29a7e5

File tree

2 files changed

+149
-0
lines changed

2 files changed

+149
-0
lines changed

spec/BaseHostPluginSpec.php

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
namespace spec\Http\Client\Plugin;
4+
5+
use Http\Message\StreamFactory;
6+
use Http\Message\UriFactory;
7+
use Http\Promise\FulfilledPromise;
8+
use Psr\Http\Message\RequestInterface;
9+
use Psr\Http\Message\ResponseInterface;
10+
use Psr\Http\Message\StreamInterface;
11+
use Psr\Http\Message\UriInterface;
12+
use PhpSpec\ObjectBehavior;
13+
use Prophecy\Argument;
14+
15+
class BaseHostPluginSpec extends ObjectBehavior
16+
{
17+
function let(UriInterface $uri)
18+
{
19+
$this->beConstructedWith($uri);
20+
}
21+
22+
function it_is_initializable()
23+
{
24+
$this->shouldHaveType('Http\Client\Plugin\BaseHostPlugin');
25+
}
26+
27+
function it_is_a_plugin()
28+
{
29+
$this->shouldImplement('Http\Client\Plugin\Plugin');
30+
}
31+
32+
function it_adds_domain(
33+
RequestInterface $request,
34+
UriInterface $baseUri,
35+
UriInterface $uri
36+
) {
37+
$baseUri->getScheme()->shouldBeCalled()->willReturn('http://');
38+
$baseUri->getHost()->shouldBeCalled()->willReturn('example.com');
39+
40+
$request->getUri()->shouldBeCalled()->willReturn($uri);
41+
$request->withUri($uri)->shouldBeCalled()->willReturn($request);
42+
43+
$uri->withScheme('http://')->shouldBeCalled()->willReturn($uri);
44+
$uri->withHost('example.com')->shouldBeCalled()->willReturn($uri);
45+
$uri->getHost()->shouldBeCalled()->willReturn('');
46+
47+
$this->beConstructedWith($baseUri);
48+
$this->handleRequest($request, function () {}, function () {});
49+
}
50+
51+
function it_replaces_domain(
52+
RequestInterface $request,
53+
UriInterface $baseUri,
54+
UriInterface $uri
55+
) {
56+
$baseUri->getScheme()->shouldBeCalled()->willReturn('http://');
57+
$baseUri->getHost()->shouldBeCalled()->willReturn('example.com');
58+
59+
$request->getUri()->shouldBeCalled()->willReturn($uri);
60+
$request->withUri($uri)->shouldBeCalled()->willReturn($request);
61+
62+
$uri->withScheme('http://')->shouldBeCalled()->willReturn($uri);
63+
$uri->withHost('example.com')->shouldBeCalled()->willReturn($uri);
64+
65+
66+
$this->beConstructedWith($baseUri, ['replace'=>true]);
67+
$this->handleRequest($request, function () {}, function () {});
68+
}
69+
70+
function it_does_nothing_when_domain_exists(
71+
RequestInterface $request,
72+
UriInterface $baseUri,
73+
UriInterface $uri
74+
) {
75+
$request->getUri()->shouldBeCalled()->willReturn($uri);
76+
$uri->getHost()->shouldBeCalled()->willReturn('default.com');
77+
78+
$this->beConstructedWith($baseUri);
79+
$this->handleRequest($request, function () {}, function () {});
80+
}
81+
}

src/BaseHostPlugin.php

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
namespace Http\Client\Plugin;
4+
5+
use Psr\Http\Message\RequestInterface;
6+
use Psr\Http\Message\UriInterface;
7+
use Symfony\Component\OptionsResolver\OptionsResolver;
8+
9+
/**
10+
* Allow to modify the the schema and the host of an existing request.
11+
*
12+
* @author Tobias Nyholm <[email protected]>
13+
*/
14+
class BaseHostPlugin implements Plugin
15+
{
16+
/**
17+
* @var UriInterface
18+
*/
19+
private $baseUri;
20+
21+
/**
22+
* @var bool
23+
*/
24+
private $replace;
25+
26+
/**
27+
* @param UriInterface $baseUri
28+
* @param array $config {
29+
* @var bool $replace True will replace all hosts, false will only add host when none is specified.
30+
* }
31+
*/
32+
public function __construct(UriInterface $baseUri, array $config = [])
33+
{
34+
$this->baseUri = $baseUri;
35+
36+
$resolver = new OptionsResolver();
37+
$this->configureOptions($resolver);
38+
$options = $resolver->resolve($config);
39+
40+
$this->replace = $options['replace'];
41+
}
42+
43+
/**
44+
* {@inheritdoc}
45+
*/
46+
public function handleRequest(RequestInterface $request, callable $next, callable $first)
47+
{
48+
if ($this->replace || $request->getUri()->getHost() === '') {
49+
$uri = $request->getUri()->withHost($this->baseUri->getHost());
50+
$uri = $uri->withScheme($this->baseUri->getScheme());
51+
52+
$request = $request->withUri($uri);
53+
}
54+
55+
return $next($request);
56+
}
57+
58+
/**
59+
* @param OptionsResolver $resolver
60+
*/
61+
private function configureOptions(OptionsResolver $resolver)
62+
{
63+
$resolver->setDefaults([
64+
'replace' => false,
65+
]);
66+
$resolver->setAllowedTypes('replace', 'bool');
67+
}
68+
}

0 commit comments

Comments
 (0)