X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2FRest%2FResponseFactory.php;h=fd0f3c7975dbf6c842b903196f1b3469bf1de170;hp=d18cdb5d6bbe90c3ca3176cd8d97e64ff7fa7884;hb=a1ef77b2d80830fbcb617a83961d78cff9d6e384;hpb=dfec83932fd38a9086eb5a2e212889ad00f35b0e diff --git a/includes/Rest/ResponseFactory.php b/includes/Rest/ResponseFactory.php index d18cdb5d6b..fd0f3c7975 100644 --- a/includes/Rest/ResponseFactory.php +++ b/includes/Rest/ResponseFactory.php @@ -5,19 +5,31 @@ namespace MediaWiki\Rest; use Exception; use HttpStatus; use InvalidArgumentException; +use LanguageCode; use MWExceptionHandler; use stdClass; use Throwable; +use Wikimedia\Message\ITextFormatter; +use Wikimedia\Message\MessageValue; /** * Generates standardized response objects. */ class ResponseFactory { - const CT_PLAIN = 'text/plain; charset=utf-8'; const CT_HTML = 'text/html; charset=utf-8'; const CT_JSON = 'application/json'; + /** @var ITextFormatter[] */ + private $textFormatters; + + /** + * @param ITextFormatter[] $textFormatters + */ + public function __construct( $textFormatters ) { + $this->textFormatters = $textFormatters; + } + /** * Encode a stdClass object or array to a JSON string * @@ -167,16 +179,31 @@ class ResponseFactory { return $response; } + /** + * Create an HTTP 4xx or 5xx response with error message localisation + */ + public function createLocalizedHttpError( $errorCode, MessageValue $messageValue ) { + return $this->createHttpError( $errorCode, $this->formatMessage( $messageValue ) ); + } + /** * Turn an exception into a JSON error response. * @param Exception|Throwable $exception * @return Response */ public function createFromException( $exception ) { - if ( $exception instanceof HttpException ) { + if ( $exception instanceof LocalizedHttpException ) { + $response = $this->createLocalizedHttpError( $exception->getCode(), + $exception->getMessageValue() ); + } elseif ( $exception instanceof HttpException ) { // FIXME can HttpException represent 2xx or 3xx responses? - $response = $this->createHttpError( $exception->getCode(), - [ 'message' => $exception->getMessage() ] ); + $response = $this->createHttpError( + $exception->getCode(), + array_merge( + [ 'message' => $exception->getMessage() ], + (array)$exception->getErrorData() + ) + ); } else { $response = $this->createHttpError( 500, [ 'message' => 'Error: exception of type ' . get_class( $exception ), @@ -235,4 +262,18 @@ class ResponseFactory { return "Redirect$url"; } + public function formatMessage( MessageValue $messageValue ) { + if ( !$this->textFormatters ) { + // For unit tests + return []; + } + $translations = []; + foreach ( $this->textFormatters as $formatter ) { + $lang = LanguageCode::bcp47( $formatter->getLangCode() ); + $messageText = $formatter->format( $messageValue ); + $translations[$lang] = $messageText; + } + return [ 'messageTranslations' => $translations ]; + } + }