Skip to content
This repository has been archived by the owner on Jan 21, 2020. It is now read-only.

X-HTTP-Method-Override listener #81

Closed
wants to merge 14 commits into from
58 changes: 58 additions & 0 deletions src/HttpMethodOverrideListener.php
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) 2016 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)) {
return new ApiProblemResponse(new ApiProblem(
400,
'unrecognized method in X-HTTP-Method-Ovverride header'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please change to uppercase U in unrecognized word

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

U in unrecognized please

));
}

$request->setMethod($method);
}
}
85 changes: 85 additions & 0 deletions test/HttpMethodOverrideListenerTest.php
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) 2016 Zend Technologies USA Inc. (http://www.zend.com)
*/

namespace ZFTest\ContentNegotiation;

use PHPUnit_Framework_TestCase as TestCase;
use Zend\Http\Request as HttpRequest;
use Zend\Mvc\MvcEvent;
use ZF\ApiProblem\ApiProblemResponse;
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());
}

/**
*
*/
Copy link
Member

Choose a reason for hiding this comment

The 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(ApiProblemResponse::class, $result);
$problem = $result->getApiProblem();
$this->assertEquals(400, $problem->status);
$this->assertContains('unrecognized method in X-HTTP-Method-Ovverride header', $problem->detail);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

U in unrecognized please

}
}