174 lines
4.6 KiB
PHP
174 lines
4.6 KiB
PHP
<?php
|
|
/**
|
|
* Slim Framework (http://slimframework.com)
|
|
*
|
|
* @link https://github.com/slimphp/Slim
|
|
* @copyright Copyright (c) 2011-2015 Josh Lockhart
|
|
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
|
|
*/
|
|
namespace Slim\Handlers;
|
|
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
use Psr\Http\Message\ResponseInterface;
|
|
use Slim\Http\Body;
|
|
|
|
/**
|
|
* Default Slim application not allowed handler
|
|
*
|
|
* It outputs a simple message in either JSON, XML or HTML based on the
|
|
* Accept header.
|
|
*/
|
|
class NotAllowed
|
|
{
|
|
/**
|
|
* Known handled content types
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $knownContentTypes = [
|
|
'application/json',
|
|
'application/xml',
|
|
'text/xml',
|
|
'text/html',
|
|
];
|
|
|
|
/**
|
|
* Invoke error handler
|
|
*
|
|
* @param ServerRequestInterface $request The most recent Request object
|
|
* @param ResponseInterface $response The most recent Response object
|
|
* @param string[] $methods Allowed HTTP methods
|
|
*
|
|
* @return ResponseInterface
|
|
*/
|
|
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, array $methods)
|
|
{
|
|
if ($request->getMethod() === 'OPTIONS') {
|
|
$status = 200;
|
|
$contentType = 'text/plain';
|
|
$output = $this->renderPlainNotAllowedMessage($methods);
|
|
} else {
|
|
$status = 405;
|
|
$contentType = $this->determineContentType($request);
|
|
switch ($contentType) {
|
|
case 'application/json':
|
|
$output = $this->renderJsonNotAllowedMessage($methods);
|
|
break;
|
|
|
|
case 'text/xml':
|
|
case 'application/xml':
|
|
$output = $this->renderXmlNotAllowedMessage($methods);
|
|
break;
|
|
|
|
case 'text/html':
|
|
$output = $this->renderHtmlNotAllowedMessage($methods);
|
|
break;
|
|
}
|
|
}
|
|
|
|
$body = new Body(fopen('php://temp', 'r+'));
|
|
$body->write($output);
|
|
$allow = implode(', ', $methods);
|
|
|
|
return $response
|
|
->withStatus($status)
|
|
->withHeader('Content-type', $contentType)
|
|
->withHeader('Allow', $allow)
|
|
->withBody($body);
|
|
}
|
|
|
|
/**
|
|
* Determine which content type we know about is wanted using Accept header
|
|
*
|
|
* @param ServerRequestInterface $request
|
|
* @return string
|
|
*/
|
|
private function determineContentType(ServerRequestInterface $request)
|
|
{
|
|
$acceptHeader = $request->getHeaderLine('Accept');
|
|
$selectedContentTypes = array_intersect(explode(',', $acceptHeader), $this->knownContentTypes);
|
|
|
|
if (count($selectedContentTypes)) {
|
|
return $selectedContentTypes[0];
|
|
}
|
|
|
|
return 'text/html';
|
|
}
|
|
|
|
/**
|
|
* Render PLAIN not allowed message
|
|
*
|
|
* @param array $methods
|
|
* @return string
|
|
*/
|
|
protected function renderPlainNotAllowedMessage($methods)
|
|
{
|
|
$allow = implode(', ', $methods);
|
|
|
|
return 'Allowed methods: ' . $allow;
|
|
}
|
|
|
|
/**
|
|
* Render JSON not allowed message
|
|
*
|
|
* @param array $methods
|
|
* @return string
|
|
*/
|
|
protected function renderJsonNotAllowedMessage($methods)
|
|
{
|
|
$allow = implode(', ', $methods);
|
|
|
|
return '{"message":"Method not allowed. Must be one of: ' . $allow . '"}';
|
|
}
|
|
|
|
/**
|
|
* Render XML not allowed message
|
|
*
|
|
* @param array $methods
|
|
* @return string
|
|
*/
|
|
protected function renderXmlNotAllowedMessage($methods)
|
|
{
|
|
$allow = implode(', ', $methods);
|
|
|
|
return "<root><message>Method not allowed. Must be one of: $allow</message></root>";
|
|
}
|
|
|
|
/**
|
|
* Render HTML not allowed message
|
|
*
|
|
* @param array $methods
|
|
* @return string
|
|
*/
|
|
protected function renderHtmlNotAllowedMessage($methods)
|
|
{
|
|
$allow = implode(', ', $methods);
|
|
$output = <<<END
|
|
<html>
|
|
<head>
|
|
<title>Method not allowed</title>
|
|
<style>
|
|
body{
|
|
margin:0;
|
|
padding:30px;
|
|
font:12px/1.5 Helvetica,Arial,Verdana,sans-serif;
|
|
}
|
|
h1{
|
|
margin:0;
|
|
font-size:48px;
|
|
font-weight:normal;
|
|
line-height:48px;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>Method not allowed</h1>
|
|
<p>Method not allowed. Must be one of: <strong>$allow</strong></p>
|
|
</body>
|
|
</html>
|
|
END;
|
|
|
|
return $output;
|
|
}
|
|
}
|