[英]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.