src/StreamFactory.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
namespace Pluf\Http;

use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;
use InvalidArgumentException;
use RuntimeException;

class StreamFactory implements StreamFactoryInterface
{

    /**
     *
     * {@inheritdoc}
     *
     * @throws RuntimeException
     */
    public function createStream(string $content = ''): StreamInterface
    {
        $resource = fopen('php://temp', 'rw+');

        if (! is_resource($resource)) {
            throw new RuntimeException('StreamFactory::createStream() could not open temporary file stream.');
        }

        fwrite($resource, $content);
        rewind($resource);

        return $this->createStreamFromResource($resource);
    }

    /**
     *
     * {@inheritdoc}
     */
    public function createStreamFromFile(string $filename, string $mode = 'r', StreamInterface $cache = null): StreamInterface
    {
        // When fopen fails, PHP normally raises a warning. Add an error
        // handler to check for errors and throw an exception instead.
        $exc = null;

        set_error_handler(function (int $errno, string $errstr) use ($filename, $mode, &$exc) {
            $exc = new RuntimeException(sprintf('Unable to open %s using mode %s: %s', $filename, $mode, $errstr));
        });

        $resource = fopen($filename, $mode);
        restore_error_handler();

        if ($exc) {
            /** @var RuntimeException $exc */
            throw $exc;
        }

        if (! is_resource($resource)) {
            throw new RuntimeException("StreamFactory::createStreamFromFile() could not create resource from file `$filename`");
        }

        return new Stream($resource, $cache);
    }

    /**
     *
     * {@inheritdoc}
     */
    public function createStreamFromResource($resource, StreamInterface $cache = null): StreamInterface
    {
        if (! is_resource($resource)) {
            throw new InvalidArgumentException('Parameter 1 of StreamFactory::createStreamFromResource() must be a resource.');
        }

        return new Stream($resource, $cache);
    }
}