Ответ 1
Один простой вариант - использовать пакет curl. Он поддерживает 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
Обновление: Я пытался реплицировать вашу проблему, но все работает для меня. Не могли бы вы опубликовать Short, Self Contained, Compilable, Example, который демонстрирует проблему? Мой код:
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