Jelajahi Sumber

merged branch vicb/response/statuscode (PR #4980)

Commits
-------

ed8823c [HttpFoundation] Allow setting an unknown status code without specifying a text

Discussion
----------

[HttpFoundation] Allow setting an unknown status code without specifying...

... a text

fix #4978
Fabien Potencier 13 tahun lalu
induk
melakukan
112a51392a

+ 18 - 3
src/Symfony/Component/HttpFoundation/Response.php

@@ -254,7 +254,10 @@ class Response
      * Sets the response status code.
      *
      * @param integer $code HTTP status code
-     * @param string  $text HTTP status text
+     * @param mixed   $text HTTP status text
+     *
+     * If the status text is null it will be automatically populated for the known
+     * status codes and left empty otherwise.
      *
      * @throws \InvalidArgumentException When the HTTP status code is not valid
      *
@@ -262,12 +265,24 @@ class Response
      */
     public function setStatusCode($code, $text = null)
     {
-        $this->statusCode = (int) $code;
+        $this->statusCode = $code = (int) $code;
         if ($this->isInvalid()) {
             throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code));
         }
 
-        $this->statusText = false === $text ? '' : (null === $text ? self::$statusTexts[$this->statusCode] : $text);
+        if (null === $text) {
+            $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : '';
+
+            return;
+        }
+
+        if (false === $text) {
+            $this->statusText = '';
+
+            return;
+        }
+
+        $this->statusText = $text;
     }
 
     /**

+ 27 - 0
tests/Symfony/Tests/Component/HttpFoundation/ResponseTest.php

@@ -323,6 +323,33 @@ class ResponseTest extends \PHPUnit_Framework_TestCase
         $this->assertFalse($response->isInvalid());
     }
 
+    /**
+     * @dataProvider getStatusCodeFixtures
+     */
+    public function testSetStatusCode($code, $text, $expectedText)
+    {
+        $response = new Response();
+
+        $response->setStatusCode($code, $text);
+
+        $statusText = new \ReflectionProperty($response, 'statusText');
+        $statusText->setAccessible(true);
+
+        $this->assertEquals($expectedText, $statusText->getValue($response));
+    }
+
+    public function getStatusCodeFixtures()
+    {
+        return array(
+            array('200', null, 'OK'),
+            array('200', false, ''),
+            array('200', 'foo', 'foo'),
+            array('199', null, ''),
+            array('199', false, ''),
+            array('199', 'foo', 'foo')
+        );
+    }
+
     public function testIsInformational()
     {
         $response = new Response('', 100);