Browse Source

Allow using "Unassigned" HTTP status codes within 1xx - 5xx range.

Refs #14372
ADmad 6 years ago
parent
commit
c3fe343e3e
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;
     use MessageTrait;
 
 
+    public const MIN_STATUS_CODE_VALUE = 100;
+
+    public const MAX_STATUS_CODE_VALUE = 599;
+
     /**
     /**
      * Allowed HTTP status codes and their default description.
      * Allowed HTTP status codes and their default description.
      *
      *
@@ -992,7 +996,7 @@ class Response implements ResponseInterface
      */
      */
     protected function _setStatus($code, $reasonPhrase = '')
     protected function _setStatus($code, $reasonPhrase = '')
     {
     {
-        if (!isset($this->_statusCodes[$code])) {
+        if ($code < static::MIN_STATUS_CODE_VALUE || $code > static::MAX_STATUS_CODE_VALUE) {
             throw new InvalidArgumentException(sprintf(
             throw new InvalidArgumentException(sprintf(
                 'Invalid status code: %s. Use a valid HTTP status code in range 1xx - 5xx.',
                 'Invalid status code: %s. Use a valid HTTP status code in range 1xx - 5xx.',
                 $code
                 $code
@@ -1000,7 +1004,7 @@ class Response implements ResponseInterface
         }
         }
 
 
         $this->_status = $code;
         $this->_status = $code;
-        if (empty($reasonPhrase)) {
+        if ($reasonPhrase === '' && isset($this->_statusCodes[$code])) {
             $reasonPhrase = $this->_statusCodes[$code];
             $reasonPhrase = $this->_statusCodes[$code];
         }
         }
         $this->_reasonPhrase = $reasonPhrase;
         $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
      * @return void
      */
      */
@@ -2976,12 +2976,18 @@ class ResponseTest extends TestCase
         $response = new Response();
         $response = new Response();
         $statusCode = $response->getStatusCode();
         $statusCode = $response->getStatusCode();
         $this->assertEquals(200, $statusCode);
         $this->assertEquals(200, $statusCode);
+
         $response2 = $response->withStatus(404);
         $response2 = $response->withStatus(404);
         $statusCode = $response2->getStatusCode();
         $statusCode = $response2->getStatusCode();
         $this->assertEquals(404, $statusCode);
         $this->assertEquals(404, $statusCode);
+
         $statusCode = $response->getStatusCode();
         $statusCode = $response->getStatusCode();
         $this->assertEquals(200, $statusCode);
         $this->assertEquals(200, $statusCode);
         $this->assertNotEquals($response, $response2);
         $this->assertNotEquals($response, $response2);
+
+        $response3 = $response->withStatus(111);
+        $this->assertEquals(111, $response3->getStatusCode());
+        $this->assertSame('', $response3->getReasonPhrase());
     }
     }
 
 
     /**
     /**