增加Network.HTTP.Conduit的请求超时

时间:2014-01-24 16:03:05

标签: http haskell timeout http-conduit

我使用http-conduit库版本2.0+从HTTP webservice获取内容:

import Network.HTTP.Conduit
main = do content <- simpleHttp "http://stackoverflow.com"
          print $ content

如上所述in the docs,默认超时为5秒。

注意:我立即回答了这个问题,因此故意没有进一步的研究工作。

2 个答案:

答案 0 :(得分:1)

this previous question类似,仅凭simpleHttp无法做到这一点。您需要将ManagerhttpLbs一起使用才能设置超时。

请注意,您无需在管理器中设置超时,但可以单独为每个请求设置超时。

这是一个完整的示例,其行为与上面的函数类似,但允许您修改超时:

import Network.HTTP.Conduit
import Control.Monad (liftM)
import qualified Data.ByteString.Lazy.Char8 as LB

-- | A simpleHttp alternative that allows to specify the timeout
-- | Note that the timeout parameter is in microseconds!
downloadHttpTimeout :: Manager -> String -> Int -> IO LB.ByteString
downloadHttpTimeout manager url timeout = do req <- parseUrl url
                                             let req' = req {responseTimeout = Just timeout}
                                             liftM responseBody $ httpLbs req' manager

main = do manager <- newManager conduitManagerSettings
          let timeout = 15000000 -- Microseconds --> 15 secs
          content <- downloadHttpTimeout manager "http://stackoverflow.com" timeout
          print $ content

答案 1 :(得分:1)

我发现以下内容是Uli的downloadHttpTimeout版本,更接近simpleHTTP

simpleHTTPWithTimeout :: Int -> Request a -> IO (Response LB.ByteString)
simpleHTTPWithTimeout timeout req =
  do mgr <- newManager tlsManagerSettings
     let req = req { responseTimeout = Just timeout }
     httpLbs req mgr

唯一的区别是simpleHTTP是稍微不同的返回类型,所以提取例如响应主体,使用管道responseBody而非Network.HTTP.getResponseBody