2016-05-07 7 views
1

Я пытаюсь найти способ проверить, существует ли веб-страница в Haskell. Сервер только HTTP2/HTTPS, и я пытаюсь проверить, существует ли страница в приложении-сервисе.Получить код статуса веб-страницы в Haskell

Есть ли пакеты Haskell с хорошей документацией, чтобы просто проверить, является ли код состояния 200 или 404? И работа с сильными серверами HTTPS и HTTP2?

Вот то, что я в настоящее время с HTTP-каналом, но я получаю странные исключения (TlsExceptionHostPort (HandshakeFailed (Error_Protocol ("ожидает сервер привет, получил предупреждение: [(AlertLevel_Fatal, HandshakeFailure)]", правда, HandshakeFailure))) «thibaud.dauce.fr» 443 и 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

Посмотрите на [ 'wreq' пакет] (http://www.serpentine.com/wreq/) – ErikR

ответ

3

Некоторые примеры использования 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

Я использую свой код, и я получаю '' TlsExceptionHostPort (HandshakeFailed (Error_Protocol («ожидающий сервер привет, получил предупреждение: [(AlertLevel_Fatal, HandshakeFailure)]», True, HandshakeFailure))) «thibaud.dauce.fr» 443', даже если мой сайт как вполне действительный сертификат HTTPS ... –

+0

'wreq' использует [' hs-tls'] (https://github.com/vincenthz/hs-tls), и были проблемы с определенными типами сертификатов и шифров. Я бы построил последнюю версию из репозитория github и запустил программу 'tis-simpleclient', чтобы получить дополнительную диагностическую информацию. А также проверьте отслеживание проблем - были проблемы с конкретными провайдерами интернет-провайдеров. – ErikR

+0

Уже опубликовано вопрос, чтобы получить дополнительную информацию https://github.com/vincenthz/hs-tls/issues/142 несколько дней назад. 'tls-simpleclient', похоже, терпит неудачу ... Спасибо за вашу помощь и за ваши образцы кода снова! –