<div dir="ltr">Are you doing this all in a single thread?<br><br><div class="gmail_quote">On Tue, Aug 26, 2008 at 4:35 PM, brian <span dir="ltr">&lt;<a href="mailto:brianchina60221@gmail.com">brianchina60221@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi, I&#39;ve been struggling with this problem for days and I&#39;m dying. Please help.<br>
<br>
I want to use Parsec to parse NNTP data coming to me from a handle I<br>
get from connectTo.<br>
<br>
One unworkable approach I tried is to get a lazy String from the<br>
handle with hGetContents. The problem: suppose the first message from<br>
the NNTP server is &quot;200 OK\r\n&quot;. Parsec parses it beautifully. Now I<br>
need to discard the parsed part so that Parsec will parse whatever the<br>
server sends next, so I use Parsec&#39;s getInput to get the remaining<br>
data. But there isn&#39;t any, so it blocks. Deadlock: the client is<br>
inappropriately waiting for server data and the server is waiting for<br>
my first command.<br>
<br>
Another approach that doesn&#39;t quite work is to create an instance of<br>
Parsec&#39;s Stream with timeout functionality:<br>
<br>
instance Stream Handle IO Char where<br>
 &nbsp;uncons h =<br>
 &nbsp; &nbsp;do r &lt;- hWaitForInput h ms<br>
 &nbsp; &nbsp; &nbsp; if r<br>
 &nbsp; &nbsp; &nbsp; &nbsp; then liftM (\c -&gt; Just (c, h)) (hGetChar h)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; else return Nothing<br>
 &nbsp; &nbsp;where ms = 5000<br>
<br>
It&#39;s probably obvious to you why it doesn&#39;t work, but it wasn&#39;t to me<br>
at first. The problem: suppose you tell parsec you&#39;re looking for<br>
(many digit) followed by (string &quot;\r\n&quot;). &quot;123\r\n&quot; won&#39;t match;<br>
&quot;123\n&quot; will. My Stream has no backtracking. Even if you don&#39;t need<br>
&#39;try&#39;, it won&#39;t work for even basic stuff.<br>
<br>
Here&#39;s another way:<br>
<a href="http://www.mail-archive.com/haskell-cafe@haskell.org/msg22385.html" target="_blank">http://www.mail-archive.com/haskell-cafe@haskell.org/msg22385.html</a><br>
The OP had the same problem I did, so he made a variant of<br>
hGetContents with timeout support. The problem: he used something from<br>
unsafe*. I came to Haskell for rigor and reliability and it would make<br>
me really sad to have to use a function with &#39;unsafe&#39; in its name that<br>
has a lot of wacky caveats about inlining, etc.<br>
<br>
In that same thread, Bulat says a timeout-enabled Stream could help.<br>
But I can&#39;t tell what library that is. &#39;cabal list stream&#39; shows me 3<br>
libraries none of which seems to be the one in question. Is Streams a<br>
going concern? Should I be checking that out?<br>
<br>
I&#39;m not doing anything with hGetLine because 1) there&#39;s no way to<br>
specify a maximum number of characters to read 2) what is meant by a<br>
&quot;line&quot; is not specified 3) there is no way to tell if it read a line<br>
or just got to the end of the data. Even using something like hGetLine<br>
that worked better would make the parsing more obscure.<br>
<br>
Thank you very very much for *any* help.<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>/jve<br>
</div>