Как использовать cookie и ОСНОВНУЮ аутентификацию вместе?

Я использую комбинацию cookie и базовой аутентификации. В базовой аутентификации он выполняет функцию

Option[UserPass] => Future[Option[T]]

и возвращает Directive[T].

Я хочу создать директиву для cookie, которая выполняет функцию

HttpCookie => Future[T]

и возвращает Directive[T].

Следовательно, я могу сделать комбинированную директиву аутентификации cookieAuth | basicAuth.

Самое близкое, что я мог получить, это:

def myFunction:HttpCookie => Future[String]

val cookieAuth:Directive[String] = cookie("MyCookie").flatMap { cookie =>
  onSuccess(myFunction(cookie))
}

Но подписи не совпадают. Я получаю исключение:

type mismatch;
  found   : spray.routing.Directive[shapeless.::[String,shapeless.HNil]]
  required: spray.routing.Directive[String]
         ^ 

person J Pullar    schedule 07.10.2013    source источник
comment
А почему бы не вернуть Directive[Future[T]]? Если вы хотите вернуть Directive[T] из Future[T], это блокирующая операция, что очень плохо.   -  person 4lex1v    schedule 07.10.2013
comment
И для Future есть директивы CompletionMagnet или onSuccess, которые могут справиться с этим.   -  person 4lex1v    schedule 07.10.2013
comment
Итак, стандартная аутентификация с блокировкой базового метода аутентификации? Он принимает Future[Option[T]] и возвращает директиву [T]. Исходя из этого, я предполагал, что директивы по своей природе могут быть неблокирующими.   -  person J Pullar    schedule 07.10.2013
comment
Не нашел, что вы имеете в виду в библиотеке спреев. Можете ли вы показать какую-то ссылку?   -  person 4lex1v    schedule 07.10.2013
comment
spray.io/documentation/1.1-SNAPSHOT/spray -маршрутизация/   -  person J Pullar    schedule 07.10.2013
comment
Также в моем примере я использовал директиву onSuccess, о которой вы упомянули, но не смог получить совпадающую подпись. Вид нового в этом директивном бизнесе   -  person J Pullar    schedule 07.10.2013
comment
Ваш пример cookieAuth должен работать, подпись правильная, а в чем проблема?   -  person 4lex1v    schedule 07.10.2013
comment
И нет, спрей-аутентификация не блокируется, они просто заключают внутренний маршрут в директиву onSuccess.   -  person 4lex1v    schedule 07.10.2013
comment
О, я вижу, просто измените на val cookieAuth: Directive1[String], не пропустите номер 1 в Directive1, сама директива принимает параметры типа с верхней границей HList   -  person 4lex1v    schedule 07.10.2013
comment
спасибо, сделал, также я только что написал небольшой пост о директивах spray и scalaz, которые могут быть полезны   -  person 4lex1v    schedule 07.10.2013


Ответы (1)


tl;dr Сделать результат типа Directive1[String].

Первоначальная проблема была в несоответствии типов. Чистая черта Directive принимает параметр типа с верхней границей HList, поэтому тип результата был основан на HList Directive[String :: HNil] Shapeless.

В объекте пакета routing объявлен тип alises для Directive[HNil] и Directive[T :: HNil], Directive0 и Directive1[T] соответственно.

person 4lex1v    schedule 07.10.2013