Merge "Resolve successful 1-chunk uploads"
[lhc/web/wiklou.git] / includes / api / ApiErrorFormatter.php
index f246203..7fb1352 100644 (file)
@@ -148,10 +148,11 @@ class ApiErrorFormatter {
         * @param Exception|Throwable $exception
         * @param array $options
         *  - wrap: (string|array|MessageSpecifier) Used to wrap the exception's
-        *    message. The exception's message will be added as the final parameter.
+        *    message if it's not an ILocalizedException. The exception's message
+        *    will be added as the final parameter.
         *  - code: (string) Default code
-        *  - data: (array) Extra data
-        * @return ApiMessage
+        *  - data: (array) Default extra data
+        * @return IApiMessage
         */
        public function getMessageFromException( $exception, array $options = [] ) {
                $options += [ 'code' => null, 'data' => [] ];
@@ -163,11 +164,11 @@ class ApiErrorFormatter {
                        // Extract code and data from the exception, if applicable
                        if ( $exception instanceof UsageException ) {
                                $data = $exception->getMessageArray();
-                               if ( !isset( $options['code'] ) ) {
+                               if ( !$options['code'] ) {
                                        $options['code'] = $data['code'];
                                }
                                unset( $data['code'], $data['info'] );
-                               $options['data'] = array_merge( $data['code'], $options['data'] );
+                               $options['data'] = array_merge( $data, $options['data'] );
                        }
 
                        if ( isset( $options['wrap'] ) ) {
@@ -175,7 +176,8 @@ class ApiErrorFormatter {
                        } else {
                                $msg = new RawMessage( '$1' );
                                if ( !isset( $options['code'] ) ) {
-                                       $options['code'] = 'internal_api_error_' . get_class( $exception );
+                                       $class = preg_replace( '#^Wikimedia\\\Rdbms\\\#', '', get_class( $exception ) );
+                                       $options['code'] = 'internal_api_error_' . $class;
                                }
                        }
                        $params = [ wfEscapeWikiText( $exception->getMessage() ) ];
@@ -252,7 +254,7 @@ class ApiErrorFormatter {
                $ret = preg_replace( '!</?(var|kbd|samp|code)>!', '"', $text );
 
                // Strip tags and decode.
-               $ret = html_entity_decode( strip_tags( $ret ), ENT_QUOTES | ENT_HTML5 );
+               $ret = Sanitizer::stripAllTags( $ret );
 
                return $ret;
        }
@@ -413,12 +415,17 @@ class ApiErrorFormatter_BackCompat extends ApiErrorFormatter {
 
                if ( $tag === 'error' ) {
                        // In BC mode, only one error
-                       $value = [
-                               'code' => $msg->getApiCode(),
-                               'info' => $value,
-                       ] + $msg->getApiData();
-                       $this->result->addValue( null, 'error', $value,
-                               ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+                       $existingError = $this->result->getResultData( [ 'error' ] );
+                       if ( !is_array( $existingError ) ||
+                               !isset( $existingError['code'] ) || !isset( $existingError['info'] )
+                       ) {
+                               $value = [
+                                       'code' => $msg->getApiCode(),
+                                       'info' => $value,
+                               ] + $msg->getApiData();
+                               $this->result->addValue( null, 'error', $value,
+                                       ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+                       }
                } else {
                        if ( $modulePath === null ) {
                                $moduleName = 'unknown';