|  |  | @ -57,6 +57,8 @@ use flight\net\Route; | 
			
		
	
		
		
			
				
					
					|  |  |  |  * @method void redirect(string $url, int $code = 303)  Redirects the current request to another URL. |  |  |  |  * @method void redirect(string $url, int $code = 303)  Redirects the current request to another URL. | 
			
		
	
		
		
			
				
					
					|  |  |  |  * @method void json(mixed $data, int $code = 200, bool $encode = true, string $charset = 'utf-8', int $option = 0) |  |  |  |  * @method void json(mixed $data, int $code = 200, bool $encode = true, string $charset = 'utf-8', int $option = 0) | 
			
		
	
		
		
			
				
					
					|  |  |  |  * Sends a JSON response. |  |  |  |  * Sends a JSON response. | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  * @method void jsonHalt(mixed $data, int $code = 200, bool $encode = true, string $charset = 'utf-8', int $option = 0) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  * Sends a JSON response and immediately halts the request. | 
			
		
	
		
		
			
				
					
					|  |  |  |  * @method void jsonp(mixed $data, string $param = 'jsonp', int $code = 200, bool $encode = true, string $charset = 'utf-8', int $option = 0) |  |  |  |  * @method void jsonp(mixed $data, string $param = 'jsonp', int $code = 200, bool $encode = true, string $charset = 'utf-8', int $option = 0) | 
			
		
	
		
		
			
				
					
					|  |  |  |  * Sends a JSONP response. |  |  |  |  * Sends a JSONP response. | 
			
		
	
		
		
			
				
					
					|  |  |  |  * |  |  |  |  * | 
			
		
	
	
		
		
			
				
					|  |  | @ -73,7 +75,7 @@ class Engine | 
			
		
	
		
		
			
				
					
					|  |  |  |      */ |  |  |  |      */ | 
			
		
	
		
		
			
				
					
					|  |  |  |     private const MAPPABLE_METHODS = [ |  |  |  |     private const MAPPABLE_METHODS = [ | 
			
		
	
		
		
			
				
					
					|  |  |  |         'start', 'stop', 'route', 'halt', 'error', 'notFound', |  |  |  |         'start', 'stop', 'route', 'halt', 'error', 'notFound', | 
			
		
	
		
		
			
				
					
					|  |  |  |         'render', 'redirect', 'etag', 'lastModified', 'json', 'jsonp', |  |  |  |         'render', 'redirect', 'etag', 'lastModified', 'json', 'jsonHalt', 'jsonp', | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         'post', 'put', 'patch', 'delete', 'group', 'getUrl' |  |  |  |         'post', 'put', 'patch', 'delete', 'group', 'getUrl' | 
			
		
	
		
		
			
				
					
					|  |  |  |     ]; |  |  |  |     ]; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -608,7 +610,7 @@ class Engine | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         try { |  |  |  |         try { | 
			
		
	
		
		
			
				
					
					|  |  |  |             $this->response() |  |  |  |             $this->response() | 
			
		
	
		
		
			
				
					
					|  |  |  |                 ->clear() |  |  |  |                 ->clearBody() | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 ->status(500) |  |  |  |                 ->status(500) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 ->write($msg) |  |  |  |                 ->write($msg) | 
			
		
	
		
		
			
				
					
					|  |  |  |                 ->send(); |  |  |  |                 ->send(); | 
			
		
	
	
		
		
			
				
					|  |  | @ -735,7 +737,7 @@ class Engine | 
			
		
	
		
		
			
				
					
					|  |  |  |     public function _halt(int $code = 200, string $message = '', bool $actuallyExit = true): void |  |  |  |     public function _halt(int $code = 200, string $message = '', bool $actuallyExit = true): void | 
			
		
	
		
		
			
				
					
					|  |  |  |     { |  |  |  |     { | 
			
		
	
		
		
			
				
					
					|  |  |  |         $this->response() |  |  |  |         $this->response() | 
			
		
	
		
		
			
				
					
					|  |  |  |             ->clear() |  |  |  |             ->clearBody() | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             ->status($code) |  |  |  |             ->status($code) | 
			
		
	
		
		
			
				
					
					|  |  |  |             ->write($message) |  |  |  |             ->write($message) | 
			
		
	
		
		
			
				
					
					|  |  |  |             ->send(); |  |  |  |             ->send(); | 
			
		
	
	
		
		
			
				
					|  |  | @ -750,7 +752,7 @@ class Engine | 
			
		
	
		
		
			
				
					
					|  |  |  |         $output = '<h1>404 Not Found</h1><h3>The page you have requested could not be found.</h3>'; |  |  |  |         $output = '<h1>404 Not Found</h1><h3>The page you have requested could not be found.</h3>'; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         $this->response() |  |  |  |         $this->response() | 
			
		
	
		
		
			
				
					
					|  |  |  |             ->clear() |  |  |  |             ->clearBody() | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             ->status(404) |  |  |  |             ->status(404) | 
			
		
	
		
		
			
				
					
					|  |  |  |             ->write($output) |  |  |  |             ->write($output) | 
			
		
	
		
		
			
				
					
					|  |  |  |             ->send(); |  |  |  |             ->send(); | 
			
		
	
	
		
		
			
				
					|  |  | @ -775,7 +777,7 @@ class Engine | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         $this->response() |  |  |  |         $this->response() | 
			
		
	
		
		
			
				
					
					|  |  |  |             ->clear() |  |  |  |             ->clearBody() | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             ->status($code) |  |  |  |             ->status($code) | 
			
		
	
		
		
			
				
					
					|  |  |  |             ->header('Location', $url) |  |  |  |             ->header('Location', $url) | 
			
		
	
		
		
			
				
					
					|  |  |  |             ->send(); |  |  |  |             ->send(); | 
			
		
	
	
		
		
			
				
					|  |  | @ -829,6 +831,33 @@ class Engine | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     /** | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * Sends a JSON response and halts execution immediately. | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * @param mixed $data JSON data | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * @param int $code HTTP status code | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * @param bool $encode Whether to perform JSON encoding | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * @param string $charset Charset | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * @param int $option Bitmask Json constant such as JSON_HEX_QUOT | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      * @throws Exception | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      */ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     public function _jsonHalt( | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         $data, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         int $code = 200, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         bool $encode = true, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         string $charset = 'utf-8', | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         int $option = 0 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     ): void { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         $this->json($data, $code, $encode, $charset, $option); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         $jsonBody = $this->response()->getBody(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if ($this->response()->v2_output_buffering === false) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             $this->response()->clearBody(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             $this->response()->send(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         $this->halt($code, $jsonBody, empty(getenv('PHPUNIT_TEST'))); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     /** |  |  |  |     /** | 
			
		
	
		
		
			
				
					
					|  |  |  |      * Sends a JSONP response. |  |  |  |      * Sends a JSONP response. | 
			
		
	
		
		
			
				
					
					|  |  |  |      * |  |  |  |      * | 
			
		
	
	
		
		
			
				
					|  |  | @ -877,6 +906,7 @@ class Engine | 
			
		
	
		
		
			
				
					
					|  |  |  |             isset($_SERVER['HTTP_IF_NONE_MATCH']) && |  |  |  |             isset($_SERVER['HTTP_IF_NONE_MATCH']) && | 
			
		
	
		
		
			
				
					
					|  |  |  |             $_SERVER['HTTP_IF_NONE_MATCH'] === $id |  |  |  |             $_SERVER['HTTP_IF_NONE_MATCH'] === $id | 
			
		
	
		
		
			
				
					
					|  |  |  |         ) { |  |  |  |         ) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             $this->response()->clear(); | 
			
		
	
		
		
			
				
					
					|  |  |  |             $this->halt(304, '', empty(getenv('PHPUNIT_TEST'))); |  |  |  |             $this->halt(304, '', empty(getenv('PHPUNIT_TEST'))); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
	
		
		
			
				
					|  |  | @ -894,6 +924,7 @@ class Engine | 
			
		
	
		
		
			
				
					
					|  |  |  |             isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && |  |  |  |             isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && | 
			
		
	
		
		
			
				
					
					|  |  |  |             strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) === $time |  |  |  |             strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) === $time | 
			
		
	
		
		
			
				
					
					|  |  |  |         ) { |  |  |  |         ) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             $this->response()->clear(); | 
			
		
	
		
		
			
				
					
					|  |  |  |             $this->halt(304, '', empty(getenv('PHPUNIT_TEST'))); |  |  |  |             $this->halt(304, '', empty(getenv('PHPUNIT_TEST'))); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |