【问题标题】:Parsing HTTP requests in Haskell在 Haskell 中解析 HTTP 请求
【发布时间】:2014-03-06 05:43:46
【问题描述】:

我应该使用哪个库来解析来自套接字流的 HTTP 请求?我想要一个可以包含部分或多个 HTTP 请求的惰性 ByteString 的东西。

我也对响应 HTTP 请求的类似内容感兴趣(传递一个响应对象并获取惰性 ByteString 以写入套接字)

已编辑以添加更多信息: 这个接口是理想的,但当然不是必需的:

ByteString {- the initial buffer -} -> (Maybe Request, ByteString {- remaining buffer -})

如果是部分请求,Maybe RequestNothing,ByteString 与输入相同。

谢谢:-)

【问题讨论】:

  • 你想要什么输出? (包含已解析请求的列表?)您希望如何处理部分请求?

标签: haskell


【解决方案1】:

要处理这种类型的流数据,当前的解决方案是使用 iteratee 或类似 iteratee 的库之一。 Conduit、Pipes(可能被重命名为代理,因为它可以处理双向数据以及其他独特的好处)、Iteratee、枚举器、iterIO 等。管道库似乎在依赖它的库数量上有着显着的领先优势。

您应该看看Conduit section on hackage.haskell.org,尤其是http-conduit。第一个示例中的一个获取 http 响应,然后将其写入恒定空间中的文件。

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 _ _ _ src <- http request manager
         src C.$$+- sinkFile "google.html"

【讨论】:

    【解决方案2】:

    我认为您可以只使用Network.HTTP 进行基本实现,但我认为它本身不支持ByteStrings

    【讨论】:

      【解决方案3】:

      管道在特性方面的策略与管道不同。 Conduit 将其所有功能打包在一起,而 Pipes 更喜欢将它们分开打包。

      pipes-bytestring 是我相信您正在寻找的包。

      可以通过运行安装:

      cabal install pipes-bytestring
      

      要查找可以运行的其他管道包:

      cabal list pipes
      

      或者你也可以搜索hackage

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 2021-01-18
        • 2012-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多