Haskell Network.Browser HTTPS连接

时间:2010-10-21 13:48:03

标签: networking haskell https

有没有办法使用Network.Browser包进行https调用。 我没有在documentation on Hackage中看到它 如果没有办法使用浏览是否有另一种方法来获取https页面?

我目前的测试代码是

import Network.HTTP
import Network.URI (parseURI)
import Network.HTTP.Proxy
import Data.Maybe (fromJust)
import Control.Applicative ((<$>))
import Network.Browser

retrieveUrl :: String -> IO String
retrieveUrl url = do
  rsp <- browse $ request (Request (fromJust uri) POST [] "Body")
  return $ snd (rspBody <$> rsp)
  where uri = parseURI url

我一直在运行 nc -l -p 8000 并观看输出。 当我执行 retrieveUrl https://localhost:8000

时,我发现它没有加密它

当我尝试使用真正的https网站时,我得到了:

Network.Browser.request: Error raised ErrorClosed
*** Exception: user error (Network.Browser.request: Error raised ErrorClosed)

编辑:Network.Curl解决方案(用于进行SOAP调用)

import Network.Curl (curlGetString)
import Network.Curl.Opts

soapHeader s = CurlHttpHeaders ["Content-Type: text/xml", "SOAPAction: " ++ s]
proxy        = CurlProxy "proxy.foo.org"
envelope     = "myRequestEnvelope.xml"

headers  = readFile envelope >>= (\x -> return [ soapHeader "myAction"
                                               , proxy
                                               , CurlPost True
                                               , CurlPostFields [x]]) 

main = headers >>= curlGetString "https://service.endpoint"

3 个答案:

答案 0 :(得分:12)

另一种也许更像是“haskelly”的解决方案,正如Travis Brown用http-conduit所做的那样:

只需获取https页面:

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

main = simpleHttp "https://www.noisebridge.net/wiki/Noisebridge" >>= L.putStr

下面显示了如何传递urlencode参数。

{-# LANGUAGE OverloadedStrings #-}

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

main = do
  initReq <- parseUrl "https://www.googleapis.com/urlshortener/v1/url"
  let req' = initReq { secure = True } -- Turn on https
  let req = (flip urlEncodedBody) req' $
             [ ("longUrl", "http://www.google.com/")
--             ,
             ]
  response <- withManager $ httpLbs req
  L.putStr $ responseBody response

您也可以手动设置方法,内容类型和请求正文。 api与http-enumerator中的相同,例如:https://stackoverflow.com/a/5614946

答案 1 :(得分:8)

我过去一直在想这个问题,并且总是只使用libcurl bindings。有一个更多的Haskelly解决方案会很好,但是Network.Curl非常方便。

答案 2 :(得分:3)

如果要做的只是获取页面,Network.HTTP.Wget是最简单的方法。参展:

import Network.HTTP.Wget

main = putStrLn =<< wget "https://www.google.com" [] []