2010-10-21 13 views
15

Esiste un modo per effettuare chiamate https con il pacchetto Network.Browser. Non lo vedo nello documentation on Hackage.
Se non c'è un modo per farlo con browse c'è un altro modo per recuperare le pagine https?Haskell Network.Browser Connessione HTTPS

mio codice di prova corrente è

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 

Ho corso nc -l -p 8000 e guardare l'output. vedo che non crittografa quando faccio retrieveUrl https://localhost:8000

Anche quando provo un vero e proprio sito https ottengo:

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

Edit: soluzione Network.Curl (per fare un SOAP chiamano)

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

Non avresti dovuto accettare quella risposta; poiché SO è a beneficio di tutti, avere una domanda aperta avrebbe stimolato più risposte (o addirittura lo sviluppo). – drozzy

+0

@drozzy vale la pena di rispondere anche se una risposta è stata esclusa. http-conduit è un pacchetto più recente e sembra essere una risposta più comoda al problema. – Davorak

risposta

8

mi sono chiesto su questo in passato e hanno sempre finito per usare la libcurl bindings. Sarebbe bello avere una soluzione più Haskelly, ma Network.Curl è molto conveniente.

+0

Sì, ho finito con Network.Curl sulla base del tuo suggerimento, grazie per l'aiuto. – devrand

+4

Quindi, Network.HTTP non supporta affatto HTTPS? –

+0

Funzionerà su Windows? – drozzy

3

Se tutto quello che vuoi fare è recuperare una pagina, Network.HTTP.Wget è il modo più semplice. Allegato A:

import Network.HTTP.Wget 

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

Un'alternativa e forse più "haskelly" soluzione come Travis Brown dirla con http-conduit:

per recuperare solo https pagine:

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

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

Il seguente mostra come per passare i parametri 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 

È anche possibile impostare manualmente il metodo, il tipo di contenuto e il corpo della richiesta. L'api è la stessa di un enumeratore http un buon esempio: https://stackoverflow.com/a/5614946

Problemi correlati