2016-04-11 8 views
3

フィルタをPlay 2.5.xで使用する方法が見つかりませんでした。 私のアプリケーションがステータスコード400-500を返した場合、リクエストと結果を記録する "BadRequestLogFilter"を作成したいScala Play 2.5.0 2.5.1結果本体へのアクセスによるフィルタリング

Play 2.4.xでは、Iterateesを使用しました。 このコードをPlay 2.5.xに移行することができませんでした。誰かが私にここでヒントを与えることができますか?たぶん、フィルターでボディを取得するための穴のアプローチは悪い考えですか?ここで

は(正常に動作し2.4.xの中に)私の古いが、私はちょうどここに、このラインのための有効な交換が必要と推測プレイ2.4.xの

class BadRequestLogFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter { 
    val logger = Logger("bad_status").underlyingLogger 

    override def apply(next: (RequestHeader) => Future[Result])(request: RequestHeader): Future[Result] = { 
    val resultFuture = next(request) 
    resultFuture.foreach(result => { 

     val status = result.header.status 
     if (status < 200 || status >= 400) { 
     val c = Try(request.tags(Router.Tags.RouteController)) 
     val a = Try(request.tags(Router.Tags.RouteActionMethod)) 

     val body = result.body.run(Iteratee.fold(Array.empty[Byte]) { (memo, nextChunk) => memo ++ nextChunk }) 
     val futResponse = body.map(bytes => new String(bytes)) 
     futResponse.map { response => 

      val m = Map("method" -> request.method, 
      "uri" -> request.uri, 
      "status" -> status, 
      "response" -> response, 
      "request" -> request, 
      "controller" -> c.getOrElse("empty"), 
      "actionMethod" -> a.getOrElse("empty")) 

      val msg = m.map { case (k, v) => s"$k=$v" }.mkString(", ") 
      logger.info(appendEntries(m), msg) 
     } 
     } 
    }) 
    resultFuture 
    } 
} 

ためのフィルタである:

val body = result.body.run(Iteratee.fold(Array.empty[Byte]) { (memo, nextChunk) => memo ++ nextChunk }) 

答えて

3

Play 2.5.xの結果の本体はHttpEntity

です。結果が得られたら、本体を取得してから実体化することができます:

val body = result.body.consumeData(mat) 

ここでmatimplicit Materializerです。これはを返すことになります。これをデコードして文字列表現を得ることができます(簡略化のため、ここでは扱いません)。

関連する問題