Re: [Haskell-cafe] network-conduit proxy

2012-03-11 Thread grant
> So you can do smth like:
> 
> (sourceClient $= CL.map Left) >=< 
>   (sourceTMChan communicationChannel $= CL.map Right)
> 
> Alexander V Vershilov

That's a great idea, I'll give that a try. I was having an odd problem with 
killThread on windows where the first character would be lost in the next 
session straight after the killThread, so your idea looks more appealing.

Thanks again,
Grant



___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-11 Thread Alexander V Vershilov

Sun, Mar 11, 2012 at 05:16:06PM +, grant wrote
> Thanks for explaining the problem. I guess I have to ditch my preconceived
>  notions (based on using Java/.Net) that killing a thread is dangerous.
> Thanks again,
> Grant
> 

Don't know if it's a good way, but if you are afraid of killing thread you
can use thread communication like you can use asynchronous exceptions or
channels. 

So you can do smth like:

(sourceClient $= CL.map Left) >=< 
  (sourceTMChan communicationChannel $= CL.map Right)

And have all data in Left and all commands in Right. This is really overkill 
for such a task but it can be usefull for more complicated ones, where there 
are communication between threads. 

--
Alexander V Vershilov


signature.asc
Description: Digital signature
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-11 Thread grant
Thanks for explaining the problem. I guess I have to ditch my preconceived
 notions (based on using Java/.Net) that killing a thread is dangerous.
Thanks again,
Grant



___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-10 Thread Michael Snoyman
You're running `clientSrc $$ serverSink` in a separate thread. What
it's doing is blocking for any kind of input from clientSrc before it
can continue. That thread knows nothing about the rest of the program,
including that serverSink is closed. This is inherent to the network
functions involved here.

It seems like this is a perfect time to pull out killThread, as
Alexander mentioned. It's a way to send a signal to a blocked thread,
which is what you have here. All of the conduit libraries have been
designed from the ground up to work correctly with asynchronous
exceptions, and all resources will be freed correctly. Is there a
specific reason why this seems like the wrong approach here?

Michael

On Sat, Mar 10, 2012 at 11:12 PM, grant  wrote:
>
> The problem is, how would I then go about creating a proxy like tcpmon?
>
> I was going to replace this code 'clientSrc $$ serverSink'
> with this 'clientSrc $$ (sinkFork (sinkFile "randomname") serverSink'
> and the same for the 'serverSrc $$ clientSink' part.
>
> However, since the 'clientSrc $$ serverSink' part will be suspended until the
> process has ended, I would be holding on to open resources for the whole time.
>
> Is there a better way to create this proxy?
>
> Thanks,
> Grant
>
>
>
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-10 Thread grant

The problem is, how would I then go about creating a proxy like tcpmon?

I was going to replace this code 'clientSrc $$ serverSink'
with this 'clientSrc $$ (sinkFork (sinkFile "randomname") serverSink'
and the same for the 'serverSrc $$ clientSink' part.

However, since the 'clientSrc $$ serverSink' part will be suspended until the 
process has ended, I would be holding on to open resources for the whole time.

Is there a better way to create this proxy?

Thanks,
Grant



___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-10 Thread Michael Snoyman
Seems to work perfectly for me. The statement you're expecting to be
printed won't be printed until the original server (running on 5000)
closes its socket. If I connect it to Warp, this takes about 30
seconds, which is the slowloris timeout period.

On Sat, Mar 10, 2012 at 10:01 PM, grant  wrote:
> Unfortunately I don't have a solution to this.
>
> Here is some code and output that hopefully explains what is happening
> https://gist.github.com/2012723
>
> The problem is that the  clientSrc $$ serverSink appears to run and according 
> to
> Alexander, the socket closes. But the thread seems to hang inside
> the "clientSrc $$ serverSink" command and then nothing after that command is 
> run
> (until the process is terminated).
>
> I would have expected the register command to run and the statement
> "END  clientSrc serverSink" to display.
> When I kill the process on Ubuntu all three exceptions are then thrown at once
> and the rest of the thread continue.
>
> Thanks for taking a look at this,
> Grant
>
>
>
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-10 Thread grant
Unfortunately I don't have a solution to this.

Here is some code and output that hopefully explains what is happening
https://gist.github.com/2012723

The problem is that the  clientSrc $$ serverSink appears to run and according 
to 
Alexander, the socket closes. But the thread seems to hang inside 
the "clientSrc $$ serverSink" command and then nothing after that command is 
run 
(until the process is terminated).

I would have expected the register command to run and the statement 
"END  clientSrc serverSink" to display.
When I kill the process on Ubuntu all three exceptions are then thrown at once 
and the rest of the thread continue.

Thanks for taking a look at this,
Grant



___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-10 Thread Michael Snoyman
I think I missed something in this thread. What's the bug in
network-conduit? I'd like to have it patched in the next release.

On Sat, Mar 10, 2012 at 9:19 AM, grant  wrote:
> Excellent. registering killThread works great. Hopefully the library will be
> fixed correctly.
> Thanks a lot for your help,
> Grant
>
>
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-09 Thread grant
Excellent. registering killThread works great. Hopefully the library will be 
fixed correctly.
Thanks a lot for your help,
Grant


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-09 Thread Alexander V Vershilov
As it seems from code runTCPServer registers socket close 
and TCPClient runs it in bracket so all open resources should be
closed. It my last try I add 
  _ <- register $ killThread tId
after forking serverSrc $$ clientSink, to kill outter thread explicilty
otherwise it closes thread with error. 

> Is this the expected behaviour or are resources not being closed?

In 'strace' log it seems that both sockets is closed. So I think that 
computation is closed before reaching the end because src $$ sink closed
with error. If you want to run action at the end you can register it

--
Alexander V Vershilov


Sat, Mar 10, 2012 at 05:43:12AM +, grant wrote
> I've tried running the code with runTCPServer first but I get
>  "recv: invalid argument (Bad file descriptor)" on ubuntu (virtualbox) 
> and when running on windows 
> I get "Network.Socket.ByteString.recv: failed (Unknown error)".
> 
> Also, it seems odd that when I run this code   
> https://gist.github.com/2010354   
> that it doesn't print "END   serverSrc clientSink". 
> Is this the expected behaviour or are resources not being closed?
> Again the same thing happens when running on Ubuntu.
> 
> {- here is the output ...
> C:\haskell>netproxy4
> START clientSrc serverSink
> START serverSrc clientSink
> END   clientSrc serverSink
> START serverSrc clientSink
> START clientSrc serverSink
> END   clientSrc serverSink
> -}
> 
> Thanks for any ideas.
> Grant
> 
> 
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe


signature.asc
Description: Digital signature
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-09 Thread grant
I've tried running the code with runTCPServer first but I get
 "recv: invalid argument (Bad file descriptor)" on ubuntu (virtualbox) 
and when running on windows 
I get "Network.Socket.ByteString.recv: failed (Unknown error)".

Also, it seems odd that when I run this code   https://gist.github.com/2010354  
 
that it doesn't print "END   serverSrc clientSink". 
Is this the expected behaviour or are resources not being closed?
Again the same thing happens when running on Ubuntu.

{- here is the output ...
C:\haskell>netproxy4
START clientSrc serverSink
START serverSrc clientSink
END   clientSrc serverSink
START serverSrc clientSink
START clientSrc serverSink
END   clientSrc serverSink
-}

Thanks for any ideas.
Grant


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-09 Thread Alexander V Vershilov

For first error it seems best way will be patching conduit-network as it 
done it warp [1]. I don't know how to deal with second error.


[1] 
http://hackage.haskell.org/packages/archive/warp/1.1.0.1/doc/html/src/Network-Wai-Handler-Warp.html#runSettings

--
Alexander V Vershilov

Fri, Mar 09, 2012 at 07:52:39PM +, grant wrote
> When I run the code you suggested on windows I get the following error:
>   getAddrInfo: does not exist (error 10093)
> which probably refers to  http://trac.haskell.org/network/ticket/32
> 
> After adding withSocketsDo I get a little further, but get the following 
> error 
> after sending data through the proxy:
> 
> netproxy2: Network.Socket.ByteString.recv: failed (Unknown error)
> 
> Any ideas?
> Thanks so much for your help with this.
> Grant
> 
> 
> 
> 
> 
> 
> 
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe


signature.asc
Description: Digital signature
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-09 Thread grant
When I run the code you suggested on windows I get the following error:
  getAddrInfo: does not exist (error 10093)
which probably refers to  http://trac.haskell.org/network/ticket/32

After adding withSocketsDo I get a little further, but get the following error 
after sending data through the proxy:

netproxy2: Network.Socket.ByteString.recv: failed (Unknown error)

Any ideas?
Thanks so much for your help with this.
Grant







___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] network-conduit proxy

2012-03-09 Thread Alexander V Vershilov
Hello.

I'm not expert but first you should not use Network sockets, because everything
is included into Data.Conduit.Network, just use high level API.
Second, you should use not server inside client but client inside server:

so you can make such a code [1]:


{-# OPTIONS -Wall #-}
import Data.Conduit
import Data.Conduit.Network
import Control.Monad.IO.Class (liftIO)
import Control.Concurrent.Lifted (fork)

main::IO ()
main =
  runTCPServer (ServerSettings 5002 Nothing) $ \clientSrc clientSink -> do
liftIO $ runTCPClient (ClientSettings 5000 "localhost") $ \serverSrc 
serverSink -> do
  _ <- liftIO $ fork $ runResourceT $ serverSrc $$ clientSink
  clientSrc $$ serverSink

tested and works

[1] https://gist.github.com/2008113

--
Alexander V Vershilov

Fri, Mar 09, 2012 at 05:44:29PM +, grant wrote
> I am trying to get a proxy working using the network-conduit package on 
> windows.
> So I send a request to port 5002 and that gets forwarded to another port 5000 
> where I have a simple echo server running.
> 
> I made a stab at it, but get intermittent send errors after the first 
> connection
> 
> Here is the code:
> {-# OPTIONS -Wall #-}
> import Data.Conduit
> import Data.Conduit.Network
> import Network (withSocketsDo)
> import Control.Monad.IO.Class (liftIO)
> import Control.Monad.Trans.Resource
> 
> main::IO ()
> main = 
>   withSocketsDo $ runTCPClient (ClientSettings 5000 "localhost") $ 
> \src1 sink1 -> do
> liftIO $ print "in tcpclient section"
> liftIO $ withSocketsDo $ runTCPServer (ServerSettings 5002 Nothing) $ 
>   \src sink -> do
>   liftIO $ print "in tcpserver section"
>   _ <- liftIO $ runResourceT $ resourceForkIO $ do
>   src1 $$ sink 
>   return ()
>   src $$ sink1 
> 
>   
> Thanks for any help,
> Grant
>   
> 
> 
> 
> 
> ___
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe


signature.asc
Description: Digital signature
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] network-conduit proxy

2012-03-09 Thread grant
I am trying to get a proxy working using the network-conduit package on windows.
So I send a request to port 5002 and that gets forwarded to another port 5000 
where I have a simple echo server running.

I made a stab at it, but get intermittent send errors after the first connection

Here is the code:
{-# OPTIONS -Wall #-}
import Data.Conduit
import Data.Conduit.Network
import Network (withSocketsDo)
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.Resource

main::IO ()
main = 
  withSocketsDo $ runTCPClient (ClientSettings 5000 "localhost") $ 
\src1 sink1 -> do
liftIO $ print "in tcpclient section"
liftIO $ withSocketsDo $ runTCPServer (ServerSettings 5002 Nothing) $ 
  \src sink -> do
  liftIO $ print "in tcpserver section"
  _ <- liftIO $ runResourceT $ resourceForkIO $ do
  src1 $$ sink 
  return ()
  src $$ sink1 

  
Thanks for any help,
Grant
  




___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe