Как хранить значения, полученные из промежуточного программного обеспечения, и извлекать их из маршрутов - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть промежуточное ПО wai, которое выдает два значения:

  1. Идентификатор запроса, генерируемый случайным образом для каждого запроса
  2. Пользователь из запроса к другому сервису.

Вот код:

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, которое перенаправляет запрос другому сервису для аутентификации и возвращает пользовательское значение, которое будет необходимо в маршрутах.

...