У меня есть промежуточное ПО wai, которое выдает два значения:
- Идентификатор запроса, генерируемый случайным образом для каждого запроса
- Пользователь из запроса к другому сервису.
Вот код:
addRequestIdToRequestHeader' :: Application -> Application
addRequestIdToRequestHeader' app req respond = do
rid <- nextRequestId :: IO ByteString
user <- fetchUserByReq req :: IO User
req' <- attachUserAndRequestIdToRequest user rid
app req' respond
Теперь у меня есть маршрут GET /user
. Внутри этого маршрута я хотел бы получить доступ к идентификатору запроса и пользователю. Например, я мог бы просто напечатать их в журнале.
main :: IO ()
main =
scotty 8080 $ do
get "/user" $ do
req <- request
rid <- liftAndCatchIO $ getRequestIdFromRequest req
user <- liftAndCatchIO $ getUserFromRequest req
liftAndCatchIO $ print rid
liftAndCatchIO $ print user
text $ username user
Вопрос в том, что, поскольку идентификатор запроса и пользователь генерируются из промежуточного программного обеспечения, как получить к ним доступ по маршруту? В основном, как реализовать следующие функции, используемые в приведенном выше коде:
attachUserAndRequestIdToRequest :: User -> ByteString -> Request -> IO Request
getRequestIdFromRequest :: Request -> IO ByteString
getUserFromRequest :: Request -> IO User
Сценарий заключается в том, что промежуточное ПО представляет собой промежуточное ПО Auth, которое перенаправляет запрос другому сервису для аутентификации и возвращает пользовательское значение, которое будет необходимо в маршрутах.