2{-# LANGUAGE OverloadedStrings #-}
3module Reporting.Task.Http
16import Control.Concurrent (forkIO)
17import Control.Concurrent.Chan (Chan, newChan, readChan, writeChan)
18import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, readMVar)
19import Control.Exception (Exception, SomeException, catch)
20import Control.Monad (forever, join, replicateM_, void)
21import qualified Network.HTTP as Http (urlEncodeVars)
22import qualified Network.HTTP.Client as Http
24import qualified Elm.Compiler as Compiler
25import qualified Elm.Package as Pkg
26import qualified Reporting.Exit as Exit
27import qualified Reporting.Exit.Http as E
28import qualified Reporting.Progress as Progress
29import qualified Reporting.Task as Task
37 Package :: String -> [(String,String)] -> Handler a -> Fetch a
38 Anything :: String -> Handler a -> Fetch a
39 AndThen :: Fetch a -> (a -> Fetch b) -> Fetch b
40 Parallel :: [Fetch a] -> Fetch [a]
41 Report :: Progress.Progress -> (Progress.Outcome -> Progress.Progress) -> Fetch a -> Fetch a
45 Http.Request -> Http.Manager -> IO (Either E.Exit a)
48package :: String -> [(String,String)] -> Handler a -> Fetch a
53anything :: String -> Handler a -> Fetch a
58andThen :: Fetch a -> (a -> Fetch b) -> Fetch b
63parallel :: [Fetch a] -> Fetch [a]
68report :: Progress.Progress -> (Progress.Outcome -> Progress.Progress) -> Fetch a -> Fetch a
77run :: Fetch a -> Task.Task a
79 Task.runHttp $ \manager tell ->
81 replicateM_ 4 $ forkIO $ forever $ join (readChan chan)
82 readMVar =<< runHelp chan manager tell fetch
85runHelp :: Chan (IO ()) -> Http.Manager -> (Progress.Progress -> IO ()) -> Fetch a -> IO (MVar (Either Exit.Exit a))
86runHelp chan manager tell fetch =
88 Package path params handler ->
89 do mvar <- newEmptyMVar
90 let url = makePackageUrl path params
91 writeChan chan $ putMVar mvar =<< fetchSafe url manager handler
94 Anything url handler ->
95 do mvar <- newEmptyMVar
96 writeChan chan $ putMVar mvar =<< fetchSafe url manager handler
99 AndThen subFetch callback ->
100 do subMVar <- runHelp chan manager tell subFetch
103 do result <- readMVar subMVar
109 readMVar =<< runHelp chan manager tell (callback value)
113 do mvars <- mapM (runHelp chan manager tell) fetches
116 do results <- mapM readMVar mvars
117 putMVar mvar (sequence results)
120 Report start toEnd subFetch ->
122 subMVar <- runHelp chan manager tell subFetch
125 do result <- readMVar subMVar
127 either (\_ -> Progress.Bad) (\_ -> Progress.Good) result
136packageDomain :: String
138 "http://159.89.227.162:8000"
141makePackageUrl :: String -> [(String,String)] -> String
142makePackageUrl path params =
148 "?" ++ Http.urlEncodeVars (versionParam : params)
150 packageDomain ++ "/" ++ path ++ query
153versionParam :: (String, String)
155 ( "elm-package-version"
156 , Pkg.versionToString Compiler.version
164fetchSafe :: String -> Http.Manager -> Handler a -> IO (Either Exit.Exit a)
165fetchSafe url manager handler =
166 fetchUnsafe url manager handler
167 `catch` \e -> handleAnyError url (e :: SomeException)
170fetchUnsafe :: String -> Http.Manager -> Handler a -> IO (Either Exit.Exit a)
171fetchUnsafe url manager handler =
172 do request <- Http.parseUrlThrow url
173 result <- handler request manager
179 return (Left (Exit.BadHttp url problem))
182handleAnyError :: (Exception e) => String -> e -> IO (Either Exit.Exit a)
183handleAnyError url exception =
184 return $ Left $ Exit.BadHttp url $ E.Unknown $ show exception
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list