Skip to content

Commit b46e8e6

Browse files
committed
Merge branch 'refs/heads/0.3-buffer-fix' into 0.3
2 parents 0dac387 + 1590ea7 commit b46e8e6

File tree

2 files changed

+34
-9
lines changed

2 files changed

+34
-9
lines changed

src/React/Stream/Buffer.php

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

55
use Evenement\EventEmitter;
66
use React\EventLoop\LoopInterface;
7-
use React\Stream\WritableStreamInterface;
87

98
/** @event full-drain */
109
class Buffer extends EventEmitter implements WritableStreamInterface
@@ -21,16 +20,11 @@ class Buffer extends EventEmitter implements WritableStreamInterface
2120
'file' => '',
2221
'line' => 0,
2322
);
24-
private $meta;
2523

2624
public function __construct($stream, LoopInterface $loop)
2725
{
2826
$this->stream = $stream;
2927
$this->loop = $loop;
30-
31-
if (is_resource($stream)) {
32-
$this->meta = stream_get_meta_data($stream);
33-
}
3428
}
3529

3630
public function isWritable()
@@ -83,8 +77,8 @@ public function close()
8377

8478
public function handleWrite()
8579
{
86-
if (!is_resource($this->stream) || ('generic_socket' === $this->meta['stream_type'] && feof($this->stream))) {
87-
$this->emit('error', array(new \RuntimeException('Tried to write to closed or invalid stream.')));
80+
if (!is_resource($this->stream)) {
81+
$this->emit('error', array(new \RuntimeException('Tried to write to invalid stream.'), $this));
8882

8983
return;
9084
}
@@ -107,6 +101,12 @@ public function handleWrite()
107101
return;
108102
}
109103

104+
if (0 === $sent && feof($this->stream)) {
105+
$this->emit('error', array(new \RuntimeException('Tried to write to closed stream.'), $this));
106+
107+
return;
108+
}
109+
110110
$len = strlen($this->data);
111111
if ($len >= $this->softLimit && $len - $sent < $this->softLimit) {
112112
$this->emit('drain');

tests/React/Tests/Stream/BufferTest.php

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,32 @@ public function testError()
184184

185185
$buffer->write('Attempting to write to bad stream');
186186
$this->assertInstanceOf('Exception', $error);
187-
$this->assertSame('Tried to write to closed or invalid stream.', $error->getMessage());
187+
$this->assertSame('Tried to write to invalid stream.', $error->getMessage());
188+
}
189+
190+
public function testWritingToClosedStream()
191+
{
192+
if ('Darwin' === PHP_OS) {
193+
$this->markTestSkipped('OS X issue with shutting down pair for writing');
194+
}
195+
196+
list($a, $b) = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
197+
$loop = $this->createWriteableLoopMock();
198+
199+
$error = null;
200+
201+
$buffer = new Buffer($a, $loop);
202+
$buffer->on('error', function($message) use (&$error) {
203+
$error = $message;
204+
});
205+
206+
$buffer->write('foo');
207+
stream_socket_shutdown($b, STREAM_SHUT_RD);
208+
stream_socket_shutdown($a, STREAM_SHUT_RD);
209+
$buffer->write('bar');
210+
211+
$this->assertInstanceOf('Exception', $error);
212+
$this->assertSame('Tried to write to closed stream.', $error->getMessage());
188213
}
189214

190215
private function createWriteableLoopMock()

0 commit comments

Comments
 (0)