Skip to content

Commit f77c327

Browse files
authored
Merge pull request #99 from clue-labs/invalid-url
Emit error event if request URL is invalid
2 parents 4e3c82f + 4d5233a commit f77c327

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

src/Request.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Evenement\EventEmitterTrait;
66
use GuzzleHttp\Psr7 as gPsr;
7+
use React\Promise;
78
use React\Socket\ConnectorInterface;
89
use React\Stream\WritableStreamInterface;
910
use React\Socket\ConnectionInterface;
@@ -80,7 +81,7 @@ function (ConnectionInterface $stream) use ($requestData, &$streamRef, &$stateRe
8081
}
8182
}
8283
},
83-
array($this, 'handleError')
84+
array($this, 'closeError')
8485
);
8586

8687
$this->on('close', function() use ($promise) {
@@ -247,10 +248,17 @@ protected function parseResponse($data)
247248

248249
protected function connect()
249250
{
251+
$scheme = $this->requestData->getScheme();
252+
if ($scheme !== 'https' && $scheme !== 'http') {
253+
return Promise\reject(
254+
new \InvalidArgumentException('Invalid request URL given')
255+
);
256+
}
257+
250258
$host = $this->requestData->getHost();
251259
$port = $this->requestData->getPort();
252260

253-
if ($this->requestData->getScheme() === 'https') {
261+
if ($scheme === 'https') {
254262
$host = 'tls://' . $host;
255263
}
256264

tests/RequestTest.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,52 @@ public function requestShouldEmitErrorIfGuzzleParseThrowsException()
226226
$request->handleData("\r\n\r\n");
227227
}
228228

229+
/**
230+
* @test
231+
*/
232+
public function requestShouldEmitErrorIfUrlIsInvalid()
233+
{
234+
$requestData = new RequestData('GET', 'ftp://www.example.com');
235+
$request = new Request($this->connector, $requestData);
236+
237+
$handler = $this->createCallableMock();
238+
$handler->expects($this->once())
239+
->method('__invoke')
240+
->with(
241+
$this->isInstanceOf('\InvalidArgumentException')
242+
);
243+
244+
$request->on('error', $handler);
245+
246+
$this->connector->expects($this->never())
247+
->method('connect');
248+
249+
$request->end();
250+
}
251+
252+
/**
253+
* @test
254+
*/
255+
public function requestShouldEmitErrorIfUrlHasNoScheme()
256+
{
257+
$requestData = new RequestData('GET', 'www.example.com');
258+
$request = new Request($this->connector, $requestData);
259+
260+
$handler = $this->createCallableMock();
261+
$handler->expects($this->once())
262+
->method('__invoke')
263+
->with(
264+
$this->isInstanceOf('\InvalidArgumentException')
265+
);
266+
267+
$request->on('error', $handler);
268+
269+
$this->connector->expects($this->never())
270+
->method('connect');
271+
272+
$request->end();
273+
}
274+
229275
/**
230276
* @test
231277
* @expectedException Exception

0 commit comments

Comments
 (0)