Как получить значение типа CtxOut HandlerAspect при обработке запроса

Вzio-httpесть возможность написать промежуточное программное обеспечение, которое обеспечивает некоторый контекст вокруг запроса; В качестве конкретного примера мы могли бы подумать о промежуточном программном обеспечении аутентификации, которое ищет некоторый пакет информации о сеансе перед обработкой запроса:

      case class UserSession(sessionId: UUID, username: String)

val authMiddleware: HandlerAspect[Any, UserSession] = HandlerAspect.customAuthProvidingZIO {  request =>
  ZIO.succeed(request.headers.get("X-Session-ID").flatMap {
    case None => ZIO.succeed(None)
    case Some(sessionId) => fetchSession(sessionId).catchAll(_ => ZIO.succeed(None))
  }
}

Мы можем подключить это промежуточное программное обеспечение к, чтобы гарантировать, что любой запрос, поступающий безX-Session-IDзаголовок или идентификатор сеанса, о котором наш кэш сеанса не знает, отклоняется. Мой вопрос в том, удастся ли промежуточному программному обеспечению создатьUserSession, как я могу получить это значение и использовать его в обработчике запроса, что-то вроде

      // this doesn't work
Routes(
  Method.GET / "foo" -> handler { (userSession: UserSession, request: Request) =>
    fooDatabase.getAll(userSession.username)
  }
) @@ authMiddleware

Одна из причин, по которой это не работает, конечно, заключается в том, что промежуточное программное обеспечение даже не подключено кRoutesдо тех пор, пока он не будет создан, так что возникает что-то вроде проблемы курицы и яйца; но, похоже, это своего рода точка промежуточного программного обеспечения, и эта проблема GitHub и этот PR имеют заголовки, по крайней мере, которые предполагают, что они пытаются достичь чего-то похожего на это, хотя я не вижу ничего похожего на то, что я ищу ибо в PR-коде.

0 ответов

Другие вопросы по тегам