Skip to content

Commit aac95e6

Browse files
authored
Merge pull request #107 from WyriHaximus-labs/bug-fix-close-underlying-stream
Close the underlying stream when closing the stream
2 parents bd19f2f + 6de7bc0 commit aac95e6

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

src/WritableResourceStream.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ public function close()
9494

9595
$this->emit('close', array($this));
9696
$this->removeAllListeners();
97+
98+
$this->handleClose();
99+
}
100+
101+
/** @internal */
102+
public function handleClose()
103+
{
104+
if (is_resource($this->stream)) {
105+
fclose($this->stream);
106+
}
97107
}
98108

99109
/** @internal */

tests/WritableStreamResourceTest.php

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

33
namespace React\Tests\Stream;
44

5+
use Clue\StreamFilter as Filter;
56
use React\Stream\WritableResourceStream;
67

78
class WritableResourceStreamTest extends TestCase
@@ -294,19 +295,24 @@ public function testEndWithoutDataDoesNotCloseIfWritableResourceStreamIsFull()
294295
public function testEndWithDataClosesImmediatelyIfWritableResourceStreamFlushes()
295296
{
296297
$stream = fopen('php://temp', 'r+');
298+
$filterBuffer = '';
297299
$loop = $this->createLoopMock();
298300

299301
$buffer = new WritableResourceStream($stream, $loop);
300302
$buffer->on('error', $this->expectCallableNever());
301303
$buffer->on('close', $this->expectCallableOnce());
302304

305+
Filter\append($stream, function ($chunk) use (&$filterBuffer) {
306+
$filterBuffer .= $chunk;
307+
return $chunk;
308+
});
309+
303310
$this->assertTrue($buffer->isWritable());
304311
$buffer->end('final words');
305312
$this->assertFalse($buffer->isWritable());
306313

307314
$buffer->handleWrite();
308-
rewind($stream);
309-
$this->assertSame('final words', stream_get_contents($stream));
315+
$this->assertSame('final words', $filterBuffer);
310316
}
311317

312318
/**
@@ -402,16 +408,22 @@ public function testDoubleCloseWillEmitOnlyOnce()
402408
public function testWritingToClosedWritableResourceStreamShouldNotWriteToStream()
403409
{
404410
$stream = fopen('php://temp', 'r+');
411+
$filterBuffer = '';
405412
$loop = $this->createLoopMock();
406413

407414
$buffer = new WritableResourceStream($stream, $loop);
415+
416+
Filter\append($stream, function ($chunk) use (&$filterBuffer) {
417+
$filterBuffer .= $chunk;
418+
return $chunk;
419+
});
420+
408421
$buffer->close();
409422

410423
$buffer->write('foo');
411424

412425
$buffer->handleWrite();
413-
rewind($stream);
414-
$this->assertSame('', stream_get_contents($stream));
426+
$this->assertSame('', $filterBuffer);
415427
}
416428

417429
/**

0 commit comments

Comments
 (0)