Skip to content

Commit fc531a2

Browse files
committed
Remove internal Response class, use PSR-7 response instead
1 parent cb9ced0 commit fc531a2

File tree

6 files changed

+36
-514
lines changed

6 files changed

+36
-514
lines changed

src/Client/Request.php

Lines changed: 4 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ public function handleData($data)
138138
// buffer until double CRLF (or double LF for compatibility with legacy servers)
139139
if (false !== strpos($this->buffer, "\r\n\r\n") || false !== strpos($this->buffer, "\n\n")) {
140140
try {
141-
list($response, $bodyChunk) = $this->parseResponse($this->buffer);
141+
$response = gPsr\parse_response($this->buffer);
142+
$bodyChunk = (string) $response->getBody();
142143
} catch (\InvalidArgumentException $exception) {
143144
$this->emit('error', array($exception));
144145
}
@@ -155,17 +156,9 @@ public function handleData($data)
155156
return;
156157
}
157158

158-
$response->on('close', array($this, 'close'));
159-
$that = $this;
160-
$response->on('error', function (\Exception $error) use ($that) {
161-
$that->closeError(new \RuntimeException(
162-
"An error occured in the response",
163-
0,
164-
$error
165-
));
166-
});
159+
$this->stream->on('close', array($this, 'handleClose'));
167160

168-
$this->emit('response', array($response, $this));
161+
$this->emit('response', array($response, $this->stream));
169162

170163
$this->stream->emit('data', array($bodyChunk));
171164
}
@@ -222,30 +215,6 @@ public function close()
222215
$this->removeAllListeners();
223216
}
224217

225-
protected function parseResponse($data)
226-
{
227-
$psrResponse = gPsr\parse_response($data);
228-
$headers = array_map(function($val) {
229-
if (1 === count($val)) {
230-
$val = $val[0];
231-
}
232-
233-
return $val;
234-
}, $psrResponse->getHeaders());
235-
236-
$factory = $this->getResponseFactory();
237-
238-
$response = $factory(
239-
'HTTP',
240-
$psrResponse->getProtocolVersion(),
241-
$psrResponse->getStatusCode(),
242-
$psrResponse->getReasonPhrase(),
243-
$headers
244-
);
245-
246-
return array($response, (string)($psrResponse->getBody()));
247-
}
248-
249218
protected function connect()
250219
{
251220
$scheme = $this->requestData->getScheme();
@@ -265,31 +234,4 @@ protected function connect()
265234
return $this->connector
266235
->connect($host . ':' . $port);
267236
}
268-
269-
public function setResponseFactory($factory)
270-
{
271-
$this->responseFactory = $factory;
272-
}
273-
274-
public function getResponseFactory()
275-
{
276-
if (null === $factory = $this->responseFactory) {
277-
$stream = $this->stream;
278-
279-
$factory = function ($protocol, $version, $code, $reasonPhrase, $headers) use ($stream) {
280-
return new Response(
281-
$stream,
282-
$protocol,
283-
$version,
284-
$code,
285-
$reasonPhrase,
286-
$headers
287-
);
288-
};
289-
290-
$this->responseFactory = $factory;
291-
}
292-
293-
return $factory;
294-
}
295237
}

src/Client/Response.php

Lines changed: 0 additions & 173 deletions
This file was deleted.

src/Io/Sender.php

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace React\Http\Io;
44

55
use Psr\Http\Message\RequestInterface;
6+
use Psr\Http\Message\ResponseInterface;
67
use React\EventLoop\LoopInterface;
78
use React\Http\Client\Client as HttpClient;
89
use React\Http\Client\Response as ResponseStream;
@@ -108,26 +109,18 @@ public function send(RequestInterface $request)
108109
$deferred->reject($error);
109110
});
110111

111-
$requestStream->on('response', function (ResponseStream $responseStream) use ($deferred, $request) {
112+
$requestStream->on('response', function (ResponseInterface $response, ReadableStreamInterface $body) use ($deferred, $request) {
112113
$length = null;
113-
$body = $responseStream;
114-
$code = $responseStream->getCode();
114+
$code = $response->getStatusCode();
115115
if ($request->getMethod() === 'HEAD' || ($code >= 100 && $code < 200) || $code == 204 || $code == 304) {
116116
$length = 0;
117-
} elseif (\strtolower($responseStream->getHeaderLine('Transfer-Encoding')) === 'chunked') {
117+
} elseif (\strtolower($response->getHeaderLine('Transfer-Encoding')) === 'chunked') {
118118
$body = new ChunkedDecoder($body);
119-
} elseif ($responseStream->hasHeader('Content-Length')) {
120-
$length = (int) $responseStream->getHeaderLine('Content-Length');
119+
} elseif ($response->hasHeader('Content-Length')) {
120+
$length = (int) $response->getHeaderLine('Content-Length');
121121
}
122122

123-
// apply response header values from response stream
124-
$deferred->resolve(new Response(
125-
$responseStream->getCode(),
126-
$responseStream->getHeaders(),
127-
new ReadableBodyStream($body, $length),
128-
$responseStream->getVersion(),
129-
$responseStream->getReasonPhrase()
130-
));
123+
$deferred->resolve($response->withBody(new ReadableBodyStream($body, $length)));
131124
});
132125

133126
if ($body instanceof ReadableStreamInterface) {

tests/Client/FunctionalIntegrationTest.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
namespace React\Tests\Http\Client;
44

55
use Clue\React\Block;
6+
use Psr\Http\Message\ResponseInterface;
67
use React\EventLoop\Factory;
78
use React\Http\Client\Client;
8-
use React\Http\Client\Response;
99
use React\Promise\Deferred;
1010
use React\Promise\Stream;
1111
use React\Socket\Server;
1212
use React\Socket\ConnectionInterface;
13+
use React\Stream\ReadableStreamInterface;
1314
use React\Tests\Http\TestCase;
1415

1516
class FunctionalIntegrationTest extends TestCase
@@ -69,8 +70,8 @@ public function testRequestLegacyHttpServerWithOnlyLineFeedReturnsSuccessfulResp
6970
$request = $client->request('GET', str_replace('tcp:', 'http:', $server->getAddress()));
7071

7172
$once = $this->expectCallableOnceWith('body');
72-
$request->on('response', function (Response $response) use ($once) {
73-
$response->on('data', $once);
73+
$request->on('response', function (ResponseInterface $response, ReadableStreamInterface $body) use ($once) {
74+
$body->on('data', $once);
7475
});
7576

7677
$promise = Stream\first($request, 'close');
@@ -88,8 +89,8 @@ public function testSuccessfulResponseEmitsEnd()
8889
$request = $client->request('GET', 'http://www.google.com/');
8990

9091
$once = $this->expectCallableOnce();
91-
$request->on('response', function (Response $response) use ($once) {
92-
$response->on('end', $once);
92+
$request->on('response', function (ResponseInterface $response, ReadableStreamInterface $body) use ($once) {
93+
$body->on('end', $once);
9394
});
9495

9596
$promise = Stream\first($request, 'close');
@@ -112,8 +113,8 @@ public function testPostDataReturnsData()
112113
$request = $client->request('POST', 'https://' . (mt_rand(0, 1) === 0 ? 'eu.' : '') . 'httpbin.org/post', array('Content-Length' => strlen($data)));
113114

114115
$deferred = new Deferred();
115-
$request->on('response', function (Response $response) use ($deferred) {
116-
$deferred->resolve(Stream\buffer($response));
116+
$request->on('response', function (ResponseInterface $response, ReadableStreamInterface $body) use ($deferred) {
117+
$deferred->resolve(Stream\buffer($body));
117118
});
118119

119120
$request->on('error', 'printf');
@@ -145,8 +146,8 @@ public function testPostJsonReturnsData()
145146
$request = $client->request('POST', 'https://httpbin.org/post', array('Content-Length' => strlen($data), 'Content-Type' => 'application/json'));
146147

147148
$deferred = new Deferred();
148-
$request->on('response', function (Response $response) use ($deferred) {
149-
$deferred->resolve(Stream\buffer($response));
149+
$request->on('response', function (ResponseInterface $response, ReadableStreamInterface $body) use ($deferred) {
150+
$deferred->resolve(Stream\buffer($body));
150151
});
151152

152153
$request->on('error', 'printf');

0 commit comments

Comments
 (0)