Skip to content

Commit c37fb62

Browse files
committed
Add message factories
1 parent ab4224f commit c37fb62

17 files changed

+499
-0
lines changed

composer.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,25 @@
1616
"php-http/message-factory": "^1.0"
1717
},
1818
"require-dev": {
19+
"zendframework/zend-diactoros": "^1.0",
20+
"guzzlehttp/psr7": "^1.0",
1921
"phpspec/phpspec": "^2.4",
2022
"henrikbjorn/phpspec-code-coverage" : "^1.0"
2123
},
24+
"suggest": {
25+
"zendframework/zend-diactoros": "Used with Diactoros Factories",
26+
"guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories"
27+
},
2228
"autoload": {
2329
"psr-4": {
2430
"Http\\Message\\": "src/"
2531
}
2632
},
33+
"autoload-dev": {
34+
"psr-4": {
35+
"spec\\Http\\Message\\": "spec/"
36+
}
37+
},
2738
"scripts": {
2839
"test": "vendor/bin/phpspec run",
2940
"test-ci": "vendor/bin/phpspec run -c phpspec.yml.ci"

puli.json

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"version": "1.0",
3+
"bindings": {
4+
"064d003d-78a1-48c4-8f3b-1f92ff25da69": {
5+
"_class": "Puli\\Discovery\\Binding\\ClassBinding",
6+
"class": "Http\\Message\\MessageFactory\\DiactorosMessageFactory",
7+
"type": "Http\\Message\\MessageFactory",
8+
"parameters": {
9+
"depends": "Zend\\Diactoros\\Request"
10+
}
11+
},
12+
"2438c2d0-0658-441f-8855-ddaf0f87d54d": {
13+
"_class": "Puli\\Discovery\\Binding\\ClassBinding",
14+
"class": "Http\\Message\\MessageFactory\\GuzzleMessageFactory",
15+
"type": "Http\\Message\\MessageFactory",
16+
"parameters": {
17+
"depends": "GuzzleHttp\\Psr7\\Request"
18+
}
19+
},
20+
"273a34f9-62f4-4ba1-9801-b1284d49ff89": {
21+
"_class": "Puli\\Discovery\\Binding\\ClassBinding",
22+
"class": "Http\\Message\\StreamFactory\\GuzzleStreamFactory",
23+
"type": "Http\\Message\\StreamFactory",
24+
"parameters": {
25+
"depends": "GuzzleHttp\\Psr7\\Stream"
26+
}
27+
},
28+
"304b83db-b594-4d83-ae75-1f633adf92f7": {
29+
"_class": "Puli\\Discovery\\Binding\\ClassBinding",
30+
"class": "Http\\Message\\UriFactory\\GuzzleUriFactory",
31+
"type": "Http\\Message\\UriFactory",
32+
"parameters": {
33+
"depends": "GuzzleHttp\\Psr7\\Uri"
34+
}
35+
},
36+
"3f4bc1cd-aa95-4702-9fa7-65408e471691": {
37+
"_class": "Puli\\Discovery\\Binding\\ClassBinding",
38+
"class": "Http\\Message\\UriFactory\\DiactorosUriFactory",
39+
"type": "Http\\Message\\UriFactory",
40+
"parameters": {
41+
"depends": "Zend\\Diactoros\\Uri"
42+
}
43+
},
44+
"95c1be8f-39fe-4abd-8351-92cb14379a75": {
45+
"_class": "Puli\\Discovery\\Binding\\ClassBinding",
46+
"class": "Http\\Message\\StreamFactory\\DiactorosStreamFactory",
47+
"type": "Http\\Message\\StreamFactory",
48+
"parameters": {
49+
"depends": "Zend\\Diactoros\\Stream"
50+
}
51+
}
52+
}
53+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace spec\Http\Message\MessageFactory;
4+
5+
use PhpSpec\ObjectBehavior;
6+
use spec\Http\Message\MessageFactoryBehavior;
7+
8+
class DiactorosMessageFactorySpec extends ObjectBehavior
9+
{
10+
use MessageFactoryBehavior;
11+
12+
function it_is_initializable()
13+
{
14+
$this->shouldHaveType('Http\Message\MessageFactory\DiactorosMessageFactory');
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace spec\Http\Message\MessageFactory;
4+
5+
use PhpSpec\ObjectBehavior;
6+
use spec\Http\Message\MessageFactoryBehavior;
7+
8+
class GuzzleMessageFactorySpec extends ObjectBehavior
9+
{
10+
use MessageFactoryBehavior;
11+
12+
function it_is_initializable()
13+
{
14+
$this->shouldHaveType('Http\Message\MessageFactory\GuzzleMessageFactory');
15+
}
16+
}

spec/MessageFactoryBehavior.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace spec\Http\Message;
4+
5+
trait MessageFactoryBehavior
6+
{
7+
function it_is_a_message_factory()
8+
{
9+
$this->shouldImplement('Http\Message\MessageFactory');
10+
}
11+
12+
function it_creates_a_request()
13+
{
14+
$request = $this->createRequest('GET', '/');
15+
16+
$request->shouldHaveType('Psr\Http\Message\RequestInterface');
17+
$request->getMethod()->shouldReturn('GET');
18+
$request->getRequestTarget()->shouldReturn('/');
19+
}
20+
21+
function it_creates_a_response()
22+
{
23+
$response = $this->createResponse();
24+
25+
$response->shouldHaveType('Psr\Http\Message\ResponseInterface');
26+
}
27+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace spec\Http\Message\StreamFactory;
4+
5+
use Zend\Diactoros\Stream;
6+
use PhpSpec\ObjectBehavior;
7+
use spec\Http\Message\StreamFactoryBehavior;
8+
9+
class DiactorosStreamFactorySpec extends ObjectBehavior
10+
{
11+
use StreamFactoryBehavior;
12+
13+
function it_is_initializable()
14+
{
15+
$this->shouldHaveType('Http\Message\StreamFactory\DiactorosStreamFactory');
16+
}
17+
18+
function it_creates_a_stream_from_stream()
19+
{
20+
$this->createStream(new Stream('php://memory'))
21+
->shouldHaveType('Psr\Http\Message\StreamInterface');
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace spec\Http\Message\StreamFactory;
4+
5+
use GuzzleHttp\Psr7\Stream;
6+
use PhpSpec\ObjectBehavior;
7+
use spec\Http\Message\StreamFactoryBehavior;
8+
9+
class GuzzleStreamFactorySpec extends ObjectBehavior
10+
{
11+
use StreamFactoryBehavior;
12+
13+
public function it_is_initializable()
14+
{
15+
$this->shouldHaveType('Http\Message\StreamFactory\GuzzleStreamFactory');
16+
}
17+
18+
public function it_creates_a_stream_from_stream()
19+
{
20+
$this->createStream(new Stream(fopen('php://memory', 'rw')))
21+
->shouldHaveType('Psr\Http\Message\StreamInterface');
22+
}
23+
}

spec/StreamFactoryBehavior.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace spec\Http\Message;
4+
5+
trait StreamFactoryBehavior
6+
{
7+
function it_is_a_stream_factory()
8+
{
9+
$this->shouldImplement('Http\Message\StreamFactory');
10+
}
11+
12+
function it_creates_a_stream_from_string()
13+
{
14+
$this->createStream('foo')->shouldHaveType('Psr\Http\Message\StreamInterface');
15+
}
16+
17+
function it_creates_a_stream_from_resource()
18+
{
19+
$this->createStream(fopen('php://memory', 'rw'))
20+
->shouldHaveType('Psr\Http\Message\StreamInterface');
21+
}
22+
23+
function it_creates_a_stream_from_null()
24+
{
25+
$this->createStream(null)->shouldHaveType('Psr\Http\Message\StreamInterface');
26+
}
27+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace spec\Http\Message\UriFactory;
4+
5+
use Psr\Http\Message\UriInterface;
6+
use PhpSpec\ObjectBehavior;
7+
use spec\Http\Message\UriFactoryBehavior;
8+
9+
class DiactorosUriFactorySpec extends ObjectBehavior
10+
{
11+
use UriFactoryBehavior;
12+
13+
function it_is_initializable()
14+
{
15+
$this->shouldHaveType('Http\Message\UriFactory\DiactorosUriFactory');
16+
}
17+
18+
/**
19+
* TODO: Remove this when https://github.com/phpspec/phpspec/issues/825 is resolved
20+
*/
21+
function it_creates_a_uri_from_uri(UriInterface $uri)
22+
{
23+
$this->createUri($uri)->shouldReturn($uri);
24+
}
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace spec\Http\Message\UriFactory;
4+
5+
use Psr\Http\Message\UriInterface;
6+
use PhpSpec\ObjectBehavior;
7+
use spec\Http\Message\UriFactoryBehavior;
8+
9+
class GuzzleUriFactorySpec extends ObjectBehavior
10+
{
11+
use UriFactoryBehavior;
12+
13+
function it_is_initializable()
14+
{
15+
$this->shouldHaveType('Http\Message\UriFactory\GuzzleUriFactory');
16+
}
17+
18+
/**
19+
* TODO: Remove this when https://github.com/phpspec/phpspec/issues/825 is resolved
20+
*/
21+
function it_creates_a_uri_from_uri(UriInterface $uri)
22+
{
23+
$this->createUri($uri)->shouldReturn($uri);
24+
}
25+
}

spec/UriFactoryBehavior.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace spec\Http\Message;
4+
5+
use Psr\Http\Message\UriInterface;
6+
7+
trait UriFactoryBehavior
8+
{
9+
function it_is_a_uri_factory()
10+
{
11+
$this->shouldImplement('Http\Message\UriFactory');
12+
}
13+
14+
function it_creates_a_uri_from_string()
15+
{
16+
$this->createUri('http://php-http.org')->shouldHaveType('Psr\Http\Message\UriInterface');
17+
}
18+
19+
function it_creates_a_uri_from_uri(UriInterface $uri)
20+
{
21+
$this->createUri($uri)->shouldReturn($uri);
22+
}
23+
24+
function it_throws_an_exception_when_uri_is_invalid()
25+
{
26+
$this->shouldThrow('InvalidArgumentException')->duringCreateUri(null);
27+
}
28+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
namespace Http\Message\MessageFactory;
4+
5+
use Http\Message\StreamFactory\DiactorosStreamFactory;
6+
use Http\Message\MessageFactory;
7+
use Zend\Diactoros\Request;
8+
use Zend\Diactoros\Response;
9+
10+
/**
11+
* Creates Diactoros messages.
12+
*
13+
* @author GeLo <geloen.eric@gmail.com>
14+
*/
15+
final class DiactorosMessageFactory implements MessageFactory
16+
{
17+
/**
18+
* @var DiactorosStreamFactory
19+
*/
20+
private $streamFactory;
21+
22+
public function __construct()
23+
{
24+
$this->streamFactory = new DiactorosStreamFactory();
25+
}
26+
27+
/**
28+
* {@inheritdoc}
29+
*/
30+
public function createRequest(
31+
$method,
32+
$uri,
33+
array $headers = [],
34+
$body = null,
35+
$protocolVersion = '1.1'
36+
) {
37+
return (new Request(
38+
$uri,
39+
$method,
40+
$this->streamFactory->createStream($body),
41+
$headers
42+
))->withProtocolVersion($protocolVersion);
43+
}
44+
45+
/**
46+
* {@inheritdoc}
47+
*/
48+
public function createResponse(
49+
$statusCode = 200,
50+
$reasonPhrase = null,
51+
array $headers = [],
52+
$body = null,
53+
$protocolVersion = '1.1'
54+
) {
55+
return (new Response(
56+
$this->streamFactory->createStream($body),
57+
$statusCode,
58+
$headers
59+
))->withProtocolVersion($protocolVersion);
60+
}
61+
}

0 commit comments

Comments
 (0)