playframework - Scala Play 2.1: Accessing request and response bodies in a filter -


i'm writing filter log requests , responses

    object loggingfilter extends essentialfilter {   def apply(next: essentialaction) = new essentialaction {     def apply(rh: requestheader) = {       val start = system.currenttimemillis        def logtime(result: plainresult): result = result match {         case simple @ simpleresult(header, content) =>             val time = system.currenttimemillis - start             play.logger.info(s"${rh.method} ${rh.uri} took ${time}ms , returned ${header.status}")             result         case _ => result       }       next(rh).map {         case plain: plainresult => logtime(plain)         case async: asyncresult => async.transform(logtime)       }     }   } } 

i need log request , response bodies. these buried inside iterators/enumerators, there easier way access bodies without having go details of how iteratees work? otherwise how can convert request , response bodies string?

if want capture simpleresult response body use this:

def logtime(result: plainresult): result = result match {   case simple @ simpleresult(header, content) => {     val time = system.currenttimemillis - start     simpleresult(header, content &> enumeratee.map(a => {       play.logger.info(s"${rh.method} ${rh.uri} took ${time}ms , returned ${header.status} body ${a}")       simple.writeable.transform(a)     }))   }   case _ => result } 

check mimetype json:

def logtime(result: plainresult): result = {   result.header.headers.get(headernames.content_type) match {     case some(ct) if ct.trim.startswith(mimetypes.json) => result match {       case simple @ simpleresult(header, content) =>         val time = system.currenttimemillis - start         simpleresult(header, content &> enumeratee.map(a => {            play.logger.info(s"${rh.method} ${rh.uri} took ${time}ms , returned ${header.status} body ${a}")           simple.writeable.transform(a)          }))     }     case ct => result   } } 

Comments