Как использовать wai-handler-devel с простым приложением wai - PullRequest
5 голосов
/ 11 декабря 2011

У меня есть базовая настройка приложения "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 Ответ

5 голосов
/ 17 декабря 2011

Страница wai-handler-devel Hackage говорит, что она должна быть вызвана из командной строки следующим образом:

$ 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, включая ручное указание зависимостей шаблона Гамлета (который 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 .

...