2010-10-21 21 views
15

¿Hay alguna manera de realizar llamadas https con el paquete Network.Browser? No lo estoy viendo en el documentation on Hackage.
Si no hay una manera de hacerlo con browse ¿hay alguna otra forma de recuperar páginas https?Haskell Network.Browser HTTPS Connection

Mi código de prueba actual es

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 

He estado corriendo nc -l -p 8000 y viendo la salida. veo que no cifra que cuando lo haga retrieveUrl https://localhost:8000

también cuando intento un sitio real https consigo:

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

Editar: solución Network.Curl (Para hacer un jabón llaman)

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" 
+0

No debería haber aceptado esa respuesta; dado que SO es para el beneficio de todos, tener una pregunta abierta hubiera estimulado más respuestas (o incluso desarrollo). – drozzy

+0

@drozzy aún vale la pena responder incluso si se ha exceptuado una respuesta. http-conduit es un paquete más nuevo y parece ser una respuesta más conveniente al problema. – Davorak

Respuesta

8

me he preguntado acerca de esto en el pasado y siempre han terminado simplemente utilizando el libcurl bindings. Sería bueno tener una solución más Haskelly, pero Network.Curl es muy conveniente.

+0

Sí, terminé yendo con Network.Curl según su sugerencia, gracias por la ayuda. – devrand

+4

Entonces, ¿Network.HTTP simplemente no es compatible con HTTPS? –

+0

¿Funcionará esto en Windows? – drozzy

3

Si todo lo que quiere hacer es buscar una página, Network.HTTP.Wget es la manera más simple. Exhibir una:

import Network.HTTP.Wget 

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

Una alternativa y tal vez más "haskelly" solución como Travis Brown puso por http-conducto:

Para simplemente fetch páginas HTTPS:

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

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

La siguiente muestra cómo pasar los parámetros de 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 

También puede establecer manualmente el método, el tipo de contenido y el cuerpo de la solicitud. La API es la misma que en http-enumerator un buen ejemplo es: https://stackoverflow.com/a/5614946