2012-11-07 41 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 }