玩!框架不一致的过滤行为

时间:2013-11-07 00:10:53

标签: scala playframework

在游戏中!框架2.1.x鉴于请求的内容,我看到执行顺序不一致。这导致了我试图实现的请求选通代码的一些问题。

考虑以下示例代码,包括Filter,Action包装器和Action。

object AFilter extends EssentialFilter {
  def apply(nextAction: EssentialAction) : EssentialAction = new EssentialAction {
    def apply(request: RequestHeader): Iteratee[Array[Byte], Result] = {
        def readBody(nextA: EssentialAction, request: RequestHeader): Iteratee[Array[Byte], Result] = {

          def step(body: Array[Byte], nextI: Iteratee[Array[Byte],
              Result]) (i: Input[Array[Byte]]): Iteratee[Array[Byte], Result] = i match {
            case Input.EOF =>
              System.err.println("test 1")
              Iteratee.flatten(nextI.feed(Input.EOF))
            case Input.Empty =>
              Cont[Array[Byte], Result](step(body, nextI) _)
            case Input.El(e) =>
              val curBody = Array.concat(body, e)
              Cont[Array[Byte], Result](step(curBody,
                Iteratee.flatten(nextI.feed(Input.El(e)))) _)
          }

          val nextIteratee: Iteratee[Array[Byte], Result] = nextA(request)

          Cont[Array[Byte], Result](i => step(Array(), nextIteratee)(i))
        }

      readBody(nextAction,request)
    }
  }
}


def testActionWrapper[A](action: Action[A]): Action[A] = {
  Action(action.parser) {
    request => Async {
      System.err.println("test 2")
      Future.successful(action(request))
    }
  }
}
def testAction =
    testActionWrapper {
      System.err.println("test 3")
      Action(parse.empty) { request =>
        System.err.println("test 4")
        Async {
          System.err.println("test 5")
          Future.successful(Ok("Ok"))
        }
      }
    }

使用POST,PUT或带有body和parse.json的GET,println执行的顺序是

测试3,测试1,测试2,测试4,测试5

除了“测试3”首先发生的事实,这是我所期望的,过滤器迭代在动作包装器执行之前完成。但是通过一个没有身体的简单GET,我看到了这个

测试3,测试2,测试1,测试4,测试5

动作包装器在迭代器迭代完成之前执行。这很可能是因为Action跳过了它自己的身体解析迭代的执行。

现在我的问题,处理这个的最好方法是在没有身体的情况下跳过iteratee?或者,或许更重要的是,这是否意味着在高度并发的Scala Play世界中!在执行Action之前,根本无法保证Filter必须完成?

0 个答案:

没有答案