2012-11-07 43 views
2

首先我會給你的代碼,然後錯誤,然後一些類型的信息。問題是這些:我怎樣才能弄清楚發生了什麼?我該如何解決這個問題?案例神祕關閉句柄

readTask = do 
    req' <- parseUrl "https://10.64.251.32/rest/api/latest/issue/BNAP-291" 
    manager <- newManager manSettings 
    let req'' = applyBasicAuth (pack "sandboxer") (pack "sandboxer") req' 
    Response _ _ _ body <-runResourceT $ http req'' manager 
    pBody <- runResourceT $ 
      body $$+- sinkParser json 

    -- print pBody 
    -- closeManager manager 

    return() 
     where manSettings = 
       def 
       { managerCheckCerts = \ _ _ -> return CertificateUsageAccept } 

這個編譯好。這裏是發生了什麼,當我運行編譯代碼

dist/build/Spike/Spike 
Spike: <socket: 3>: hGetBuf: illegal operation (handle is closed) 

body是以下類型

Data.Conduit.Internal.ResumableSource 
(Control.Monad.Trans.Resource.ResourceT IO) 
Data.ByteString.Internal.ByteString 

反饋讚賞,我不知道如何開始解決此。

+0

聽起來就像是對方關閉了連接。 –

+1

不應該'http req''manager'和'body $$ + - sinkparser json'調用在一個'runResourceT'中嗎?像這樣的東西(提供它編譯):https://gist.github.com/f0e71c053e8b892c4c49 –

+0

@Nathan - 給那個人一個upvote。 –

回答

1

第一個runResourceT調用在解析正文之前關閉套接字。您需要將兩個runResourceT呼叫合併爲一個。 ResourceTMonad實例,這樣就可以使用do符號和一些小手術來釋放插座解析完成後:

readTask = do 
    req' <- parseUrl "https://10.64.251.32/rest/api/latest/issue/BNAP-291" 
    manager <- newManager manSettings 
    let req'' = applyBasicAuth (pack "sandboxer") (pack "sandboxer") req' 
    runResourceT $ do 
     Response _ _ _ body <- http req'' manager 
     pBody <- body $$+- sinkParser json 
     liftIO $ print pBody 

    closeManager manager 

    return() 
     where manSettings = 
       def 
       { managerCheckCerts = \ _ _ -> return CertificateUsageAccept }