2016-05-07 8 views
1

Ich versuche, eine Möglichkeit zu finden, zu überprüfen, ob eine Webseite in Haskell existiert. Der Server ist nur HTTP2/HTTPS und ich versuche zu überprüfen, ob die Seite in einer Servant-Anwendung existiert.Erhalten Sie den Statuscode einer Webseite in Haskell

Gibt es irgendwelche Haskell-Pakete mit guter Dokumentation, um nur zu prüfen, ob der Statuscode 200 oder 404 ist? Und mit starken HTTPS und HTTP2 Servern arbeiten?

Hier ist, was ich derzeit mit http-Conduit, aber ich erhalte seltsame Ausnahmen (TlsExceptionHostPort (HandshakeFailed (Error_Protocol ("Server Hallo erwartet, bekam Warnung: [(AlertLevel_Fatal, HandshakeFailure)]", True, HandshakeFailure))) "thibaud.dauce.fr" 443 und StatusCodeException).

... other imports 
import qualified Network.HTTP.Conduit as HTTP 

... other types 
type AppM = ReaderT Config (EitherT ServantErr IO) 

newComment :: String -> OneComment -> AppM Int64 
newComment baseUrl oneComment = do 
    time <- liftIO getCurrentTime 
    response <- HTTP.withManager $ \manager -> do 
     request <- HTTP.parseUrl $ url oneComment 
     HTTP.httpLbs request manager 
    case (statusIsSuccessful $ HTTP.responseStatus response, startswith baseUrl (url oneComment)) of 
     (_, False) -> return 0 
     (True, True) -> do 
      theNewComment <- runDb $ insert $ Comment (url oneComment) (content oneComment) time 
      return $ fromSqlKey theNewComment 
     _ -> return 0 
+1

Werfen Sie einen Blick auf dem [ 'wreq' Paket] mit (http://www.serpentine.com/wreq/) – ErikR

Antwort

3

Einige Beispiele wreq

{-# LANGUAGE OverloadedStrings #-} 

import Network.Wreq 
import Control.Lens 
import Control.Exception as E 
import Network.HTTP.Client (HttpException) 

test1 = do 
    r <- get "https://httpbin.org/get" 
    print $ r ^. responseStatus . statusCode 

-- throws an exception 
test2 = do 
    r <- get "https://www.google123123.com" 
    print $ r ^. responseStatus . statusCode 

testUrl url = do 
    r <- get url 
    return $ r ^. responseStatus . statusCode 

-- catching the exception 
test3 = do 
    st <- testUrl "https://www.google123123123.com" `E.catch` handler 
    print st 
    where 
    handler :: HttpException -> IO Int 
    handler _ = return 999 
+0

ich Ihren Code und ich ein 'TlsExceptionHostPort (HandshakeFailed (Error_Protocol (" erwartet Server hallo, bekam Warnung: [(AlertLevel_Fatal, HandshakeFailure)] ", True, HandshakeFailure))" thibaud.dauce.fr "443, auch wenn meine Website als ein vollständig gültiges HTTPS-Zertifikat ... –

+0

'wreq' verwendet [' hs-tls'] (https://github.com/vincenthz/hs-tls) und es gab Probleme mit bestimmten Arten von Zertifikaten und Verschlüsselungen. Ich würde die neueste Version aus dem Github-Repository erstellen und das Programm "tis-simpleclient" ausführen, um weitere Diagnoseinformationen zu erhalten. Überprüfen Sie auch den Issue Tracker - es gab Probleme mit bestimmten ISP-Providern. – ErikR

+0

Veröffentlichen Sie bereits vor ein paar Tagen ein Problem mit weiteren Informationen https://github.com/vincenthz/hs-tls/issues/142. 'tls-simpleclient' scheint auch zu scheitern ... Danke für deine Hilfe und für deine Code-Beispiele nochmal! –

Verwandte Themen