1<?php 2 3declare(strict_types=1); 4 5namespace GuzzleHttp\Psr7; 6 7use Psr\Http\Message\RequestFactoryInterface; 8use Psr\Http\Message\RequestInterface; 9use Psr\Http\Message\ResponseFactoryInterface; 10use Psr\Http\Message\ResponseInterface; 11use Psr\Http\Message\ServerRequestFactoryInterface; 12use Psr\Http\Message\ServerRequestInterface; 13use Psr\Http\Message\StreamFactoryInterface; 14use Psr\Http\Message\StreamInterface; 15use Psr\Http\Message\UploadedFileFactoryInterface; 16use Psr\Http\Message\UploadedFileInterface; 17use Psr\Http\Message\UriFactoryInterface; 18use Psr\Http\Message\UriInterface; 19 20/** 21 * Implements all of the PSR-17 interfaces. 22 * 23 * Note: in consuming code it is recommended to require the implemented interfaces 24 * and inject the instance of this class multiple times. 25 */ 26final class HttpFactory implements RequestFactoryInterface, ResponseFactoryInterface, ServerRequestFactoryInterface, StreamFactoryInterface, UploadedFileFactoryInterface, UriFactoryInterface 27{ 28 public function createUploadedFile( 29 StreamInterface $stream, 30 int $size = null, 31 int $error = \UPLOAD_ERR_OK, 32 string $clientFilename = null, 33 string $clientMediaType = null 34 ): UploadedFileInterface { 35 if ($size === null) { 36 $size = $stream->getSize(); 37 } 38 39 return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType); 40 } 41 42 public function createStream(string $content = ''): StreamInterface 43 { 44 return Utils::streamFor($content); 45 } 46 47 public function createStreamFromFile(string $file, string $mode = 'r'): StreamInterface 48 { 49 try { 50 $resource = Utils::tryFopen($file, $mode); 51 } catch (\RuntimeException $e) { 52 if ('' === $mode || false === \in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], true)) { 53 throw new \InvalidArgumentException(sprintf('Invalid file opening mode "%s"', $mode), 0, $e); 54 } 55 56 throw $e; 57 } 58 59 return Utils::streamFor($resource); 60 } 61 62 public function createStreamFromResource($resource): StreamInterface 63 { 64 return Utils::streamFor($resource); 65 } 66 67 public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface 68 { 69 if (empty($method)) { 70 if (!empty($serverParams['REQUEST_METHOD'])) { 71 $method = $serverParams['REQUEST_METHOD']; 72 } else { 73 throw new \InvalidArgumentException('Cannot determine HTTP method'); 74 } 75 } 76 77 return new ServerRequest($method, $uri, [], null, '1.1', $serverParams); 78 } 79 80 public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface 81 { 82 return new Response($code, [], null, '1.1', $reasonPhrase); 83 } 84 85 public function createRequest(string $method, $uri): RequestInterface 86 { 87 return new Request($method, $uri); 88 } 89 90 public function createUri(string $uri = ''): UriInterface 91 { 92 return new Uri($uri); 93 } 94} 95