Отказ от ответственности: я не пытался скомпилировать этот код. У меня нет опыта работы с WAI / Warp. Это просто попытка проверить, работает ли он!
app req resp = do
case (pathInfo req, queryString req) of
(["main"], [("q", Just stuff)]) ->
resp $ responseLBS status200 [("Content-Type","text/html")] (fromStrict stuff)
(["main"], _) ->
resp $ responseFile status200 [("Content-Type","text/html")] "search.html" Nothing
_ ->
resp $ responseLBS status404 [("Content-Type","text/plain")] "No such file."
Чтобы сделать этот ответ несколько более общим (если это действительно решит проблему): в исходном коде у вас есть два блока case
, которые будут выполняться последовательно, и все ветви каждого вызова блока resp
Таким образом, вы гарантированно вызовете resp
дважды, что, как я полагаю, даст (или попытается произвести) два ответа для каждого запроса. Вообще говоря, это не может происходить в HTTP, поэтому вы, вероятно, получите только первый ответ, который вообще не использует строку запроса. Исправление заключается только в том, чтобы убедиться, что вы звоните resp
только один раз, после того, как вы проверили все, что нужно для проверки вашего запроса! Я показываю вам один способ сделать это, сопоставляя как путь, так и строку запроса одновременно, но, конечно, есть и другие способы. Сначала вы можете сопоставить с pathInfo req
, а затем сопоставить с queryString req
в некоторых случаях, когда это уместно. Просто убедитесь, что resp
вызывается только один раз для каждого возможного пути кода.