From 47802105d3ab82c08303900c0ded5e977c4889d1 Mon Sep 17 00:00:00 2001 From: rpg600 Date: Mon, 8 Sep 2014 10:53:21 +0200 Subject: [PATCH] [Form] Add a form error if post_max_size has been reached. --- .../HttpFoundationRequestHandler.php | 19 +++++++++++++++++ .../Component/Form/NativeRequestHandler.php | 18 ++++++++++++++++ .../Form/Tests/AbstractRequestHandlerTest.php | 21 +++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php b/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php index 2094699481..065d01aec8 100644 --- a/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php +++ b/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php @@ -12,6 +12,8 @@ namespace Symfony\Component\Form\Extension\HttpFoundation; use Symfony\Component\Form\Exception\UnexpectedTypeException; +use Symfony\Component\Form\Extension\Validator\Util\ServerParams; +use Symfony\Component\Form\FormError; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\RequestHandlerInterface; use Symfony\Component\HttpFoundation\Request; @@ -24,6 +26,19 @@ use Symfony\Component\HttpFoundation\Request; */ class HttpFoundationRequestHandler implements RequestHandlerInterface { + /** + * @var ServerParams + */ + private $serverParams; + + /** + * {@inheritdoc} + */ + public function __construct(ServerParams $params = null) + { + $this->serverParams = $params ?: new ServerParams(); + } + /** * {@inheritdoc} */ @@ -61,6 +76,10 @@ class HttpFoundationRequestHandler implements RequestHandlerInterface $params = $request->request->get($name, $default); $files = $request->files->get($name, $default); } else { + if ($this->serverParams->getContentLength() > $this->serverParams->getPostMaxSize()) { + $form->addError(new FormError('Max post size exceeded.')); + } + // Don't submit the form if it is not present in the request return; } diff --git a/src/Symfony/Component/Form/NativeRequestHandler.php b/src/Symfony/Component/Form/NativeRequestHandler.php index fefe546af8..02c90c8798 100644 --- a/src/Symfony/Component/Form/NativeRequestHandler.php +++ b/src/Symfony/Component/Form/NativeRequestHandler.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Form; use Symfony\Component\Form\Exception\UnexpectedTypeException; +use Symfony\Component\Form\Extension\Validator\Util\ServerParams; /** * A request handler using PHP's super globals $_GET, $_POST and $_SERVER. @@ -20,6 +21,19 @@ use Symfony\Component\Form\Exception\UnexpectedTypeException; */ class NativeRequestHandler implements RequestHandlerInterface { + /** + * @var ServerParams + */ + private $serverParams; + + /** + * {@inheritdoc} + */ + public function __construct(ServerParams $params = null) + { + $this->serverParams = $params ?: new ServerParams(); + } + /** * The allowed keys of the $_FILES array. * @@ -75,6 +89,10 @@ class NativeRequestHandler implements RequestHandlerInterface $params = array_key_exists($name, $_POST) ? $_POST[$name] : $default; $files = array_key_exists($name, $fixedFiles) ? $fixedFiles[$name] : $default; } else { + if ($this->serverParams->getContentLength() > $this->serverParams->getPostMaxSize()) { + $form->addError(new FormError('Max post size exceeded.')); + } + // Don't submit the form if it is not present in the request return; } diff --git a/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php b/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php index fbba16ba17..8eb4816d57 100644 --- a/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Form\Tests; +use Symfony\Component\Form\Forms; + /** * @author Bernhard Schussek */ @@ -21,11 +23,17 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase */ protected $requestHandler; + /** + * @var \Symfony\Component\Form\FormFactory + */ + protected $factory; + protected $request; protected function setUp() { $this->requestHandler = $this->getRequestHandler(); + $this->factory = Forms::createFormFactoryBuilder()->getFormFactory(); $this->request = null; } @@ -249,6 +257,19 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase $this->requestHandler->handleRequest($form, $this->request); } + public function testAddFormErrorIfPostMaxSizeExceeded() + { + $form = $this->factory->createNamed('name', 'text'); + $this->setRequestData('POST', array(), array()); + $_SERVER['CONTENT_LENGTH'] = 1000000000; + + $this->requestHandler->handleRequest($form, $this->request); + + $this->assertEquals("ERROR: Max post size exceeded.\n", $form->getErrorsAsString()); + + unset($_SERVER['CONTENT_LENGTH']); + } + abstract protected function setRequestData($method, $data, $files = array()); abstract protected function getRequestHandler();