Промежуточное ПО Haskell wai - как запустить приложение, если из первого приложения возвращается 404?

Я пытаюсь «соединить» два вай Application вместе. По сути, первое приложение будет предоставлять либо ответ 404 Not found, либо ответ, не являющийся ответом 404 Not found. Я хотел бы добавить второе приложение, которое попытается обработать запрос, если присутствует первый случай (первое приложение возвращает 404).

Однако, глядя на тип Application:

type Application = Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived

Не понятно, как проверить ответ? Как бы я не получил ResponseRecived в качестве конечного результата, который, похоже, не содержит никакого кода ответа. Как показано ниже:

xyzMiddle :: (Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived) ->
             (Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived)
xyzMiddle app req respond = do
  zzz <- (app req respond)
  pure zzz

Как я мог реализовать это? И или, что я не понимаю в вышеизложенном?


person Chris Stryczynski    schedule 16.12.2020    source источник


Ответы (1)


Я пропустил этот (Response -> IO ResponseReceived), так как он находится в контексте IO — здесь мы можем запустить второе приложение. Это означает, что для проверки Response мы можем сделать что-то вроде:

xyzMiddle :: (Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived) ->
             Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived
xyzMiddle app req respond = app req (\r -> do
  print $ show $ responseStatus r
  respond r)
person Chris Stryczynski    schedule 16.12.2020