diff --git a/src/ProtocolStreamReader.php b/src/ProtocolStreamReader.php index 699fb3c..2d0e351 100644 --- a/src/ProtocolStreamReader.php +++ b/src/ProtocolStreamReader.php @@ -6,7 +6,6 @@ namespace LanguageServer; use LanguageServer\Protocol\Message; use AdvancedJsonRpc\Message as MessageBody; use Sabre\Event\Loop; -use RuntimeException; class ProtocolStreamReader implements ProtocolReader { @@ -26,11 +25,8 @@ class ProtocolStreamReader implements ProtocolReader public function __construct($input) { $this->input = $input; - Loop\addReadStream($this->input, function () { - if (feof($this->input)) { - throw new RuntimeException('Stream is closed'); - } + Loop\addReadStream($this->input, function () { while (($c = fgetc($this->input)) !== false && $c !== '') { $this->buffer .= $c; switch ($this->parsingMode) { diff --git a/src/ProtocolStreamWriter.php b/src/ProtocolStreamWriter.php index cee9b60..2ac3579 100644 --- a/src/ProtocolStreamWriter.php +++ b/src/ProtocolStreamWriter.php @@ -4,6 +4,7 @@ declare(strict_types = 1); namespace LanguageServer; use LanguageServer\Protocol\Message; +use RuntimeException; class ProtocolStreamWriter implements ProtocolWriter { @@ -30,7 +31,16 @@ class ProtocolStreamWriter implements ProtocolWriter $totalBytesWritten = 0; while ($totalBytesWritten < $msgSize) { - $bytesWritten = fwrite($this->output, substr($data, $totalBytesWritten)); + error_clear_last(); + $bytesWritten = @fwrite($this->output, substr($data, $totalBytesWritten)); + if ($bytesWritten === false) { + $error = error_get_last(); + if ($error !== null) { + throw new RuntimeException('Could not write message: ' . error_get_last()['message']); + } else { + throw new RuntimeException('Could not write message'); + } + } $totalBytesWritten += $bytesWritten; } }