Last active
April 4, 2023 16:57
-
-
Save ajuchacko/021f3c0790eff88f7a34c96e711b677b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App; | |
use GuzzleHttp\Psr7\Request; | |
use GuzzleHttp\Psr7\Response; | |
use GuzzleHttp\Psr7\ServerRequest; | |
use GuzzleHttp\Psr7\UploadedFile; | |
use GuzzleHttp\Psr7\Uri; | |
use GuzzleHttp\Psr7\Utils; | |
use Psr\Http\Message\RequestFactoryInterface; | |
use Psr\Http\Message\RequestInterface; | |
use Psr\Http\Message\ResponseFactoryInterface; | |
use Psr\Http\Message\ResponseInterface; | |
use Psr\Http\Message\ServerRequestFactoryInterface; | |
use Psr\Http\Message\ServerRequestInterface; | |
use Psr\Http\Message\StreamFactoryInterface; | |
use Psr\Http\Message\StreamInterface; | |
use Psr\Http\Message\UploadedFileFactoryInterface; | |
use Psr\Http\Message\UploadedFileInterface; | |
use Psr\Http\Message\UriFactoryInterface; | |
use Psr\Http\Message\UriInterface; | |
/** | |
* Implements all of the PSR-17 interfaces. | |
* | |
* Note: in consuming code it is recommended to require the implemented interfaces | |
* and inject the instance of this class multiple times. | |
*/ | |
class CustomRequestFactory implements | |
RequestFactoryInterface, | |
ResponseFactoryInterface, | |
ServerRequestFactoryInterface, | |
StreamFactoryInterface, | |
UploadedFileFactoryInterface, | |
UriFactoryInterface | |
{ | |
public function createUploadedFile( | |
StreamInterface $stream, | |
int $size = null, | |
int $error = \UPLOAD_ERR_OK, | |
string $clientFilename = null, | |
string $clientMediaType = null | |
): UploadedFileInterface { | |
if ($size === null) { | |
$size = $stream->getSize(); | |
} | |
return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType); | |
} | |
public function createStream(string $content = ''): StreamInterface | |
{ | |
return Utils::streamFor($content); | |
} | |
public function createStreamFromFile(string $file, string $mode = 'r'): StreamInterface | |
{ | |
try { | |
$resource = Utils::tryFopen($file, $mode); | |
} catch (\RuntimeException $e) { | |
if ('' === $mode || false === \in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], true)) { | |
throw new \InvalidArgumentException(sprintf('Invalid file opening mode "%s"', $mode), 0, $e); | |
} | |
throw $e; | |
} | |
return Utils::streamFor($resource); | |
} | |
public function createStreamFromResource($resource): StreamInterface | |
{ | |
return Utils::streamFor($resource); | |
} | |
public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface | |
{ | |
if (empty($method)) { | |
if (!empty($serverParams['REQUEST_METHOD'])) { | |
$method = $serverParams['REQUEST_METHOD']; | |
} else { | |
throw new \InvalidArgumentException('Cannot determine HTTP method'); | |
} | |
} | |
return new ServerRequest($method, $uri, [], null, '1.1', $serverParams); | |
} | |
public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface | |
{ | |
return new Response($code, [], null, '1.1', $reasonPhrase); | |
} | |
public function createRequest(string $method, $uri): RequestInterface | |
{ | |
if ($this->requestIsUploadAvatar(explode('/', $uri))) { | |
$url = sprintf("%s://%s%s", $scheme = 'https', $hostname = 'gitlab.com', rtrim($uri, '/, ?')); | |
$uri = new \GuzzleHttp\Psr7\Uri($url); | |
} | |
return new Request($method, $uri); | |
} | |
private function requestIsUploadAvatar(array $uri_fields) | |
{ | |
[$api, $version, $path, $id, $question] = array_values(array_filter($uri_fields)); | |
return $api == 'api' && | |
$version == 'v4' && | |
$path == 'projects' && | |
is_numeric($id) && | |
$question == '?'; | |
} | |
public function createUri(string $uri = ''): UriInterface | |
{ | |
return new Uri($uri); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment