Play 2.2.1 Scala — перенаправление для 413 REQUEST_ENTITY_TOO_LARGE

У меня есть следующее действие контроллера в качестве преобразователя формы:

def importCompletionsSubmit(indexName: String)  = AuthenticatedAction {
  Action.async {
    implicit request => {
      completionsForm.bindFromRequest().fold(
        errors => Future.successful(Ok(html.crudindex.importCompletionsForm(indexName, errors))),
        completions => {
          val autoCompletionService = new AutoCompletionService(new Elasticsearch)
          autoCompletionService.importCompletions(indexName, completions.text) map {
            result: BulkImportResult =>
              if (result.error) Redirect(routes.ListIndices.index(Option.empty[String])).flashing("error" -> Messages("error.bulkItemsFailed", result.failures))
              else Redirect(routes.ListIndices.index(Option.empty[String])).flashing("success" -> Messages("success.completionsAdded", result.requests))
          }
        }
      )
    }
  }
}

Я знаю, что могу изменить значение максимальной длины для этого действия, но я хотел бы отправить пользователя обратно в форму с хорошим сообщением об ошибке, когда он вводит слишком много текста. Если тело запроса превышает максимальную длину по умолчанию, я получаю полностью пустую страницу, и только консоль браузера показывает «413 (Слишком большой объект запроса)». Я попытался поймать эту ошибку в своем глобальном объекте, но это ничего не изменило. Мне кажется, что глобальный триггер onError не вводится, когда парсер отправляет обратно страницу с ошибкой. Еще чистая страница. Я также пытался поймать эту ошибку внутри действия, но мне кажется, что код действия не введен, потому что анализатор тела уже выдает эту пустую страницу с ошибкой.

Есть ли способ отправить пользователя обратно к действию формы, когда тело превышает максимальную длину?


person MeiSign    schedule 17.02.2014    source источник


Ответы (1)


Что-то вроде этого должно работать для вас:

def test = Action.async(parse.maxLength(1024, parse.multipartFormData)) { implicit request =>
  Future(request.body match {
    case Left(MaxSizeExceeded(length)) => Ok(your_pretty_error_page.scala.html)
    case Right(body) => {
      ...
    }
  })
}
person serejja    schedule 17.02.2014
comment
Потрясающе, спасибо :) - person MeiSign; 18.02.2014