Giter Site home page Giter Site logo

Comments (3)

emlautarom1 avatar emlautarom1 commented on August 20, 2024

I found that I can do the following:

-- Client.hs
module Client where

main = do
  let settings = clientSettings 80 "127.0.0.1"
  result <- runTCPClient settings $ \appData -> do
      runConduit $ yield "request" .| appSink appData
      lazy <- runConduit $ appSource appData .| mapC Builder.byteString .| sinkLazyBuilder
      return $ toStrict lazy

  print result

Now I get a single value from runConduit, but this program hangs forever. I assume that it waits forever for more ByteStrings (which will never arrive).

from conduit.

snoyberg avatar snoyberg commented on August 20, 2024

In order to make a system like this work, you need to do something like:

  • Have the sending side close its send socket to let the receiving side no there's no more data
  • Indicate at the beginning of the message how many bytes are coming
  • Have some kind of termination signal within the stream

from conduit.

emlautarom1 avatar emlautarom1 commented on August 20, 2024

What I ended up doing is the following:

-- Server.hs
module Server where

main = do
  let settings = serverSettings 80 "127.0.0.1"
  runTCPServer settings $ \appData -> do
    void $
      runConduitRes $
        appSource appData .| handler .| appSink appData

handler :: Monad m => ConduitT ByteString ByteString m ()
handler = whenJustM await (const $ yield veryLongString)

-- Client.hs
module Client where

main = do
  let settings = clientSettings 80 "127.0.0.1"
  result <- runTCPClient settings $ \appData -> do
      runConduit $ yield "request" .| appSink appData
      runConduit $ appSource appData .| foldC

  print result

With this, the server will get only the first message with await and then close the connection. I'm not quite satisfied with this solution but it works for my use case. As for the client, I'm not sure if there's a performance degradation on using a single foldC instead of builders, but again, for my use case it seems to be fine.

from conduit.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.