标签: http-conduit

使用Scotty的网络I/O的吞吐量意外低

我试图对Scotty进行测试,以测试网络I/O效率和整体吞吐量.

为此,我设置了两个用Haskell编写的本地服务器.一个不做任何事情而只是充当API的人.

代码相同

{-# LANGUAGE OverloadedStrings #-}


import Web.Scotty

import Network.Wai.Middleware.RequestLogger 

import Control.Monad
import Data.Text
import Control.Monad.Trans
import Data.ByteString
import Network.HTTP.Types (status302)
import Data.Time.Clock
import Data.Text.Lazy.Encoding (decodeUtf8)
import Control.Concurrent
import Network.HTTP.Conduit
import Network.Connection (TLSSettings (..))
import Network.HTTP.Client
import Network
main = do 
  scotty 4001 $ do
    middleware logStdoutDev
    get "/dummy_api" $ do
        text $ "dummy response"
Run Code Online (Sandbox Code Playgroud)

我写了另一个调用此服务器并返回响应的服务器.

{-# LANGUAGE OverloadedStrings #-}


import Web.Scotty

import Network.Wai.Middleware.RequestLogger 

import Control.Monad
import Control.Monad.Trans
import qualified Data.Text.Internal.Lazy as LT
import Data.ByteString
import Network.HTTP.Types (status302)
import …
Run Code Online (Sandbox Code Playgroud)

benchmarking haskell http-conduit scotty

16
推荐指数
1
解决办法
334
查看次数

Windows 8上的"InternalIOException getAddrInfo:不存在(错误10093)"

为什么这么简单的代码不起作用?

import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L

main :: IO ()
main = simpleHttp "http://www.dir.bg/" >>= L.putStr
Run Code Online (Sandbox Code Playgroud)

它会导致以下错误:

TestConduit.exe:InternalIOException getAddrInfo:不存在(错误10093)

windows haskell http conduit http-conduit

10
推荐指数
1
解决办法
995
查看次数

http-conduit浏览器用法

我正在尝试使用HTTPS从网站上抓取数据.我成功地使用Network.HTTP.Conduit发布基本请求(发布凭据等),但是无法从响应头(Set-Cookie)中提取cookie信息.貌似http-conduit有自己的处理cookie 的机制,我无法理解.

Network.HTTP.Conduit.Browser似乎自动处理cookie(我很好),但由于缺少文档,我无法使用它.

有经验处理http-conduit浏览器模块的人可以告诉我如何:

  1. 处理自签名证书(我设法在基本模块中使用managerCheckCerts执行此操作)
  2. 在正文中发送带有URL编码参数的POST请求,而不是遵循任何重定向(我在基础模块中使用了urlEncodedBody)
  3. 在简单的GET请求中使用2.步骤中的cookie并将响应读作(懒惰)ByteString(我本来会使用httpLbs)

对我来说,看起来Network.HTTP.Conduit.Browser的抽象级别比Network.HTTP.Conduit更适合我的应用程序,所以即使我可以使用后者手动处理cookie,我也想进行切换.

https haskell session-cookies web-scraping http-conduit

8
推荐指数
1
解决办法
796
查看次数

如何捕获Http.Conduit的simpleHttp抛出的404状态异常

我正在尝试下载html文件中包含的所有png文件.我很难捕获404状态异常,而我的程序只是崩溃了.

以下是一些示例:

import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L

main = do
    let badUrl = "http://www.google.com/intl/en_com/images/srpr/WRONG.png"    
    imgData <- (simpleHttp badUrl) `catch` statusExceptionHandler  
    L.writeFile "my.png" imgData

statusExceptionHandler ::  t -> IO L.ByteString
statusExceptionHandler e = (putStrLn "oops") >> (return L.empty)
Run Code Online (Sandbox Code Playgroud)

我的"oops"消息从不打印,而是应用程序崩溃:

StatusCodeException(Status {statusCode = 404,statusMessage ="Not Found"})[("Content-Type","text/html; charset = UTF-8"),("X-Content-Type-Options","nosniff "),("日期","星期五,2012年1月27日03:10:34 GMT"),("服务器","sffe"),("内容长度","964"),("X-XSS -Protection","1; mode = block")]

我究竟做错了什么?

更新:

根据Thoma的建议,我将代码更改为以下代码段,现在已经适当地处理了异常处理.

main = do
    let badUrl = "http://www.google.com/intl/en_com/images/srpr/WRONG.png"    
    imgData <- (simpleHttp badUrl) `X.catch` statusExceptionHandler  
    case imgData of x | x == L.empty -> …
Run Code Online (Sandbox Code Playgroud)

haskell http-status-code-404 http-conduit

6
推荐指数
2
解决办法
1400
查看次数

Haskell无法找到模块`Network.HTTP.Conduit'

我无法让这个导入在haskell中工作.

import Network.HTTP.Conduit
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我收到以下错误:

$ ghc Play.hs

Play.hs:1:8:
    Could not find module `Network.HTTP.Conduit'
    Use -v to see a list of the files searched for.
Run Code Online (Sandbox Code Playgroud)

如果我尝试在GHCI中加载文件,则会发生同样的错误.

我已通过cabal安装了最新版本的http-conduit.这是cabal的输出:

$ cabal -list http-conduit
* http-conduit
    Synopsis: HTTP client package with conduit interface and HTTPS support.
    Default available version: 1.8.2
    Installed versions: 1.6.0.4, 1.8.2
    Homepage: http://www.yesodweb.com/book/http-conduit
    License:  BSD3

* http-conduit-browser
    Synopsis: Browser interface to the http-conduit package
    Default available version: 1.6.3
    Installed versions: 1.6.3
    Homepage: https://github.com/exbb2/http-conduit-browser
    License:  BSD3
Run Code Online (Sandbox Code Playgroud)

如果它可能有所作为,我使用的是Ubuntu 12.04.

任何想法为什么这不会导入?

编辑:'ghc-pkg list'的输出:

$ …
Run Code Online (Sandbox Code Playgroud)

https networking haskell http http-conduit

6
推荐指数
1
解决办法
4734
查看次数

在Network.HTTP.Conduit中禁用SSL/TLS证书验证

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

import Network.HTTP.Conduit
myurl = ... -- Your URL goes here
main = do content <- simpleHttp myurl
          print $ content
Run Code Online (Sandbox Code Playgroud)

运行此程序时,我收到此错误:

*** Exception: TlsException (HandshakeFailed (Error_Protocol
      ("certificate rejected: certificate is not allowed to sign another certificate",
        True,CertificateUnknown)))
Run Code Online (Sandbox Code Playgroud)

从错误消息中可以看出,问题是无法Network.HTTP.Conduit正确验证服务器证书(在这种情况下,证书链中似乎存在问题)

如何更改上面的代码以忽略证书错误(即根本不验证证书)?

ssl haskell conduit http-conduit

6
推荐指数
1
解决办法
1335
查看次数

什么是点管".|" Haskell的运营商?

我明白 "." (点)作为功能组合.我理解"|" (管道)作为"或",警卫介绍语法(从这里 ),但我在http-conduit上看到了一个使用".|"的答案.以我不理解的方式使用此运算符.

我发现的其他管道参考,例如:

...建议语法如"$$","$ =","= $ =","= $"用于组合数据流中的管道.

我该怎么称呼这个".|" 这个运算符,它是如何工作的?

可以预见的是,Google搜索".| haskell"或"'dot pipe'haskell"或"'dot pipe'haskell运营商管道"并不是很成功.

haskell conduit http-conduit

6
推荐指数
1
解决办法
727
查看次数

从haskeline中调用网络IO

我有一个现有的程序,它接受命令行参数(用户名,密码,日期),然后使用该Network.HTTP.Conduit库将xml消息发布到服务器.然后我解析结果,做一些工作并使用blaze-html写出文件.

这一切都像一个魅力; 但是,我以为我会使用haskeline密码不可见.我能够创建一个命令行程序来获取用户提供的值并打印出来,但是如果我调用使用管道的函数,它就永远不会返回.

这是违规代码:

main = runInputT defaultSettings loop
where 
    loop :: InputT IO ()
    loop = do
        Just username <- getInputLine "WM username: "
        Just password <- getPassword (Just '*') "WM password: "
        Just date     <- getInputLine "Date (YYYYMMDD): "

        outputStrLn "querying WM..."
        clients <- lift $ getWMClients username password
        outputStrLn "successfully retrieved client list from WM..."

        let outHeader = renderHeader date username

        reportString <- mapM  (\x -> createString x clients)  cList

        lift $ writeFile …
Run Code Online (Sandbox Code Playgroud)

haskell haskeline http-conduit

5
推荐指数
1
解决办法
361
查看次数

在Haskell中从Internet下载大文件

有关于如何在Haskell中下载大文件的任何建议吗?我认为Http.Conduit是这个库是一个很好的库.但是,它是如何解决这个问题的?它的文档中有一个例子,但它不适合下载文件,它只是下载一个文件:

 import Data.Conduit.Binary (sinkFile)
 import Network.HTTP.Conduit
 import qualified Data.Conduit as C

 main :: IO ()
 main = do
      request <- parseUrl "http://google.com/"
      withManager $ \manager -> do
          response <- http request manager
          responseBody response C.$$+- sinkFile "google.html"
Run Code Online (Sandbox Code Playgroud)

我想要的是能够下载文件而不是用完RAM,例如在性能方面做得有效等等.最好能够"继续"下载它们,意思是"现在某个部分,后来的另一个部分" .

我还发现了hackage上download-curl软件包,但我并不认为这是一个很好的选择,甚至可以像我需要的那样通过chunk下载文件块.

networking haskell http-conduit

5
推荐指数
1
解决办法
937
查看次数

为什么httpJSON失败,但httpLBS成功了?

此功能(使用httpLBS)有效:

makeRequest = do
  response <- httpLBS "http://httpbin.org/get" 
  putStrLn $ "The status code was: " ++ show (getResponseStatusCode response)
Run Code Online (Sandbox Code Playgroud)

但是这个函数(使用httpJSON)不会:

makeRequest = do
  response <- httpJSON "http://httpbin.org/get" 
  putStrLn $ "The status code was: " ++ show (getResponseStatusCode response)
Run Code Online (Sandbox Code Playgroud)

它抛出错误:

Ambiguous type variable `a0' arising from a use of `httpJSON' prevents the constraint 
`(aeson-1.1.2.0:Data.Aeson.Types.FromJSON.FromJSON a0)' from being solved.
          Probable fix: use a type annotation to specify what `a0' should be.
Run Code Online (Sandbox Code Playgroud)

haskell http-conduit

4
推荐指数
1
解决办法
153
查看次数