diff options
author | daniel <dkinzler@wikimedia.org> | 2023-10-19 23:13:26 +0200 |
---|---|---|
committer | daniel <dkinzler@wikimedia.org> | 2024-02-02 13:03:29 +0100 |
commit | 24d0aee05e614c38380010731188b816114d523b (patch) | |
tree | 46a72c06d7fccbacae740c223c138aa909e18141 /includes/EntryPointEnvironment.php | |
parent | 0ce2d4e7783610a15078e44aadd05ee5220e51b0 (diff) | |
download | mediawikicore-24d0aee05e614c38380010731188b816114d523b.tar.gz mediawikicore-24d0aee05e614c38380010731188b816114d523b.zip |
entrypoint: Isolate entry points from PHP runtime for testing
1) Introduce EntryPointEnvironment which wraps functions that interact
with the PHP runtime, so they can be mocked for testing.
2) Allow server info fields to be overwritten in FauxRequest.
3) Make MediaWikiEntryPoint use WebResponse to set headers
Bug: T354216
Change-Id: Ic21950c956de5d2b5a7dd66a1e2de58f807cfd9f
Diffstat (limited to 'includes/EntryPointEnvironment.php')
-rw-r--r-- | includes/EntryPointEnvironment.php | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/includes/EntryPointEnvironment.php b/includes/EntryPointEnvironment.php new file mode 100644 index 000000000000..78ef2869b0bc --- /dev/null +++ b/includes/EntryPointEnvironment.php @@ -0,0 +1,120 @@ +<?php +/** + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + */ + +namespace MediaWiki; + +/** + * Utility class wrapping PHP runtime state. + * + * @internal For use by MediaWikiEntryPoint subclasses. + * Should be revised before wider use. + */ +class EntryPointEnvironment { + + public function isCli(): bool { + return PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg'; + } + + /** + * @see fastcgi_finish_request + */ + public function hasFastCgi(): bool { + return function_exists( 'fastcgi_finish_request' ); + } + + /** + * @see fastcgi_finish_request + */ + public function fastCgiFinishRequest(): bool { + if ( $this->hasFastCgi() ) { + return fastcgi_finish_request(); + } + return false; + } + + public function getServerInfo( string $key, $default = null ) { + return $_SERVER[$key] ?? $default; + } + + /** + * @param int $code + * + * @return never + */ + public function exit( int $code = 0 ) { + exit( $code ); + } + + public function disableModDeflate(): void { + if ( function_exists( 'apache_setenv' ) ) { + // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged + @apache_setenv( + 'no-gzip', + '1' + ); + } + } + + /** + * Triggers a PHP runtime error + * + * @see trigger_error + */ + public function triggerError( string $message, int $level = E_USER_NOTICE ): bool { + return trigger_error( $message, $level ); + } + + /** + * Returns the value of an environment variable. + * + * @see getenv + * + * @param string $name + * + * @return array|false|string + */ + public function getEnv( string $name ) { + return getenv( $name ); + } + + /** + * Returns the value of an ini option. + * + * @see ini_get + * + * @param string $name + * + * @return false|string + */ + public function getIni( string $name ) { + return ini_get( $name ); + } + + /** + * @param string $name + * @param mixed $value + * + * @return false|string + */ + public function setIniOption( string $name, $value ) { + return ini_set( $name, $value ); + } + +} |