1

Haskell に Web ページが存在するかどうかを確認する方法を見つけようとしています。サーバーは HTTP2/HTTPS のみで、ページがサーバント アプリケーションに存在するかどうかを確認しようとしています。

ステータス コードが 200 か 404 かを確認するだけの適切なドキュメントを含む Haskell パッケージはありますか? 強力な HTTPS および HTTP2 サーバーを使用していますか?

ここで私は現在httpコンジットで持っていますが、奇妙な例外を受け取っています (TlsExceptionHostPort (HandshakeFailed (Error_Protocol ("expecting server hello, got alert : [(AlertLevel_Fatal,HandshakeFailure)]",True,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
4

1 に答える 1

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
于 2016-05-07T18:25:15.660 に答える