Merge "Remove broken explode() from MediaWikiMediaTestCase::dataFile()"
[lhc/web/wiklou.git] / includes / api / ApiBase.php
index dfaff8b..9b3d116 100644 (file)
@@ -1282,7 +1282,7 @@ abstract class ApiBase extends ContextSource {
                                                                }
                                                        }
                                                } else {
-                                                       $value = intval( $value );
+                                                       $value = (int)$value;
                                                        if ( !is_null( $min ) || !is_null( $max ) ) {
                                                                $this->validateLimit( $paramName, $value, $min, $max, null, $enforceLimits );
                                                        }
@@ -1311,7 +1311,7 @@ abstract class ApiBase extends ContextSource {
                                                                : $paramSettings[self::PARAM_MAX];
                                                        $this->getResult()->addParsedLimit( $this->getModuleName(), $value );
                                                } else {
-                                                       $value = intval( $value );
+                                                       $value = (int)$value;
                                                        $this->validateLimit(
                                                                $paramName,
                                                                $value,
@@ -1805,13 +1805,16 @@ abstract class ApiBase extends ContextSource {
 
                $status = Status::newGood();
                foreach ( $errors as $error ) {
-                       if ( is_array( $error ) && isset( self::$blockMsgMap[$error[0]] ) && $user->getBlock() ) {
+                       if ( !is_array( $error ) ) {
+                               $error = [ $error ];
+                       }
+                       if ( is_string( $error[0] ) && isset( self::$blockMsgMap[$error[0]] ) && $user->getBlock() ) {
                                list( $msg, $code ) = self::$blockMsgMap[$error[0]];
                                $status->fatal( ApiMessage::create( $msg, $code,
                                        [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
                                ) );
                        } else {
-                               $status->fatal( ...(array)$error );
+                               $status->fatal( ...$error );
                        }
                }
                return $status;
@@ -2222,13 +2225,33 @@ abstract class ApiBase extends ContextSource {
         * @param string $feature Feature being used.
         */
        public function logFeatureUsage( $feature ) {
+               static $loggedFeatures = [];
+
+               // Only log each feature once per request. We can get multiple calls from calls to
+               // extractRequestParams() with different values for 'parseLimit', for example.
+               if ( isset( $loggedFeatures[$feature] ) ) {
+                       return;
+               }
+               $loggedFeatures[$feature] = true;
+
                $request = $this->getRequest();
-               $s = '"' . addslashes( $feature ) . '"' .
-                       ' "' . wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) . '"' .
-                       ' "' . $request->getIP() . '"' .
-                       ' "' . addslashes( $request->getHeader( 'Referer' ) ) . '"' .
-                       ' "' . addslashes( $this->getMain()->getUserAgent() ) . '"';
-               wfDebugLog( 'api-feature-usage', $s, 'private' );
+               $ctx = [
+                       'feature' => $feature,
+                       // Spaces to underscores in 'username' for historical reasons.
+                       'username' => str_replace( ' ', '_', $this->getUser()->getName() ),
+                       'ip' => $request->getIP(),
+                       'referer' => (string)$request->getHeader( 'Referer' ),
+                       'agent' => $this->getMain()->getUserAgent(),
+               ];
+
+               // Text string is deprecated. Remove (or replace with just $feature) in MW 1.34.
+               $s = '"' . addslashes( $ctx['feature'] ) . '"' .
+                       ' "' . wfUrlencode( $ctx['username'] ) . '"' .
+                       ' "' . $ctx['ip'] . '"' .
+                       ' "' . addslashes( $ctx['referer'] ) . '"' .
+                       ' "' . addslashes( $ctx['agent'] ) . '"';
+
+               wfDebugLog( 'api-feature-usage', $s, 'private', $ctx );
        }
 
        /**@}*/