Browse Source

Merge pull request #14374 from cakephp/port-14373

Backport changes from #14373 to 3.x
othercorey 6 years ago
parent
commit
2b43b8a97d
2 changed files with 13 additions and 3 deletions
  1. 6 2
      src/Http/Response.php
  2. 7 1
      tests/TestCase/Http/ResponseTest.php

+ 6 - 2
src/Http/Response.php

@@ -46,6 +46,10 @@ class Response implements ResponseInterface
 {
     use MessageTrait;
 
+    const STATUS_CODE_MIN = 100;
+
+    const STATUS_CODE_MAX = 599;
+
     /**
      * Allowed HTTP status codes and their default description.
      *
@@ -992,7 +996,7 @@ class Response implements ResponseInterface
      */
     protected function _setStatus($code, $reasonPhrase = '')
     {
-        if (!isset($this->_statusCodes[$code])) {
+        if ($code < static::STATUS_CODE_MIN || $code > static::STATUS_CODE_MAX) {
             throw new InvalidArgumentException(sprintf(
                 'Invalid status code: %s. Use a valid HTTP status code in range 1xx - 5xx.',
                 $code
@@ -1000,7 +1004,7 @@ class Response implements ResponseInterface
         }
 
         $this->_status = $code;
-        if (empty($reasonPhrase)) {
+        if ($reasonPhrase === '' && isset($this->_statusCodes[$code])) {
             $reasonPhrase = $this->_statusCodes[$code];
         }
         $this->_reasonPhrase = $reasonPhrase;

+ 7 - 1
tests/TestCase/Http/ResponseTest.php

@@ -2967,7 +2967,7 @@ class ResponseTest extends TestCase
     }
 
     /**
-     * Test with protocol.
+     * Test with status code.
      *
      * @return void
      */
@@ -2976,12 +2976,18 @@ class ResponseTest extends TestCase
         $response = new Response();
         $statusCode = $response->getStatusCode();
         $this->assertEquals(200, $statusCode);
+
         $response2 = $response->withStatus(404);
         $statusCode = $response2->getStatusCode();
         $this->assertEquals(404, $statusCode);
+
         $statusCode = $response->getStatusCode();
         $this->assertEquals(200, $statusCode);
         $this->assertNotEquals($response, $response2);
+
+        $response3 = $response->withStatus(111);
+        $this->assertEquals(111, $response3->getStatusCode());
+        $this->assertSame('', $response3->getReasonPhrase());
     }
 
     /**