Skip to content

Commit 26a4fcd

Browse files
committed
Add test for handling client disconnects
1 parent 7fb87f8 commit 26a4fcd

2 files changed

Lines changed: 43 additions & 2 deletions

File tree

src/Responder.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ public function __invoke(Socket $socket): \Generator
4949
$header[] = "Content-Length: {$this->bufferer->getCurrentProgress()}";
5050
}
5151

52-
yield $socket->write(implode("\r\n", $header)."\r\n\r\n");
53-
5452
$progressBar = new ProgressBar(
5553
$this->consoleOutput->section(),
5654
$this->bufferer->getCurrentProgress(),
@@ -61,6 +59,8 @@ public function __invoke(Socket $socket): \Generator
6159
$handle = new ResourceInputStream(fopen($this->bufferer->getFilePath(), 'rb'));
6260

6361
try {
62+
yield $socket->write(implode("\r\n", $header)."\r\n\r\n");
63+
6464
while (true) {
6565
$buffererProgress = $this->bufferer->getCurrentProgress();
6666

tests/ResponderTest.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Ostrolucky\Stdinho\Tests;
6+
7+
use Amp\Coroutine;
8+
use Amp\Socket\ClientSocket;
9+
use Amp\Success;
10+
use Ostrolucky\Stdinho\Bufferer\ResolvedBufferer;
11+
use Ostrolucky\Stdinho\Responder;
12+
use PHPUnit\Framework\TestCase;
13+
use Psr\Log\Test\TestLogger;
14+
use Symfony\Component\Console\Output\ConsoleOutput;
15+
use function Amp\Promise\wait;
16+
17+
class ResponderTest extends TestCase
18+
{
19+
public function testResponderHandlesClientAbruptDisconnect(): void
20+
{
21+
$responder = new Responder(
22+
$logger = new TestLogger(),
23+
new ResolvedBufferer(__FILE__),
24+
$this->createMock(ConsoleOutput::class)
25+
);
26+
27+
$socket = $this->getMockBuilder(ClientSocket::class)
28+
->setConstructorArgs([$resource = fopen('php://memory', 'rw')])
29+
->setMethods(['read', 'getRemoteAddress'])
30+
->getMock()
31+
;
32+
33+
$socket->method('read')->willReturn(new Success(''));
34+
35+
fclose($resource);
36+
37+
wait(new Coroutine($responder->__invoke($socket)));
38+
39+
self::assertTrue($logger->hasDebugThatContains('aborted download'));
40+
}
41+
}

0 commit comments

Comments
 (0)