X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FRest%2FResponseFactory.php;h=fd0f3c7975dbf6c842b903196f1b3469bf1de170;hb=ab61a9b2f4f7c77caddb862d1adea5536560d61e;hp=5e5a19852d8a6c3f8a1e876c0145ff04711c6b76;hpb=00ca43d824e11b1a45a2b08b433eb8e927524261;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Rest/ResponseFactory.php b/includes/Rest/ResponseFactory.php index 5e5a19852d..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,13 +179,23 @@ 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(), @@ -240,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 ]; + } + }