Как использовать wai-handler-devel с простым приложением wai
У меня есть базовая настройка приложения "hello world" с использованием wai, и я хотел бы использовать wai-handler-devel, но я не уверен, как это сделать, и не могу найти никаких примеров его использования в проекте wai.
{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run)
import Data.ByteString.Lazy.Char8 () -- Just for an orphan instance
app :: Application
app _ = return $ responseLBS
status200
[("Content-Type", "text/plain")]
"Hello, World!"
main :: IO ()
main = do
putStrLn $ "http://localhost:8080/"
run 8080 app
Что мне нужно сделать, чтобы wai-handler-devel работал с базовым wai-приложением?
Примечание: здесь есть исправление ( https://gist.github.com/1499226), если вы столкнулись с проблемами с "wai-handler-devel: команда не найдена"
1 ответ
Страница Hackage wai-handler-devel говорит, что она должна вызываться из командной строки следующим образом:
$ wai-handler-devel <port> My.App.Module myApp
и что тип вашего приложения должен выглядеть так:
myApp :: (Application -> IO ()) -> IO ()
В этом случае вы должны определить myApp
следующее:
myApp :: (Application -> IO ()) -> IO ()
myApp handler = handler app
хотя вы можете захотеть встроить app
полностью:
myApp :: (Application -> IO ()) -> IO ()
myApp handler = handler $ \_ -> return $ responseLBS
status200
[("Content-Type", "text/plain")]
"Hello, World!"
Тип таков, что вы можете выполнить инициализацию при запуске и т.п. в IO
, Я предлагаю прочитать примеры SmallApp и FullApp из git-репозитория wai-handler-devel; Последнее особенно полезно, так как имеет отладочный вывод, показывающий поток кода во время перезагрузки, и показывает, как интегрировать длительное соединение с базой данных.
Сценарий запуска для примера FullApp также показывает, как программно использовать wai-handler-devel, включая ручное указание зависимостей шаблона Hamlet (что wai-handler-devel
инструмент командной строки определяет автоматически).
Затем вы сможете переписать свой main
следующее:
main :: IO ()
main = do
putStrLn $ "http://localhost:8080/"
myApp (run 8080)
Конечно, вы могли бы так же легко пройти run
функция из wai-handler-fastcgi, wai-handler-scgi или даже wai-handler-webkit.