Как получить значение типа 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-коде.