Added PSR-7 and PSR-15 classes

This commit is contained in:
Matias Griese
2018-10-17 14:57:45 +03:00
parent 3742be10bc
commit d6c17132df
11 changed files with 480 additions and 1 deletions

View File

@@ -2,6 +2,8 @@
## mm/dd/2018
1. [](#new)
* Added PSR-7 classes
* Added PSR-15 `RequestHandler` class
* Added `Page::httpResponseCode()` and `Page::httpHeaders()` methods
1. [](#improved)
* Added apcu autoloader optimization

View File

@@ -18,6 +18,10 @@
"psr/simple-cache": "^1.0",
"psr/http-message": "^1.0",
"psr/http-server-middleware": "^1.0",
"nyholm/psr7-server": "^0.2.1",
"nyholm/psr7": "^1.0",
"twig/twig": "~1.35",
"erusev/parsedown": "1.6.4",

324
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "62efd8660a745d3e62621d0432f6ef91",
"content-hash": "a6592549298919c71cbcd8007b976e85",
"packages": [
{
"name": "antoligy/dom-string-iterators",
@@ -1017,6 +1017,120 @@
],
"time": "2017-06-19T01:22:40+00:00"
},
{
"name": "nyholm/psr7",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/Nyholm/psr7.git",
"reference": "02a20d5e9241daefd68935f7a43d9a7a8b4b6277"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Nyholm/psr7/zipball/02a20d5e9241daefd68935f7a43d9a7a8b4b6277",
"reference": "02a20d5e9241daefd68935f7a43d9a7a8b4b6277",
"shasum": ""
},
"require": {
"php": "^7.1",
"php-http/message-factory": "^1.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0"
},
"provide": {
"psr/http-factory-implementation": "1.0",
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"http-interop/http-factory-tests": "dev-master",
"php-http/psr7-integration-tests": "dev-master",
"phpunit/phpunit": "^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
"Nyholm\\Psr7\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com"
},
{
"name": "Martijn van der Ven",
"email": "martijn@vanderven.se"
}
],
"description": "A fast PHP7 implementation of PSR-7",
"homepage": "http://tnyholm.se",
"keywords": [
"psr-17",
"psr-7"
],
"time": "2018-09-02T11:50:33+00:00"
},
{
"name": "nyholm/psr7-server",
"version": "0.2.1",
"source": {
"type": "git",
"url": "https://github.com/Nyholm/psr7-server.git",
"reference": "d7f72c4a57acf774d0049e46091929803976283b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Nyholm/psr7-server/zipball/d7f72c4a57acf774d0049e46091929803976283b",
"reference": "d7f72c4a57acf774d0049e46091929803976283b",
"shasum": ""
},
"require": {
"php": "^7.1",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0"
},
"require-dev": {
"nyholm/nsa": "^1.1",
"nyholm/psr7": "^1.0",
"phpunit/phpunit": "^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Nyholm\\Psr7Server\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com"
},
{
"name": "Martijn van der Ven",
"email": "martijn@vanderven.se"
}
],
"description": "Helper classes to handle PSR-7 server requests",
"homepage": "http://tnyholm.se",
"keywords": [
"psr-17",
"psr-7"
],
"time": "2018-08-02T20:01:51+00:00"
},
{
"name": "phive/twig-extensions-deferred",
"version": "v1.0.2",
@@ -1060,6 +1174,56 @@
],
"time": "2017-03-17T21:39:21+00:00"
},
{
"name": "php-http/message-factory",
"version": "v1.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-http/message-factory.git",
"reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1",
"reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1",
"shasum": ""
},
"require": {
"php": ">=5.4",
"psr/http-message": "^1.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
"Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com"
}
],
"description": "Factory interfaces for PSR-7 HTTP Message",
"homepage": "http://php-http.org",
"keywords": [
"factory",
"http",
"message",
"stream",
"uri"
],
"time": "2015-12-19T14:08:53+00:00"
},
{
"name": "pimple/pimple",
"version": "v3.2.3",
@@ -1159,6 +1323,58 @@
],
"time": "2017-02-14T16:28:37+00:00"
},
{
"name": "psr/http-factory",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-factory.git",
"reference": "378bfe27931ecc54ff824a20d6f6bfc303bbd04c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/378bfe27931ecc54ff824a20d6f6bfc303bbd04c",
"reference": "378bfe27931ecc54ff824a20d6f6bfc303bbd04c",
"shasum": ""
},
"require": {
"php": ">=7.0.0",
"psr/http-message": "^1.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interfaces for PSR-7 HTTP message factories",
"keywords": [
"factory",
"http",
"message",
"psr",
"psr-17",
"psr-7",
"request",
"response"
],
"time": "2018-07-30T21:54:04+00:00"
},
{
"name": "psr/http-message",
"version": "1.0.1",
@@ -1209,6 +1425,112 @@
],
"time": "2016-08-06T14:39:51+00:00"
},
{
"name": "psr/http-server-handler",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-server-handler.git",
"reference": "439d92054dc06097f2406ec074a2627839955a02"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/439d92054dc06097f2406ec074a2627839955a02",
"reference": "439d92054dc06097f2406ec074a2627839955a02",
"shasum": ""
},
"require": {
"php": ">=7.0",
"psr/http-message": "^1.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Server\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for HTTP server-side request handler",
"keywords": [
"handler",
"http",
"http-interop",
"psr",
"psr-15",
"psr-7",
"request",
"response",
"server"
],
"time": "2018-01-22T17:04:15+00:00"
},
{
"name": "psr/http-server-middleware",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-server-middleware.git",
"reference": "ea17eb1fb2c8df6db919cc578451a8013c6a0ae5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/ea17eb1fb2c8df6db919cc578451a8013c6a0ae5",
"reference": "ea17eb1fb2c8df6db919cc578451a8013c6a0ae5",
"shasum": ""
},
"require": {
"php": ">=7.0",
"psr/http-message": "^1.0",
"psr/http-server-handler": "^1.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Server\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for HTTP server-side middleware",
"keywords": [
"http",
"http-interop",
"middleware",
"psr",
"psr-15",
"psr-7",
"request",
"response"
],
"time": "2018-01-22T17:08:31+00:00"
},
{
"name": "psr/log",
"version": "1.0.2",

View File

@@ -0,0 +1,3 @@
<?php
class_alias('Nyholm\Psr7\Request', 'Grav\Framework\Psr7\Request');

View File

@@ -0,0 +1,3 @@
<?php
class_alias('Nyholm\Psr7\Response', 'Grav\Framework\Psr7\Response');

View File

@@ -0,0 +1,3 @@
<?php
class_alias('Nyholm\Psr7\ServerRequest', 'Grav\Framework\Psr7\ServerRequest');

View File

@@ -0,0 +1,3 @@
<?php
class_alias('Nyholm\Psr7\Stream', 'Grav\Framework\Psr7\Stream');

View File

@@ -0,0 +1,3 @@
<?php
class_alias('Nyholm\Psr7\UploadedFile', 'Grav\Framework\Psr7\UploadedFile');

View File

@@ -0,0 +1,3 @@
<?php
class_alias('Nyholm\Psr7\Uri', 'Grav\Framework\Psr7\Uri');

View File

@@ -0,0 +1,40 @@
<?php
declare(strict_types=1);
namespace Grav\Framework\RequestHandler\Exception;
use Throwable;
class InvalidArgumentException extends \InvalidArgumentException
{
/**
* @var mixed|null
*/
private $invalidMiddleware;
/**
* InvalidArgumentException constructor.
*
* @param string $message
* @param mixed|null $invalidMiddleware
* @param int $code
* @param Throwable|null $previous
*/
public function __construct($message = '', $invalidMiddleware = null, $code = 0, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
$this->invalidMiddleware = $invalidMiddleware;
}
/**
* Return the invalid middleware
*
* @return mixed|null
*/
public function getInvalidMiddleware()
{
return $this->invalidMiddleware;
}
}

View File

@@ -0,0 +1,93 @@
<?php
declare(strict_types=1);
namespace Grav\Framework\RequestHandler;
use Grav\Framework\RequestHandler\Exception\InvalidArgumentException;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
class RequestHandler implements RequestHandlerInterface
{
/** @var string[]|MiddlewareInterface[]|array */
protected $middleware;
/** @var callable */
private $default;
/** @var ContainerInterface */
private $container;
/** @var callable */
private $wrapper;
/**
* Delegate constructor.
*
* @param array $middleware
* @param callable $default
* @param ContainerInterface|null $container
*/
public function __construct(array $middleware, callable $default, ContainerInterface $container = null)
{
$this->middleware = $middleware;
$this->default = $default;
$this->container = $container;
}
/**
* @param callable $wrapper
* @return $this
*/
public function setWrapper(callable $wrapper)
{
$this->wrapper = $wrapper;
return $this;
}
/**
* @param $name
* @param callable $callable
* @return $this
*/
public function add($name, callable $callable)
{
$this->container[$name] = $callable;
return $this;
}
/**
* {@inheritdoc}
* @throws InvalidArgumentException
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
$middleware = array_shift($this->middleware);
// Use default callable if there is no middleware.
if ($middleware === null) {
return \call_user_func($this->default, $request);
}
if ($middleware instanceof MiddlewareInterface) {
return $middleware->process($request, clone $this);
}
if (!$this->container || !$this->container->has($middleware)) {
throw new InvalidArgumentException(
sprintf('The middleware is not a valid %s and is not passed in the Container', MiddlewareInterface::class),
$middleware
);
}
array_unshift($this->middleware, $this->container->get($middleware));
return $this->handle($request);
}
}