use MediaWiki\Shell\Shell;
use Wikimedia\ScopedCallback;
use Wikimedia\Rdbms\DBReplicationWaitError;
+use Wikimedia\WrappedString;
/**
* Load an extension
}
/**
- * Like array_filter with ARRAY_FILTER_USE_BOTH, but works pre-5.6.
+ * @deprecated since 1.32, use array_filter() with ARRAY_FILTER_USE_BOTH directly
*
* @param array $arr
* @param callable $callback Will be called with the array value and key (in that order) and
* @return array
*/
function wfArrayFilter( array $arr, callable $callback ) {
- if ( defined( 'ARRAY_FILTER_USE_BOTH' ) ) {
- return array_filter( $arr, $callback, ARRAY_FILTER_USE_BOTH );
- }
- $filteredKeys = array_filter( array_keys( $arr ), function ( $key ) use ( $arr, $callback ) {
- return call_user_func( $callback, $arr[$key], $key );
- } );
- return array_intersect_key( $arr, array_fill_keys( $filteredKeys, true ) );
+ return array_filter( $arr, $callback, ARRAY_FILTER_USE_BOTH );
}
/**
- * Like array_filter with ARRAY_FILTER_USE_KEY, but works pre-5.6.
+ * @deprecated since 1.32, use array_filter() with ARRAY_FILTER_USE_KEY directly
*
* @param array $arr
* @param callable $callback Will be called with the array key and should return a bool which
* @return array
*/
function wfArrayFilterByKey( array $arr, callable $callback ) {
- return wfArrayFilter( $arr, function ( $val, $key ) use ( $callback ) {
- return call_user_func( $callback, $key );
- } );
+ return array_filter( $arr, $callback, ARRAY_FILTER_USE_KEY );
}
/**
} elseif ( substr( $url, 0, 1 ) == '/' ) {
// If $serverUrl is protocol-relative, prepend $defaultProtoWithoutSlashes,
// otherwise leave it alone.
- $url = ( $serverHasProto ? '' : $defaultProtoWithoutSlashes ) . $serverUrl . $url;
+ if ( $serverHasProto ) {
+ $url = $serverUrl . $url;
+ } else {
+ // If an HTTPS URL is synthesized from a protocol-relative $wgServer, allow the
+ // user to override the port number (T67184)
+ if ( $defaultProto === PROTO_HTTPS && $wgHttpsPort != 443 ) {
+ if ( isset( $bits['port'] ) ) {
+ throw new Exception( 'A protocol-relative $wgServer may not contain a port number' );
+ }
+ $url = $defaultProtoWithoutSlashes . $serverUrl . ':' . $wgHttpsPort . $url;
+ } else {
+ $url = $defaultProtoWithoutSlashes . $serverUrl . $url;
+ }
+ }
}
$bits = wfParseUrl( $url );
- // ensure proper port for HTTPS arrives in URL
- // https://phabricator.wikimedia.org/T67184
- if ( $defaultProto === PROTO_HTTPS && $wgHttpsPort != 443 ) {
- $bits['port'] = $wgHttpsPort;
- }
-
if ( $bits && isset( $bits['path'] ) ) {
$bits['path'] = wfRemoveDotSegments( $bits['path'] );
return wfAssembleUrl( $bits );
return false;
}
+/**
+ * Get the wiki's "server", i.e. the protocol and host part of the URL, with a
+ * protocol specified using a PROTO_* constant as in wfExpandUrl()
+ *
+ * @since 1.32
+ * @param string|int|null $proto One of the PROTO_* constants.
+ * @return string The URL
+ */
+function wfGetServerUrl( $proto ) {
+ $url = wfExpandUrl( '/', $proto );
+ return substr( $url, 0, -1 );
+}
+
/**
* This function will reassemble a URL parsed with wfParseURL. This is useful
* if you need to edit part of a URL and put it back together.
function wfExpandIRI( $url ) {
return preg_replace_callback(
'/((?:%[89A-F][0-9A-F])+)/i',
- 'wfExpandIRI_callback',
+ function ( array $matches ) {
+ return urldecode( $matches[1] );
+ },
wfExpandUrl( $url )
);
}
-/**
- * Private callback for wfExpandIRI
- * @param array $matches
- * @return string
- */
-function wfExpandIRI_callback( $matches ) {
- return urldecode( $matches[1] );
-}
-
/**
* Make URL indexes, appropriate for the el_index field of externallinks.
*
* If $wgShowHostnames is true, the script will also set 'wgHostname' to the
* hostname of the server handling the request.
*
- * @param string $nonce Value from OutputPage::getCSPNonce
+ * @param string|null $nonce Value from OutputPage::getCSPNonce
* @return string|WrappedString HTML
*/
function wfReportTime( $nonce = null ) {
* As required by the callers, "<nowiki>" is not used.
*
* @param string $text Text to be escaped
+ * @param-taint $text escapes_html
* @return string
*/
function wfEscapeWikiText( $text ) {
* For dealing with nullable timestamp columns in the database.
*
* @param int $outputtype
- * @param string $ts
+ * @param string|null $ts
* @return string
*/
function wfTimestampOrNull( $outputtype = TS_UNIX, $ts = null ) {
* Make directory, and make all parent directories if they don't exist
*
* @param string $dir Full path to directory to create
- * @param int $mode Chmod value to use, default is $wgDirectoryMode
- * @param string $caller Optional caller param for debugging.
+ * @param int|null $mode Chmod value to use, default is $wgDirectoryMode
+ * @param string|null $caller Optional caller param for debugging.
* @throws MWException
* @return bool
*/
* @param string $mine
* @param string $yours
* @param string &$result
- * @param string &$mergeAttemptResult
+ * @param string|null &$mergeAttemptResult
* @return bool
*/
function wfMerge( $old, $mine, $yours, &$result, &$mergeAttemptResult = null ) {
* @return string The language code which complying with BCP 47 standards.
*/
function wfBCP47( $code ) {
+ wfDeprecated( __METHOD__, '1.31' );
return LanguageCode::bcp47( $code );
}
*
* @param string $name The image name to check
* @param Title|bool $contextTitle The page on which the image occurs, if known
- * @param string $blacklist Wikitext of a file blacklist
+ * @param string|null $blacklist Wikitext of a file blacklist
* @return bool
*/
function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {