2016-04-14 11 views
2

Vücuda karşı koymam gereken bir hmac üstbilgisiyle gelen bir gönderi isteğim var. Bu başlık, isteğin ham gövdesi kullanılarak oluşturulur ve bunu değiştirmenin bir yolu yoktur. İsteğin içerik türü uygulama/json'dur. Şu anda isteğin ham gövdesine ve isteğin bir json kodlanmış gövdesine erişmenin bir yolu yok gibi görünüyor, bu yüzden ham cismi ve orijinal isteği bir araya getirmek ve geçmek için özel bir gövde ayrıştırıcısı ve eylemi yaratmaya çalışıyorum. Onları.Ham gövdeyi almak ve istek ile birlikte paketlemek için [2.5.x] özel gövde ayrıştırıcısı kullanın

Bu adamlar uygulamasının kopyalarını kopyalamaya çalışıyorum https://victorops.com/blog/capturing-raw-requests-play/ ama bu oyun 2.5'tür, bu nedenle akka akışları yerine yinelemeleri kullanır.

object RequestArchiver { 
    case class RawRequest[A](request: Request[A], raw: ByteString) extends WrappedRequest[A](request) 
    case class WrappedPayload[A](wrapped: A, raw: ByteString) 

    def wrappedBodyParser[B](wrapped: BodyParser[B]) (implicit exCtx: ExecutionContext): BodyParser[WrappedPayload[B]] = 
    BodyParser("raw-memo") { (request: RequestHeader) => 
    val raw: Accumulator[ByteString, Either[Result, RawBuffer]] = BodyParsers.parse.raw(request) 
     val ret = raw.map { 
     case Left(result) => 
     Left(result) 
     case Right(buffer: RawBuffer) => 
     val bytes = buffer.asBytes().getOrElse(ByteString.empty) 
     Right(WrappedPayload(wrapped(request), bytes)) 
    } 
    ret 
    } 
} 

Bu Şimdi

Error:(33, 5) type mismatch; 
found : play.api.libs.streams.Accumulator[akka.util.ByteString,Product with Serializable with scala.util.Either[play.api.mvc.Result,controllers.RequestArchiver.WrappedPayload[play.api.libs.streams.Accumulator[akka.util.ByteString,Either[play.api.mvc.Result,B]]]]] 
required: play.api.libs.streams.Accumulator[akka.util.ByteString,Either[play.api.mvc.Result,controllers.RequestArchiver.WrappedPayload[B]]] 
    ret 
    ^

Bunun çalışıyor görebilirsiniz bir hatayla derleme değil

BodyParser ve Vaka Sınıflar: Burada

Ben bugüne kadar ne olduğunu söyle ve anlıyorum ki nasıl tamir edeceğimi bilmiyorum. Ben çözüm linkte victorops örnek hattı 15 ile 24 arasında olduğunu hayal ama 2.5 sürümü

durumunda özel eylem bu

def extractRaw[A](parser: BodyParser[A])(block: (RawRequest[A]) => Future[Result])(implicit ctx: ExecutionContext) = 
    Action.async(RequestArchiver.wrappedBodyParser(parser)) { implicit request => 
     val rawRequest = RawRequest(Request(request, request.body.wrapped), request.body.raw) 
     block(rawRequest) 
    } 

cevap

0

I konularda içine bu satırları açmak için nasıl bilmiyorum Play için yeni, ama çok daha kolay olan raw gövde ayrıştırıcısının kullanımı hakkında nasıl. Hızlı bir test yaptım.

class Tester extends Controller { 
    def handleRaw = Action(parse.raw) { implicit request => 
    request.body.asBytes().map(b => Ok(s"Request body has ${b.size} bytes")).getOrElse(NoContent) 
    } 
} 

curl -v --data "a=b&c=d" http://localhost:9000/test/raw

* Trying ::1... 
* Connected to localhost (::1) port 9000 (#0) 
> POST /test/raw HTTP/1.1 
> Host: localhost:9000 
> User-Agent: curl/7.43.0 
> Accept: */* 
> Content-Length: 7 
> Content-Type: application/x-www-form-urlencoded 
> 
* upload completely sent off: 7 out of 7 bytes 
< HTTP/1.1 200 OK 
< Content-Length: 85 
< Content-Type: text/plain; charset=utf-8 
< Date: Mon, 15 Aug 2016 09:41:30 GMT 
< 
Request body has 7 bytes 
* Connection #0 to host localhost left intact 
İlgili konular