Как использовать 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.

Другие вопросы по тегам