-
Notifications
You must be signed in to change notification settings - Fork 32
X-HTTP-Method-Override listener #81
Changes from 1 commit
4677f11
9db72f2
e36c3eb
da71cb0
4b1f500
ac6e42e
d9586c5
43768f7
30887a7
37a4d74
3023a4a
0277845
8bac35c
dabc4e0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
<?php | ||
/** | ||
* @license http://opensource.org/licenses/BSD-3-Clause BSD-3-Clause | ||
* @copyright Copyright (c) 2014 Zend Technologies USA Inc. (http://www.zend.com) | ||
*/ | ||
|
||
namespace ZF\ContentNegotiation; | ||
|
||
use Zend\Mvc\MvcEvent; | ||
use ZF\ApiProblem\ApiProblem; | ||
use ZF\ApiProblem\ApiProblemResponse; | ||
use Zend\Http\Request as HttpRequest; | ||
|
||
class HttpMethodOverrideListener | ||
{ | ||
/** | ||
* @var array | ||
*/ | ||
protected $methods = [ | ||
HttpRequest::METHOD_HEAD, | ||
HttpRequest::METHOD_POST, | ||
HttpRequest::METHOD_PUT, | ||
HttpRequest::METHOD_DELETE, | ||
HttpRequest::METHOD_PATCH, | ||
]; | ||
|
||
/** | ||
* Checks for X-HTTP-Method-Override header and sets header inside request object. | ||
* | ||
* @param MvcEvent $event | ||
* @return void|ApiProblemResponse | ||
*/ | ||
public function __invoke(MvcEvent $event) | ||
{ | ||
$request = $event->getRequest(); | ||
|
||
if(!$request instanceof HttpRequest){ | ||
return; | ||
} | ||
|
||
if(!$request->getHeaders()->has('X-HTTP-Method-Override')){ | ||
return; | ||
} | ||
|
||
$header = $request->getHeader('X-HTTP-Method-Override'); | ||
|
||
$method = $header->getFieldValue(); | ||
|
||
if (!in_array($method, $this->methods)) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please add one space after |
||
return new ApiProblemResponse(new ApiProblem( | ||
400, | ||
'unrecognized method in X-HTTP-Method-Ovverride header' | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please change to uppercase There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
)); | ||
} | ||
|
||
$request->setMethod($method); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
<?php | ||
/** | ||
* @license http://opensource.org/licenses/BSD-3-Clause BSD-3-Clause | ||
* @copyright Copyright (c) 2014 Zend Technologies USA Inc. (http://www.zend.com) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please update year - |
||
*/ | ||
|
||
namespace ZFTest\ContentNegotiation; | ||
|
||
use PHPUnit_Framework_TestCase as TestCase; | ||
use Zend\Http\Request as HttpRequest; | ||
use Zend\Mvc\MvcEvent; | ||
use ZF\ContentNegotiation\HttpMethodOverrideListener; | ||
|
||
class HttpMethodOverrideListenerTest extends TestCase | ||
{ | ||
use RouteMatchFactoryTrait; | ||
|
||
/** | ||
* @var HttpMethodOverrideListener | ||
*/ | ||
protected $listener; | ||
|
||
/** | ||
* Set up test | ||
*/ | ||
public function setUp() | ||
{ | ||
$this->listener = new HttpMethodOverrideListener(); | ||
} | ||
|
||
/** | ||
* @return array | ||
*/ | ||
public function httpMethods() | ||
{ | ||
return [ | ||
'head' => [HttpRequest::METHOD_HEAD], | ||
'post' => [HttpRequest::METHOD_POST], | ||
'put' => [HttpRequest::METHOD_PUT], | ||
'delete' => [HttpRequest::METHOD_DELETE], | ||
'patch' => [HttpRequest::METHOD_PATCH], | ||
]; | ||
} | ||
|
||
/** | ||
* @dataProvider httpMethods | ||
*/ | ||
public function testHttpMethodOverrideListener($method) | ||
{ | ||
$listener = $this->listener; | ||
|
||
$request = new HttpRequest(); | ||
$request->setMethod('GET'); | ||
$request->getHeaders()->addHeaderLine('X-HTTP-Method-Override', $method); | ||
|
||
$event = new MvcEvent(); | ||
$event->setRequest($request); | ||
$event->setRouteMatch($this->createRouteMatch([])); | ||
|
||
$result = $listener($event); | ||
$this->assertEquals($method, $request->getMethod()); | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please remove empty line above. |
||
} | ||
|
||
/** | ||
* | ||
*/ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What does it for? |
||
public function testHttpMethodOverrideListenerReturnsProblemResponse() | ||
{ | ||
$listener = $this->listener; | ||
|
||
$request = new HttpRequest(); | ||
$request->setMethod('GET'); | ||
$request->getHeaders()->addHeaderLine('X-HTTP-Method-Override', 'TEST'); | ||
|
||
$event = new MvcEvent(); | ||
$event->setRequest($request); | ||
|
||
$result = $listener($event); | ||
$this->assertInstanceOf('ZF\ApiProblem\ApiProblemResponse', $result); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please use |
||
$problem = $result->getApiProblem(); | ||
$this->assertEquals(400, $problem->status); | ||
$this->assertContains('unrecognized method in X-HTTP-Method-Ovverride header', $problem->detail); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please update year -
2016
instead of2014
here.