簡體   English   中英

Http-Conduit頻繁連接失敗

[英]Http-Conduit frequent connection failures

我正在編寫應用程序,它將通過HTTP下載一些文件。 到目前為止,我使用以下代碼片段來下載頁面正文:

import network.HTTP
simpleHTTP (getRequest "http://www.haskell.org/") >>= getResponseBody

它工作正常,但無法通過HTTPS協議建立連接。 所以為了解決這個問題,我已經切換到HTTP-Conduit,現在我正在使用以下代碼:

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

它可以連接到HTTPS,但出現了令人沮喪的新問題。 大約每五個連接失敗,異常:

getpics.hs: FailedConnectionException "i.imgur.com" 80

我確信這是HTTP-Conduit問題,因為network.HTTP在同一組頁面上工作正常(不包括https頁面)。

有沒有人遇到過這樣的問題並且知道解決方案或更好(並且簡單,因為這是一個簡單的任務,不應該只需要幾行代碼)替代Conduit庫?

一個簡單的替代方案是使用卷曲包。 它支持HTTP,HTTPS和許多其他替代協議,以及許多自定義其行為的選項 價格是引入對libcurl的外部依賴,這是構建軟件包所必需的。

例:

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

更新:我試圖復制你的問題,但一切都適合我。 你能發布一個簡短的,自包含的,可編譯的,示例來證明這個問題嗎? 我的代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM