protected function socketWriter($socket, Channel $channel, callable $transform = null) : \Generator { $writer = new SocketWriter($socket); $len = 0; try { while (null !== ($chunk = (yield $channel->receive()))) { $len += (yield $writer->write($transform ? $transform($chunk) : $chunk)); } return $len; } catch (\Throwable $e) { $channel->close($e); throw $e; } finally { $writer->dispose(); } }
protected function handleSendfile(string $path, $socket, int $length, int $offset) : \Generator { $stream = (yield $this->readStream($path, $offset)); try { $writer = new SocketWriter($socket); $len = 0; try { while ($len < $length && null !== ($chunk = (yield $stream->read(\min(4096, $length - $len))))) { $len += (yield $writer->write($chunk)); } return $len; } finally { $writer->dispose(); } } catch (\Throwable $e) { throw new FilesystemException(\sprintf('Failed to send file: "%s"', $path), 0, $e); } finally { $stream->close(); } }