Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wreq: Stop 404s throwing exceptions

Tags:

haskell

I am trying to test broken links but, when I use Wreq's get method and run into a 404, I get an exception (see bottom) rather than a statusCode to handle. Only 200s seem to be returned.

I tried to follow the error-handling code in the tutorial but I can't find a way to return the same type as get u. Moreover, this seems to be more complexity than I need in this instance.

How can I simply prevent the exception and just return the responseStatus as is

verifySeatme :: Maybe URL -> IO UrlStatus
verifySeatme url = do
    case url of
        Nothing -> return None
        Just "" -> return None
        Just u -> do
            seatmeResp <- get u --`E.catch` handler
            -- r ^? responseBody . key "url"
            -- could also check for redirect to errorPage.aspx
            if seatmeResp ^. W.responseStatus . statusCode == 200
            then return (Working u)
            else return Broken
    where
        handler e@(StatusCodeException s respHeaders _) =
            do
                return respHeaders

Here is the exception thrown, and you can see it has the stateCode i want

*Main> re <- get "https://www.seatme.nl/restaurant/1371/Londen.htm"
*** Exception: StatusCodeException (Status {statusCode = 404, statusMessage = "Not Found"}) [("Cache-Control","private"),....

Yuras suggested using options, but I have been unable to work from the example using params to one using checkStatus :: Lens' Options (Maybe StatusChecker):

getData :: IO Restos
getData = do
    let opts = defaults & customStatusHandler
    jdata <- asJSON =<< getWith opts "http://localhost/restos-short.json" :: IO Resp
    let
        restos = jdata ^. W.responseBody
    verified <- mapM processEntry restos
    return verified

-- type StatusChecker = Status -> ResponseHeaders -> CookieJar -> Maybe SomeException
customStatusHandler :: W.StatusChecker
customStatusHandler st res _ =
    Just res
like image 675
Simon H Avatar asked Dec 15 '15 09:12

Simon H


2 Answers

NOTE: the answer is outdated, see other answers.

I never used Wreq, but it looks like you should use getWith to pass custom options and checkStatus to configure status handling.

An example:

getWith (set checkStatus (Just $ \_ _ _ -> Nothing) defaults)
  "http://google.com/hello/world"

The \_ _ _ -> Nothing is a function to check status code, see StatusChecker. It returns nothing indicating that any status code is OK.

like image 166
Yuras Avatar answered Sep 27 '22 15:09

Yuras


To expand on the answer by Evelyn Schneider, I got this to work with

r <- getWith opts url
where 
  opts = set Network.Wreq.checkResponse (Just $ \_ _ -> return ()) defaults
like image 38
bens Avatar answered Sep 27 '22 16:09

bens