首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Http-管道频繁连接失败

Http-管道频繁连接失败
EN

Stack Overflow用户
提问于 2013-11-16 18:45:18
回答 1查看 419关注 0票数 10

我正在写应用程序,这将通过HTTP下载一些文件。在某种程度上,我使用以下代码片段来下载页面正文:

代码语言:javascript
复制
import network.HTTP
simpleHTTP (getRequest "http://www.haskell.org/") >>= getResponseBody

它工作正常,但无法通过HTTPS协议建立连接。因此,为了解决这个问题,我切换到HTTP-Conduit,现在我使用以下代码:

代码语言:javascript
复制
simpleHttp' :: Manager -> String -> IO (C.Response LBS.ByteString)
simpleHttp' manager url = do
     request <- parseUrl url
     runResourceT $ httpLbs request manager

它可以连接到HTTPS,但出现了新的令人沮丧的问题。大约每五个连接就会失败一次,并出现异常:

代码语言:javascript
复制
getpics.hs: FailedConnectionException "i.imgur.com" 80

我确信这是HTTP-Conduit问题,因为network.HTTP在同一组页面(不包括https页面)上工作得很好。

有没有人遇到过这样的问题,并知道解决方案或更好的(简单,因为这是一个简单的任务,不应该超过几行代码)替代管道库?

EN

回答 1

Stack Overflow用户

发布于 2013-12-22 03:17:29

一种简单的替代方法是使用curl包。它支持超文本传输协议、超文本传输协议和一堆其他的替代协议,也支持many options来定制自己的行为。价格引入了对libcurl的外部依赖,这是构建软件包所必需的。

示例:

代码语言:javascript
复制
import Network.Curl

main :: IO ()
main = do
  let addr = "https://google.com/" 
  -- Explicit type annotation is required for calls to curlGetresponse_.
  -- Use ByteString instead of String for higher performance:
  r <- curlGetResponse_ addr [] :: IO (CurlResponse_ [(String,String)] String)

  print $ respHeaders r
  putStr $ respBody r

我试着复制你的问题,但对我来说一切都正常。你能发布一个Short, Self Contained, Compilable, Example来演示这个问题吗?我的代码:

代码语言:javascript
复制
import Control.Monad
import qualified Data.Conduit as C
import qualified Data.ByteString.Lazy as LBS
import Network.HTTP.Conduit

simpleHttp'' :: String -> Manager -> C.ResourceT IO (Response LBS.ByteString)
simpleHttp'' url manager = do
     request <- parseUrl url
     httpLbs request manager

main :: IO ()
main = do
  let url = "http://i.imgur.com/"
      count = 100
  rs <- withManager $ \m -> replicateM count (simpleHttp'' url m)
  mapM_ (print . responseStatus) $ rs
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20017484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档