What about using fold instead of pattern matching

  def mapM[B](f: A => Future[B]): BodyParser[B] = new BodyParser[B] {
    def apply(request: RequestHeader) =
        self(request) mapM { _.fold(l => Future.successful(Left.apply(l)), r => f(r) map Right.apply)}
    override def toString = self.toString
  }