"scssphp/scssphp": "^1.4",
"guzzlehttp/guzzle": "^7.3.0",
"paragonie/constant_time_encoding": "^2.3",
- "laminas/laminas-diactoros": "^2.4"
+ "laminas/laminas-diactoros": "^2.4",
+ "laminas/laminas-httphandlerrunner": "^1.2"
}
}
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "b828e29250a7fa9ea0b3fca22bca6864",
+ "content-hash": "b3aeea343e2f7ee79bb2d9a6b8a86799",
"packages": [
{
"name": "chrisjean/php-ico",
],
"time": "2020-09-03T14:29:41+00:00"
},
+ {
+ "name": "laminas/laminas-httphandlerrunner",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laminas/laminas-httphandlerrunner.git",
+ "reference": "e1a5dad040e0043135e8095ee27d1fbf6fb640e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/e1a5dad040e0043135e8095ee27d1fbf6fb640e1",
+ "reference": "e1a5dad040e0043135e8095ee27d1fbf6fb640e1",
+ "shasum": ""
+ },
+ "require": {
+ "laminas/laminas-zendframework-bridge": "^1.0",
+ "php": "^7.1",
+ "psr/http-message": "^1.0",
+ "psr/http-message-implementation": "^1.0",
+ "psr/http-server-handler": "^1.0"
+ },
+ "replace": {
+ "zendframework/zend-httphandlerrunner": "^1.1.0"
+ },
+ "require-dev": {
+ "laminas/laminas-coding-standard": "~1.0.0",
+ "laminas/laminas-diactoros": "^1.7 || ^2.1.1",
+ "phpunit/phpunit": "^7.0.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev",
+ "dev-develop": "1.3.x-dev"
+ },
+ "laminas": {
+ "config-provider": "Laminas\\HttpHandlerRunner\\ConfigProvider"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laminas\\HttpHandlerRunner\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "Execute PSR-15 RequestHandlerInterface instances and emit responses they generate.",
+ "homepage": "https://laminas.dev",
+ "keywords": [
+ "components",
+ "laminas",
+ "mezzio",
+ "psr-15",
+ "psr-7"
+ ],
+ "support": {
+ "chat": "https://laminas.dev/chat",
+ "docs": "https://docs.laminas.dev/laminas-httphandlerrunner/",
+ "forum": "https://discourse.laminas.dev",
+ "issues": "https://github.com/laminas/laminas-httphandlerrunner/issues",
+ "rss": "https://github.com/laminas/laminas-httphandlerrunner/releases.atom",
+ "source": "https://github.com/laminas/laminas-httphandlerrunner"
+ },
+ "funding": [
+ {
+ "url": "https://funding.communitybridge.org/projects/laminas-project",
+ "type": "community_bridge"
+ }
+ ],
+ "time": "2020-06-03T15:52:17+00:00"
+ },
{
"name": "laminas/laminas-zendframework-bridge",
"version": "1.1.1",
},
"time": "2016-08-06T14:39:51+00:00"
},
+ {
+ "name": "psr/http-server-handler",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-server-handler.git",
+ "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7",
+ "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7",
+ "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"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/http-server-handler/issues",
+ "source": "https://github.com/php-fig/http-server-handler/tree/master"
+ },
+ "time": "2018-10-30T16:46:14+00:00"
+ },
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
'Laminas\\Diactoros\\UploadedFileFactory' => $vendorDir . '/laminas/laminas-diactoros/src/UploadedFileFactory.php',
'Laminas\\Diactoros\\Uri' => $vendorDir . '/laminas/laminas-diactoros/src/Uri.php',
'Laminas\\Diactoros\\UriFactory' => $vendorDir . '/laminas/laminas-diactoros/src/UriFactory.php',
+ 'Laminas\\HttpHandlerRunner\\ConfigProvider' => $vendorDir . '/laminas/laminas-httphandlerrunner/src/ConfigProvider.php',
+ 'Laminas\\HttpHandlerRunner\\Emitter\\EmitterInterface' => $vendorDir . '/laminas/laminas-httphandlerrunner/src/Emitter/EmitterInterface.php',
+ 'Laminas\\HttpHandlerRunner\\Emitter\\EmitterStack' => $vendorDir . '/laminas/laminas-httphandlerrunner/src/Emitter/EmitterStack.php',
+ 'Laminas\\HttpHandlerRunner\\Emitter\\SapiEmitter' => $vendorDir . '/laminas/laminas-httphandlerrunner/src/Emitter/SapiEmitter.php',
+ 'Laminas\\HttpHandlerRunner\\Emitter\\SapiEmitterTrait' => $vendorDir . '/laminas/laminas-httphandlerrunner/src/Emitter/SapiEmitterTrait.php',
+ 'Laminas\\HttpHandlerRunner\\Emitter\\SapiStreamEmitter' => $vendorDir . '/laminas/laminas-httphandlerrunner/src/Emitter/SapiStreamEmitter.php',
+ 'Laminas\\HttpHandlerRunner\\Exception\\EmitterException' => $vendorDir . '/laminas/laminas-httphandlerrunner/src/Exception/EmitterException.php',
+ 'Laminas\\HttpHandlerRunner\\Exception\\ExceptionInterface' => $vendorDir . '/laminas/laminas-httphandlerrunner/src/Exception/ExceptionInterface.php',
+ 'Laminas\\HttpHandlerRunner\\Exception\\InvalidEmitterException' => $vendorDir . '/laminas/laminas-httphandlerrunner/src/Exception/InvalidEmitterException.php',
+ 'Laminas\\HttpHandlerRunner\\RequestHandlerRunner' => $vendorDir . '/laminas/laminas-httphandlerrunner/src/RequestHandlerRunner.php',
'Laminas\\ZendFrameworkBridge\\Autoloader' => $vendorDir . '/laminas/laminas-zendframework-bridge/src/Autoloader.php',
'Laminas\\ZendFrameworkBridge\\ConfigPostProcessor' => $vendorDir . '/laminas/laminas-zendframework-bridge/src/ConfigPostProcessor.php',
'Laminas\\ZendFrameworkBridge\\Module' => $vendorDir . '/laminas/laminas-zendframework-bridge/src/Module.php',
'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php',
'Psr\\Http\\Message\\UriFactoryInterface' => $vendorDir . '/psr/http-factory/src/UriFactoryInterface.php',
'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php',
+ 'Psr\\Http\\Server\\RequestHandlerInterface' => $vendorDir . '/psr/http-server-handler/src/RequestHandlerInterface.php',
'ScssPhp\\ScssPhp\\Base\\Range' => $vendorDir . '/scssphp/scssphp/src/Base/Range.php',
'ScssPhp\\ScssPhp\\Block' => $vendorDir . '/scssphp/scssphp/src/Block.php',
'ScssPhp\\ScssPhp\\Cache' => $vendorDir . '/scssphp/scssphp/src/Cache.php',
$baseDir = $vendorDir;
return array(
+ '7e9bd612cc444b3eed788ebbe46263a0' => $vendorDir . '/laminas/laminas-zendframework-bridge/src/autoload.php',
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
- '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
- '7e9bd612cc444b3eed788ebbe46263a0' => $vendorDir . '/laminas/laminas-zendframework-bridge/src/autoload.php',
- '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
- '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
'07d7f1a47144818725fd8d91a907ac57' => $vendorDir . '/laminas/laminas-diactoros/src/functions/create_uploaded_file.php',
'da94ac5d3ca7d2dbab84ce561ce72bfd' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_headers_from_sapi.php',
'3d97c8dcdfba8cb85d3b34f116bb248b' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_method_from_sapi.php',
'cc8e14526dc240491e17a838cb78508c' => $vendorDir . '/laminas/laminas-diactoros/src/functions/normalize_server.legacy.php',
'786bf90caabc9e09b6ad4cc5ca8f0e30' => $vendorDir . '/laminas/laminas-diactoros/src/functions/normalize_uploaded_files.legacy.php',
'751a5a3f463e4be759be31748b61737c' => $vendorDir . '/laminas/laminas-diactoros/src/functions/parse_cookie_header.legacy.php',
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
+ '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
+ '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
);
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
'Symfony\\Component\\CssSelector\\' => array($vendorDir . '/symfony/css-selector'),
'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'),
+ 'Psr\\Http\\Server\\' => array($vendorDir . '/psr/http-server-handler/src'),
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
'Pelago\\Emogrifier\\' => array($vendorDir . '/pelago/emogrifier/src'),
'ParagonIE\\ConstantTime\\' => array($vendorDir . '/paragonie/constant_time_encoding/src'),
'Laminas\\ZendFrameworkBridge\\' => array($vendorDir . '/laminas/laminas-zendframework-bridge/src'),
+ 'Laminas\\HttpHandlerRunner\\' => array($vendorDir . '/laminas/laminas-httphandlerrunner/src'),
'Laminas\\Diactoros\\' => array($vendorDir . '/laminas/laminas-diactoros/src'),
'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
class ComposerStaticInita1f5f7c74275d47a45049a2936db1d0d
{
public static $files = array (
+ '7e9bd612cc444b3eed788ebbe46263a0' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/autoload.php',
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
- '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
- '7e9bd612cc444b3eed788ebbe46263a0' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/autoload.php',
- '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
- '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
'07d7f1a47144818725fd8d91a907ac57' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/create_uploaded_file.php',
'da94ac5d3ca7d2dbab84ce561ce72bfd' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_headers_from_sapi.php',
'3d97c8dcdfba8cb85d3b34f116bb248b' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_method_from_sapi.php',
'cc8e14526dc240491e17a838cb78508c' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/normalize_server.legacy.php',
'786bf90caabc9e09b6ad4cc5ca8f0e30' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/normalize_uploaded_files.legacy.php',
'751a5a3f463e4be759be31748b61737c' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/parse_cookie_header.legacy.php',
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
+ '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
+ '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
);
public static $prefixLengthsPsr4 = array (
),
'P' =>
array (
+ 'Psr\\Http\\Server\\' => 16,
'Psr\\Http\\Message\\' => 17,
'Psr\\Http\\Client\\' => 16,
'Pelago\\Emogrifier\\' => 18,
'L' =>
array (
'Laminas\\ZendFrameworkBridge\\' => 28,
+ 'Laminas\\HttpHandlerRunner\\' => 26,
'Laminas\\Diactoros\\' => 18,
),
'G' =>
array (
0 => __DIR__ . '/..' . '/scssphp/scssphp/src',
),
+ 'Psr\\Http\\Server\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/http-server-handler/src',
+ ),
'Psr\\Http\\Message\\' =>
array (
0 => __DIR__ . '/..' . '/psr/http-factory/src',
array (
0 => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src',
),
+ 'Laminas\\HttpHandlerRunner\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src',
+ ),
'Laminas\\Diactoros\\' =>
array (
0 => __DIR__ . '/..' . '/laminas/laminas-diactoros/src',
'Laminas\\Diactoros\\UploadedFileFactory' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/UploadedFileFactory.php',
'Laminas\\Diactoros\\Uri' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/Uri.php',
'Laminas\\Diactoros\\UriFactory' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/UriFactory.php',
+ 'Laminas\\HttpHandlerRunner\\ConfigProvider' => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src/ConfigProvider.php',
+ 'Laminas\\HttpHandlerRunner\\Emitter\\EmitterInterface' => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src/Emitter/EmitterInterface.php',
+ 'Laminas\\HttpHandlerRunner\\Emitter\\EmitterStack' => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src/Emitter/EmitterStack.php',
+ 'Laminas\\HttpHandlerRunner\\Emitter\\SapiEmitter' => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src/Emitter/SapiEmitter.php',
+ 'Laminas\\HttpHandlerRunner\\Emitter\\SapiEmitterTrait' => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src/Emitter/SapiEmitterTrait.php',
+ 'Laminas\\HttpHandlerRunner\\Emitter\\SapiStreamEmitter' => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src/Emitter/SapiStreamEmitter.php',
+ 'Laminas\\HttpHandlerRunner\\Exception\\EmitterException' => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src/Exception/EmitterException.php',
+ 'Laminas\\HttpHandlerRunner\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src/Exception/ExceptionInterface.php',
+ 'Laminas\\HttpHandlerRunner\\Exception\\InvalidEmitterException' => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src/Exception/InvalidEmitterException.php',
+ 'Laminas\\HttpHandlerRunner\\RequestHandlerRunner' => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src/RequestHandlerRunner.php',
'Laminas\\ZendFrameworkBridge\\Autoloader' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/Autoloader.php',
'Laminas\\ZendFrameworkBridge\\ConfigPostProcessor' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/ConfigPostProcessor.php',
'Laminas\\ZendFrameworkBridge\\Module' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/Module.php',
'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php',
'Psr\\Http\\Message\\UriFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UriFactoryInterface.php',
'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php',
+ 'Psr\\Http\\Server\\RequestHandlerInterface' => __DIR__ . '/..' . '/psr/http-server-handler/src/RequestHandlerInterface.php',
'ScssPhp\\ScssPhp\\Base\\Range' => __DIR__ . '/..' . '/scssphp/scssphp/src/Base/Range.php',
'ScssPhp\\ScssPhp\\Block' => __DIR__ . '/..' . '/scssphp/scssphp/src/Block.php',
'ScssPhp\\ScssPhp\\Cache' => __DIR__ . '/..' . '/scssphp/scssphp/src/Cache.php',
],
"install-path": "../laminas/laminas-diactoros"
},
+ {
+ "name": "laminas/laminas-httphandlerrunner",
+ "version": "1.2.0",
+ "version_normalized": "1.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laminas/laminas-httphandlerrunner.git",
+ "reference": "e1a5dad040e0043135e8095ee27d1fbf6fb640e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/e1a5dad040e0043135e8095ee27d1fbf6fb640e1",
+ "reference": "e1a5dad040e0043135e8095ee27d1fbf6fb640e1",
+ "shasum": ""
+ },
+ "require": {
+ "laminas/laminas-zendframework-bridge": "^1.0",
+ "php": "^7.1",
+ "psr/http-message": "^1.0",
+ "psr/http-message-implementation": "^1.0",
+ "psr/http-server-handler": "^1.0"
+ },
+ "replace": {
+ "zendframework/zend-httphandlerrunner": "^1.1.0"
+ },
+ "require-dev": {
+ "laminas/laminas-coding-standard": "~1.0.0",
+ "laminas/laminas-diactoros": "^1.7 || ^2.1.1",
+ "phpunit/phpunit": "^7.0.2"
+ },
+ "time": "2020-06-03T15:52:17+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev",
+ "dev-develop": "1.3.x-dev"
+ },
+ "laminas": {
+ "config-provider": "Laminas\\HttpHandlerRunner\\ConfigProvider"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Laminas\\HttpHandlerRunner\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "Execute PSR-15 RequestHandlerInterface instances and emit responses they generate.",
+ "homepage": "https://laminas.dev",
+ "keywords": [
+ "components",
+ "laminas",
+ "mezzio",
+ "psr-15",
+ "psr-7"
+ ],
+ "support": {
+ "chat": "https://laminas.dev/chat",
+ "docs": "https://docs.laminas.dev/laminas-httphandlerrunner/",
+ "forum": "https://discourse.laminas.dev",
+ "issues": "https://github.com/laminas/laminas-httphandlerrunner/issues",
+ "rss": "https://github.com/laminas/laminas-httphandlerrunner/releases.atom",
+ "source": "https://github.com/laminas/laminas-httphandlerrunner"
+ },
+ "funding": [
+ {
+ "url": "https://funding.communitybridge.org/projects/laminas-project",
+ "type": "community_bridge"
+ }
+ ],
+ "install-path": "../laminas/laminas-httphandlerrunner"
+ },
{
"name": "laminas/laminas-zendframework-bridge",
"version": "1.1.1",
],
"install-path": "../psr/http-message"
},
+ {
+ "name": "psr/http-server-handler",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-server-handler.git",
+ "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7",
+ "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0",
+ "psr/http-message": "^1.0"
+ },
+ "time": "2018-10-30T16:46:14+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "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"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/http-server-handler/issues",
+ "source": "https://github.com/php-fig/http-server-handler/tree/master"
+ },
+ "install-path": "../psr/http-server-handler"
+ },
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
'reference' => '36ef09b73e884135d2059cc498c938e90821bb57',
'dev_requirement' => false,
),
+ 'laminas/laminas-httphandlerrunner' => array(
+ 'pretty_version' => '1.2.0',
+ 'version' => '1.2.0.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../laminas/laminas-httphandlerrunner',
+ 'aliases' => array(),
+ 'reference' => 'e1a5dad040e0043135e8095ee27d1fbf6fb640e1',
+ 'dev_requirement' => false,
+ ),
'laminas/laminas-zendframework-bridge' => array(
'pretty_version' => '1.1.1',
'version' => '1.1.1.0',
0 => '1.0',
),
),
+ 'psr/http-server-handler' => array(
+ 'pretty_version' => '1.0.1',
+ 'version' => '1.0.1.0',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../psr/http-server-handler',
+ 'aliases' => array(),
+ 'reference' => 'aff2f80e33b7f026ec96bb42f63242dc50ffcae7',
+ 'dev_requirement' => false,
+ ),
'ralouphie/getallheaders' => array(
'pretty_version' => '3.0.3',
'version' => '3.0.3.0',
0 => '^2.2.1',
),
),
+ 'zendframework/zend-httphandlerrunner' => array(
+ 'dev_requirement' => false,
+ 'replaced' => array(
+ 0 => '^1.1.0',
+ ),
+ ),
),
);
--- /dev/null
+# Changelog
+
+All notable changes to this project will be documented in this file, in reverse chronological order by release.
+
+## 1.2.0 - 2020-06-03
+
+### Added
+
+- Nothing.
+
+### Changed
+
+- [#4](https://github.com/laminas/laminas-httphandlerrunner/pull/4) adds a call to `flush()` within the `SapiStreamEmitter`, after emitting headers and the status line, but before emitting content. This change allows providing a response to the browser more quickly, allowing it to process the stream as it is pushed.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- Nothing.
+
+## 1.1.0 - 2019-02-19
+
+### Added
+
+- [zendframework/zend-httphandlerrunner#10](https://github.com/zendframework/zend-httphandlerrunner/pull/10) adds support for laminas-diactoros v2 releases.
+
+### Changed
+
+- Nothing.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- Nothing.
+
+## 1.0.2 - 2019-02-19
+
+### Added
+
+- [zendframework/zend-httphandlerrunner#9](https://github.com/zendframework/zend-httphandlerrunner/pull/9) adds support for PHP 7.3.
+
+### Changed
+
+- Nothing.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- Nothing.
+
+## 1.0.1 - 2018-02-21
+
+### Added
+
+- Nothing.
+
+### Changed
+
+- [zendframework/zend-httphandlerrunner#2](https://github.com/zendframework/zend-httphandlerrunner/pull/2) modifies
+ how the request and error response factories are composed with the
+ `RequestHandlerRunner` class. In both cases, they are now encapsulated in a
+ closure which also defines a return type hint, ensuring that if the factories
+ produce an invalid return type, a PHP `TypeError` will be raised.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- Nothing.
+
+## 1.0.0 - 2018-02-05
+
+Initial stable release.
+
+The `Laminas\HttpRequestHandler\Emitter` subcomponent was originally released as
+part of two packages:
+
+- `EmitterInterface` and the two SAPI emitter implementations were released
+ previously as part of the [laminas-diactoros](https://docs.laminas.dev/laminas-daictoros)
+ package.
+
+- `EmitterStack` was previously released as part of the
+ [mezzio](https://docs.mezzio.dev/mezzio/) package.
+
+These features are mostly verbatim from that package, with minor API changes.
+
+The `RequestHandlerRunner` was originally developed as part of version 3
+development of mezzio, but extracted here for general use with
+[PSR-15](https://www.php-fig.org/psr/psr-15) applications.
+
+### Added
+
+- Everything.
+
+### Changed
+
+- Nothing.
+
+### Deprecated
+
+- Nothing.
+
+### Removed
+
+- Nothing.
+
+### Fixed
+
+- Nothing.
--- /dev/null
+Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. (https://getlaminas.org/)
--- /dev/null
+Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+- Neither the name of Laminas Foundation nor the names of its contributors may
+ be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null
+# laminas-httphandlerrunner
+
+[![Build Status](https://travis-ci.com/laminas/laminas-httphandlerrunner.svg?branch=master)](https://travis-ci.com/laminas/laminas-httphandlerrunner)
+[![Coverage Status](https://coveralls.io/repos/github/laminas/laminas-httphandlerrunner/badge.svg?branch=master)](https://coveralls.io/github/laminas/laminas-httphandlerrunner?branch=master)
+
+This library provides utilities for:
+
+- Emitting [PSR-7](https://www.php-fig.org/psr/psr-7) responses.
+- Running [PSR-15](https://www.php-fig.org/psr/psr-15) server request handlers,
+ which involves marshaling a PSR-7 `ServerRequestInterface`, handling
+ exceptions due to request creation, and emitting the response returned by the
+ composed request handler.
+
+The `RequestHandlerRunner` will be used in the bootstrap of your application to
+fire off the `RequestHandlerInterface` representing your application.
+
+## Installation
+
+Run the following to install this library:
+
+```bash
+$ composer require laminas/laminas-httphandlerrunner
+```
+
+## Documentation
+
+Documentation is [in the doc tree](docs/book/), and can be compiled using [mkdocs](https://www.mkdocs.org):
+
+```bash
+$ mkdocs build
+```
+
+You may also [browse the documentation online](https://docs.laminas.dev/laminas-httphandlerrunner/).
--- /dev/null
+{
+ "name": "laminas/laminas-httphandlerrunner",
+ "description": "Execute PSR-15 RequestHandlerInterface instances and emit responses they generate.",
+ "license": "BSD-3-Clause",
+ "keywords": [
+ "laminas",
+ "components",
+ "mezzio",
+ "psr-7",
+ "psr-15"
+ ],
+ "homepage": "https://laminas.dev",
+ "support": {
+ "docs": "https://docs.laminas.dev/laminas-httphandlerrunner/",
+ "issues": "https://github.com/laminas/laminas-httphandlerrunner/issues",
+ "source": "https://github.com/laminas/laminas-httphandlerrunner",
+ "rss": "https://github.com/laminas/laminas-httphandlerrunner/releases.atom",
+ "chat": "https://laminas.dev/chat",
+ "forum": "https://discourse.laminas.dev"
+ },
+ "config": {
+ "sort-packages": true
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev",
+ "dev-develop": "1.3.x-dev"
+ },
+ "laminas": {
+ "config-provider": "Laminas\\HttpHandlerRunner\\ConfigProvider"
+ }
+ },
+ "require": {
+ "php": "^7.1",
+ "laminas/laminas-zendframework-bridge": "^1.0",
+ "psr/http-message": "^1.0",
+ "psr/http-message-implementation": "^1.0",
+ "psr/http-server-handler": "^1.0"
+ },
+ "require-dev": {
+ "laminas/laminas-coding-standard": "~1.0.0",
+ "laminas/laminas-diactoros": "^1.7 || ^2.1.1",
+ "phpunit/phpunit": "^7.0.2"
+ },
+ "autoload": {
+ "psr-4": {
+ "Laminas\\HttpHandlerRunner\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "LaminasTest\\HttpHandlerRunner\\": "test/"
+ },
+ "files": [
+ "test/TestAsset/SapiResponse.php"
+ ]
+ },
+ "scripts": {
+ "check": [
+ "@cs-check",
+ "@test"
+ ],
+ "cs-check": "phpcs",
+ "cs-fix": "phpcbf",
+ "test": "phpunit --colors=always",
+ "test-coverage": "phpunit --colors=always --coverage-clover clover.xml"
+ },
+ "replace": {
+ "zendframework/zend-httphandlerrunner": "^1.1.0"
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/laminas/laminas-httphandlerrunner for the canonical source repository
+ * @copyright https://github.com/laminas/laminas-httphandlerrunner/blob/master/COPYRIGHT.md
+ * @license https://github.com/laminas/laminas-httphandlerrunner/blob/master/LICENSE.md New BSD License
+ */
+
+namespace Laminas\HttpHandlerRunner;
+
+class ConfigProvider
+{
+ public function __invoke() : array
+ {
+ return [
+ 'dependencies' => $this->getDependencies(),
+ ];
+ }
+
+ public function getDependencies() : array
+ {
+ return [
+ ];
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/laminas/laminas-httphandlerrunner for the canonical source repository
+ * @copyright https://github.com/laminas/laminas-httphandlerrunner/blob/master/COPYRIGHT.md
+ * @license https://github.com/laminas/laminas-httphandlerrunner/blob/master/LICENSE.md New BSD License
+ */
+
+declare(strict_types=1);
+
+namespace Laminas\HttpHandlerRunner\Emitter;
+
+use Psr\Http\Message\ResponseInterface;
+
+interface EmitterInterface
+{
+ /**
+ * Emit a response.
+ *
+ * Emits a response, including status line, headers, and the message body,
+ * according to the environment.
+ *
+ * Implementations of this method may be written in such a way as to have
+ * side effects, such as usage of header() or pushing output to the
+ * output buffer.
+ *
+ * Implementations MAY raise exceptions if they are unable to emit the
+ * response; e.g., if headers have already been sent.
+ *
+ * Implementations MUST return a boolean. A boolean `true` indicates that
+ * the emitter was able to emit the response, while `false` indicates
+ * it was not.
+ */
+ public function emit(ResponseInterface $response) : bool;
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/laminas/laminas-httphandlerrunner for the canonical source repository
+ * @copyright https://github.com/laminas/laminas-httphandlerrunner/blob/master/COPYRIGHT.md
+ * @license https://github.com/laminas/laminas-httphandlerrunner/blob/master/LICENSE.md New BSD License
+ */
+
+declare(strict_types=1);
+
+namespace Laminas\HttpHandlerRunner\Emitter;
+
+use Laminas\HttpHandlerRunner\Exception;
+use Psr\Http\Message\ResponseInterface;
+use SplStack;
+
+/**
+ * Provides an EmitterInterface implementation that acts as a stack of Emitters.
+ *
+ * The implementations emit() method iterates itself.
+ *
+ * When iterating the stack, the first emitter to return a boolean
+ * true value will short-circuit iteration.
+ */
+class EmitterStack extends SplStack implements EmitterInterface
+{
+ /**
+ * Emit a response
+ *
+ * Loops through the stack, calling emit() on each; any that return a
+ * boolean true value will short-circuit, skipping any remaining emitters
+ * in the stack.
+ *
+ * As such, return a boolean false value from an emitter to indicate it
+ * cannot emit the response, allowing the next emitter to try.
+ */
+ public function emit(ResponseInterface $response) : bool
+ {
+ foreach ($this as $emitter) {
+ if (false !== $emitter->emit($response)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Set an emitter on the stack by index.
+ *
+ * @param mixed $index
+ * @param EmitterInterface $emitter
+ * @return void
+ * @throws InvalidArgumentException if not an EmitterInterface instance
+ */
+ public function offsetSet($index, $emitter)
+ {
+ $this->validateEmitter($emitter);
+ parent::offsetSet($index, $emitter);
+ }
+
+ /**
+ * Push an emitter to the stack.
+ *
+ * @param EmitterInterface $emitter
+ * @return void
+ * @throws InvalidArgumentException if not an EmitterInterface instance
+ */
+ public function push($emitter)
+ {
+ $this->validateEmitter($emitter);
+ parent::push($emitter);
+ }
+
+ /**
+ * Unshift an emitter to the stack.
+ *
+ * @param EmitterInterface $emitter
+ * @return void
+ * @throws InvalidArgumentException if not an EmitterInterface instance
+ */
+ public function unshift($emitter)
+ {
+ $this->validateEmitter($emitter);
+ parent::unshift($emitter);
+ }
+
+ /**
+ * Validate that an emitter implements EmitterInterface.
+ *
+ * @param mixed $emitter
+ * @throws Exception\InvalidEmitterException for non-emitter instances
+ */
+ private function validateEmitter($emitter) : void
+ {
+ if (! $emitter instanceof EmitterInterface) {
+ throw Exception\InvalidEmitterException::forEmitter($emitter);
+ }
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/laminas/laminas-httphandlerrunner for the canonical source repository
+ * @copyright https://github.com/laminas/laminas-httphandlerrunner/blob/master/COPYRIGHT.md
+ * @license https://github.com/laminas/laminas-httphandlerrunner/blob/master/LICENSE.md New BSD License
+ */
+
+declare(strict_types=1);
+
+namespace Laminas\HttpHandlerRunner\Emitter;
+
+use Psr\Http\Message\ResponseInterface;
+
+class SapiEmitter implements EmitterInterface
+{
+ use SapiEmitterTrait;
+
+ /**
+ * Emits a response for a PHP SAPI environment.
+ *
+ * Emits the status line and headers via the header() function, and the
+ * body content via the output buffer.
+ */
+ public function emit(ResponseInterface $response) : bool
+ {
+ $this->assertNoPreviousOutput();
+
+ $this->emitHeaders($response);
+ $this->emitStatusLine($response);
+ $this->emitBody($response);
+
+ return true;
+ }
+
+ /**
+ * Emit the message body.
+ */
+ private function emitBody(ResponseInterface $response) : void
+ {
+ echo $response->getBody();
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/laminas/laminas-httphandlerrunner for the canonical source repository
+ * @copyright https://github.com/laminas/laminas-httphandlerrunner/blob/master/COPYRIGHT.md
+ * @license https://github.com/laminas/laminas-httphandlerrunner/blob/master/LICENSE.md New BSD License
+ */
+
+declare(strict_types=1);
+
+namespace Laminas\HttpHandlerRunner\Emitter;
+
+use Laminas\HttpHandlerRunner\Exception\EmitterException;
+use Psr\Http\Message\ResponseInterface;
+
+use function ob_get_length;
+use function ob_get_level;
+use function sprintf;
+use function str_replace;
+use function ucwords;
+
+trait SapiEmitterTrait
+{
+ /**
+ * Checks to see if content has previously been sent.
+ *
+ * If either headers have been sent or the output buffer contains content,
+ * raises an exception.
+ *
+ * @throws EmitterException if headers have already been sent.
+ * @throws EmitterException if output is present in the output buffer.
+ */
+ private function assertNoPreviousOutput()
+ {
+ if (headers_sent()) {
+ throw EmitterException::forHeadersSent();
+ }
+
+ if (ob_get_level() > 0 && ob_get_length() > 0) {
+ throw EmitterException::forOutputSent();
+ }
+ }
+
+ /**
+ * Emit the status line.
+ *
+ * Emits the status line using the protocol version and status code from
+ * the response; if a reason phrase is available, it, too, is emitted.
+ *
+ * It is important to mention that this method should be called after
+ * `emitHeaders()` in order to prevent PHP from changing the status code of
+ * the emitted response.
+ *
+ * @see \Laminas\HttpHandlerRunner\Emitter\SapiEmitterTrait::emitHeaders()
+ */
+ private function emitStatusLine(ResponseInterface $response) : void
+ {
+ $reasonPhrase = $response->getReasonPhrase();
+ $statusCode = $response->getStatusCode();
+
+ header(sprintf(
+ 'HTTP/%s %d%s',
+ $response->getProtocolVersion(),
+ $statusCode,
+ ($reasonPhrase ? ' ' . $reasonPhrase : '')
+ ), true, $statusCode);
+ }
+
+ /**
+ * Emit response headers.
+ *
+ * Loops through each header, emitting each; if the header value
+ * is an array with multiple values, ensures that each is sent
+ * in such a way as to create aggregate headers (instead of replace
+ * the previous).
+ */
+ private function emitHeaders(ResponseInterface $response) : void
+ {
+ $statusCode = $response->getStatusCode();
+
+ foreach ($response->getHeaders() as $header => $values) {
+ $name = $this->filterHeader($header);
+ $first = $name === 'Set-Cookie' ? false : true;
+ foreach ($values as $value) {
+ header(sprintf(
+ '%s: %s',
+ $name,
+ $value
+ ), $first, $statusCode);
+ $first = false;
+ }
+ }
+ }
+
+ /**
+ * Filter a header name to wordcase
+ */
+ private function filterHeader(string $header) : string
+ {
+ return ucwords($header, '-');
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/laminas/laminas-httphandlerrunner for the canonical source repository
+ * @copyright https://github.com/laminas/laminas-httphandlerrunner/blob/master/COPYRIGHT.md
+ * @license https://github.com/laminas/laminas-httphandlerrunner/blob/master/LICENSE.md New BSD License
+ */
+
+declare(strict_types=1);
+
+namespace Laminas\HttpHandlerRunner\Emitter;
+
+use Psr\Http\Message\ResponseInterface;
+
+use function preg_match;
+use function strlen;
+use function substr;
+
+class SapiStreamEmitter implements EmitterInterface
+{
+ use SapiEmitterTrait;
+
+ /**
+ * @var int Maximum output buffering size for each iteration.
+ */
+ private $maxBufferLength;
+
+ public function __construct(int $maxBufferLength = 8192)
+ {
+ $this->maxBufferLength = $maxBufferLength;
+ }
+
+ /**
+ * Emits a response for a PHP SAPI environment.
+ *
+ * Emits the status line and headers via the header() function, and the
+ * body content via the output buffer.
+ */
+ public function emit(ResponseInterface $response) : bool
+ {
+ $this->assertNoPreviousOutput();
+ $this->emitHeaders($response);
+ $this->emitStatusLine($response);
+
+ flush();
+
+ $range = $this->parseContentRange($response->getHeaderLine('Content-Range'));
+
+ if (null === $range || 'bytes' !== $range[0]) {
+ $this->emitBody($response);
+ return true;
+ }
+
+ $this->emitBodyRange($range, $response);
+ return true;
+ }
+
+ /**
+ * Emit the message body.
+ */
+ private function emitBody(ResponseInterface $response) : void
+ {
+ $body = $response->getBody();
+
+ if ($body->isSeekable()) {
+ $body->rewind();
+ }
+
+ if (! $body->isReadable()) {
+ echo $body;
+ return;
+ }
+
+ while (! $body->eof()) {
+ echo $body->read($this->maxBufferLength);
+ }
+ }
+
+ /**
+ * Emit a range of the message body.
+ */
+ private function emitBodyRange(array $range, ResponseInterface $response) : void
+ {
+ list($unit, $first, $last, $length) = $range;
+
+ $body = $response->getBody();
+
+ $length = $last - $first + 1;
+
+ if ($body->isSeekable()) {
+ $body->seek($first);
+
+ $first = 0;
+ }
+
+ if (! $body->isReadable()) {
+ echo substr($body->getContents(), $first, $length);
+ return;
+ }
+
+ $remaining = $length;
+
+ while ($remaining >= $this->maxBufferLength && ! $body->eof()) {
+ $contents = $body->read($this->maxBufferLength);
+ $remaining -= strlen($contents);
+
+ echo $contents;
+ }
+
+ if ($remaining > 0 && ! $body->eof()) {
+ echo $body->read($remaining);
+ }
+ }
+
+ /**
+ * Parse content-range header
+ * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16
+ *
+ * @return null|array [unit, first, last, length]; returns null if no
+ * content range or an invalid content range is provided
+ */
+ private function parseContentRange(string $header) : ?array
+ {
+ if (! preg_match('/(?P<unit>[\w]+)\s+(?P<first>\d+)-(?P<last>\d+)\/(?P<length>\d+|\*)/', $header, $matches)) {
+ return null;
+ }
+
+ return [
+ $matches['unit'],
+ (int) $matches['first'],
+ (int) $matches['last'],
+ $matches['length'] === '*' ? '*' : (int) $matches['length'],
+ ];
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/laminas/laminas-httphandlerrunner for the canonical source repository
+ * @copyright https://github.com/laminas/laminas-httphandlerrunner/blob/master/COPYRIGHT.md
+ * @license https://github.com/laminas/laminas-httphandlerrunner/blob/master/LICENSE.md New BSD License
+ */
+
+declare(strict_types=1);
+
+namespace Laminas\HttpHandlerRunner\Exception;
+
+use RuntimeException;
+
+class EmitterException extends RuntimeException implements ExceptionInterface
+{
+ public static function forHeadersSent() : self
+ {
+ return new self('Unable to emit response; headers already sent');
+ }
+
+ public static function forOutputSent() : self
+ {
+ return new self('Output has been emitted previously; cannot emit response');
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/laminas/laminas-httphandlerrunner for the canonical source repository
+ * @copyright https://github.com/laminas/laminas-httphandlerrunner/blob/master/COPYRIGHT.md
+ * @license https://github.com/laminas/laminas-httphandlerrunner/blob/master/LICENSE.md New BSD License
+ */
+
+declare(strict_types=1);
+
+namespace Laminas\HttpHandlerRunner\Exception;
+
+/**
+ * Marker interface for package exceptions.
+ */
+interface ExceptionInterface
+{
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/laminas/laminas-httphandlerrunner for the canonical source repository
+ * @copyright https://github.com/laminas/laminas-httphandlerrunner/blob/master/COPYRIGHT.md
+ * @license https://github.com/laminas/laminas-httphandlerrunner/blob/master/LICENSE.md New BSD License
+ */
+
+declare(strict_types=1);
+
+namespace Laminas\HttpHandlerRunner\Exception;
+
+use InvalidArgumentException;
+use Laminas\HttpHandlerRunner\Emitter;
+
+use function get_class;
+use function gettype;
+use function is_object;
+use function sprintf;
+
+class InvalidEmitterException extends InvalidArgumentException implements ExceptionInterface
+{
+ /**
+ * @var mixed $emitter Invalid emitter type
+ */
+ public static function forEmitter($emitter) : self
+ {
+ return new self(sprintf(
+ '%s can only compose %s implementations; received %s',
+ Emitter\EmitterStack::class,
+ Emitter\EmitterInterface::class,
+ is_object($emitter) ? get_class($emitter) : gettype($emitter)
+ ));
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * @see https://github.com/laminas/laminas-httphandlerrunner for the canonical source repository
+ * @copyright https://github.com/laminas/laminas-httphandlerrunner/blob/master/COPYRIGHT.md
+ * @license https://github.com/laminas/laminas-httphandlerrunner/blob/master/LICENSE.md New BSD License
+ */
+
+declare(strict_types=1);
+
+namespace Laminas\HttpHandlerRunner;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+use Throwable;
+
+/**
+ * "Run" a request handler.
+ *
+ * The RequestHandlerRunner will marshal a request using the composed factory, and
+ * then pass the request to the composed handler. Finally, it emits the response
+ * returned by the handler using the composed emitter.
+ *
+ * If the factory for generating the request raises an exception or throwable,
+ * then the runner will use the composed error response generator to generate a
+ * response, based on the exception or throwable raised.
+ */
+class RequestHandlerRunner
+{
+ /**
+ * @var Emitter\EmitterInterface
+ */
+ private $emitter;
+
+ /**
+ * A request handler to run as the application.
+ *
+ * @var RequestHandlerInterface
+ */
+ private $handler;
+
+ /**
+ * A factory capable of generating an error response in the scenario that
+ * the $serverRequestFactory raises an exception during generation of the
+ * request instance.
+ *
+ * The factory will receive the Throwable or Exception that caused the error,
+ * and must return a Psr\Http\Message\ResponseInterface instance.
+ *
+ * @var callable
+ */
+ private $serverRequestErrorResponseGenerator;
+
+ /**
+ * A factory capable of generating a Psr\Http\Message\ServerRequestInterface instance.
+ * The factory will not receive any arguments.
+ *
+ * @var callable
+ */
+ private $serverRequestFactory;
+
+ public function __construct(
+ RequestHandlerInterface $handler,
+ Emitter\EmitterInterface $emitter,
+ callable $serverRequestFactory,
+ callable $serverRequestErrorResponseGenerator
+ ) {
+ $this->handler = $handler;
+ $this->emitter = $emitter;
+
+ // Factories are cast as Closures to ensure return type safety.
+ $this->serverRequestFactory = function () use ($serverRequestFactory) : ServerRequestInterface {
+ return $serverRequestFactory();
+ };
+
+ $this->serverRequestErrorResponseGenerator =
+ function (Throwable $exception) use ($serverRequestErrorResponseGenerator) : ResponseInterface {
+ return $serverRequestErrorResponseGenerator($exception);
+ };
+ }
+
+ /**
+ * Run the application
+ */
+ public function run() : void
+ {
+ try {
+ $request = ($this->serverRequestFactory)();
+ } catch (Throwable $e) {
+ // Error in generating the request
+ $this->emitMarshalServerRequestException($e);
+ return;
+ }
+
+ $response = $this->handler->handle($request);
+
+ $this->emitter->emit($response);
+ }
+
+ private function emitMarshalServerRequestException(Throwable $exception) : void
+ {
+ $response = ($this->serverRequestErrorResponseGenerator)($exception);
+ $this->emitter->emit($response);
+ }
+}
--- /dev/null
+The MIT License (MIT)
+
+Copyright (c) 2016 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
--- /dev/null
+HTTP Server Handler
+===================
+
+Provides the `RequestHandlerInterface` of [PSR-15][psr-15].
+
+[psr-15]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-15-request-handlers.md
--- /dev/null
+{
+ "name": "psr/http-server-handler",
+ "description": "Common interface for HTTP server-side request handler",
+ "keywords": [
+ "psr",
+ "psr-7",
+ "psr-15",
+ "http-interop",
+ "http",
+ "server",
+ "handler",
+ "request",
+ "response"
+ ],
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "require": {
+ "php": ">=7.0",
+ "psr/http-message": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Server\\": "src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace Psr\Http\Server;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+/**
+ * Handles a server request and produces a response.
+ *
+ * An HTTP request handler process an HTTP request in order to produce an
+ * HTTP response.
+ */
+interface RequestHandlerInterface
+{
+ /**
+ * Handles a request and produces a response.
+ *
+ * May call other collaborating code to generate the response.
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface;
+}