Skip to content

Commit c2d6d1a

Browse files
committed
Make http/client independent from guzzle/http
1 parent 6422163 commit c2d6d1a

3 files changed

Lines changed: 90 additions & 18 deletions

File tree

Client.php

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,15 @@
22

33
namespace React\HttpClient;
44

5-
use Guzzle\Http\Message\Request as GuzzleRequest;
65
use React\EventLoop\LoopInterface;
76
use React\HttpClient\ConnectionManager;
8-
use React\HttpClient\Request as ClientRequest;
7+
use React\HttpClient\Request;
98
use React\HttpClient\SecureConnectionManager;
109

1110
class Client
1211
{
1312
private $loop;
14-
1513
private $connectionManager;
16-
1714
private $secureConnectionManager;
1815

1916
public function __construct(LoopInterface $loop, ConnectionManagerInterface $connectionManager, ConnectionManagerInterface $secureConnectionManager)
@@ -25,9 +22,9 @@ public function __construct(LoopInterface $loop, ConnectionManagerInterface $con
2522

2623
public function request($method, $url, array $headers = array())
2724
{
28-
$guzzleRequest = new GuzzleRequest($method, $url, $headers);
29-
$connectionManager = $this->getConnectionManagerForScheme($guzzleRequest->getScheme());
30-
return new ClientRequest($this->loop, $connectionManager, $guzzleRequest);
25+
$requestData = new RequestData($method, $url, $headers);
26+
$connectionManager = $this->getConnectionManagerForScheme($requestData->getScheme());
27+
return new Request($this->loop, $connectionManager, $requestData);
3128
}
3229

3330
public function setConnectionManager(ConnectionManagerInterface $connectionManager)

Request.php

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
namespace React\HttpClient;
44

55
use Evenement\EventEmitter;
6-
use Guzzle\Http\Message\Request as GuzzleRequest;
7-
use Guzzle\Http\Url;
86
use Guzzle\Parser\Message\MessageParser;
97
use React\EventLoop\LoopInterface;
108
use React\HttpClient\ConnectionManagerInterface;
@@ -24,20 +22,21 @@ class Request extends EventEmitter implements WritableStreamInterface
2422
const STATE_HEAD_WRITTEN = 2;
2523
const STATE_END = 3;
2624

27-
private $request;
2825
private $loop;
2926
private $connectionManager;
27+
private $requestData;
28+
3029
private $stream;
3130
private $buffer;
3231
private $responseFactory;
3332
private $response;
3433
private $state = self::STATE_INIT;
3534

36-
public function __construct(LoopInterface $loop, ConnectionManagerInterface $connectionManager, GuzzleRequest $request)
35+
public function __construct(LoopInterface $loop, ConnectionManagerInterface $connectionManager, RequestData $requestData)
3736
{
3837
$this->loop = $loop;
3938
$this->connectionManager = $connectionManager;
40-
$this->request = $request;
39+
$this->requestData = $requestData;
4140
}
4241

4342
public function isWritable()
@@ -54,23 +53,23 @@ public function writeHead()
5453
$this->state = self::STATE_WRITING_HEAD;
5554

5655
$that = $this;
57-
$request = $this->request;
56+
$requestData = $this->requestData;
5857
$streamRef = &$this->stream;
5958
$stateRef = &$this->state;
6059

6160
$this
6261
->connect()
6362
->then(
64-
function ($stream) use ($that, $request, &$streamRef, &$stateRef) {
63+
function ($stream) use ($that, $requestData, &$streamRef, &$stateRef) {
6564
$streamRef = $stream;
6665

6766
$stream->on('drain', array($that, 'handleDrain'));
6867
$stream->on('data', array($that, 'handleData'));
6968
$stream->on('end', array($that, 'handleEnd'));
7069
$stream->on('error', array($that, 'handleError'));
7170

72-
$request->setProtocolVersion('1.0');
73-
$headers = (string) $request;
71+
$requestData->setProtocolVersion('1.0');
72+
$headers = (string) $requestData;
7473

7574
$stream->write($headers);
7675

@@ -215,8 +214,8 @@ protected function parseResponse($data)
215214

216215
protected function connect()
217216
{
218-
$host = $this->request->getHost();
219-
$port = $this->request->getPort();
217+
$host = $this->requestData->getHost();
218+
$port = $this->requestData->getPort();
220219

221220
return $this->connectionManager
222221
->getConnection($host, $port);

RequestData.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
namespace React\HttpClient;
4+
5+
class RequestData
6+
{
7+
private $method;
8+
private $url;
9+
private $headers;
10+
11+
private $protocolVersion = '1.1';
12+
13+
public function __construct($method, $url, array $headers = array())
14+
{
15+
$this->method = $method;
16+
$this->url = $url;
17+
$this->headers = $headers;
18+
}
19+
20+
private function mergeDefaultheaders(array $headers)
21+
{
22+
$port = (80 === $this->getPort()) ? '' : ":{$this->getPort()}";
23+
$connectionHeaders = ('1.1' === $this->protocolVersion) ? array('Connection' => 'close') : array();
24+
25+
return array_merge(
26+
array(
27+
'Host' => $this->getHost().$port,
28+
'User-Agent' => 'React/alpha',
29+
),
30+
$connectionHeaders,
31+
$headers
32+
);
33+
}
34+
35+
public function getScheme()
36+
{
37+
return parse_url($this->url, PHP_URL_SCHEME);
38+
}
39+
40+
public function getHost()
41+
{
42+
return parse_url($this->url, PHP_URL_HOST);
43+
}
44+
45+
public function getPort()
46+
{
47+
return (int) parse_url($this->url, PHP_URL_PORT) ?: 80;
48+
}
49+
50+
public function getPath()
51+
{
52+
$path = parse_url($this->url, PHP_URL_PATH) ?: '/';
53+
$queryString = parse_url($this->url, PHP_URL_QUERY);
54+
55+
return $path.($queryString ? "?$queryString" : '');
56+
}
57+
58+
public function setProtocolVersion($version)
59+
{
60+
$this->protocolVersion = $version;
61+
}
62+
63+
public function __toString()
64+
{
65+
$headers = $this->mergeDefaultheaders($this->headers);
66+
67+
$data = '';
68+
$data .= "{$this->method} {$this->getPath()} HTTP/{$this->protocolVersion}\r\n";
69+
foreach ($headers as $name => $value) {
70+
$data .= "$name: $value\r\n";
71+
}
72+
$data .= "\r\n";
73+
74+
return $data;
75+
}
76+
}

0 commit comments

Comments
 (0)