GithubHelp home page GithubHelp logo

Sure! Here's what we're trying to do. This is a bit simplified, but the issue with Rack vs. Rails responses still applies. about falcon HOT 4 CLOSED

ioquatix avatar ioquatix commented on September 25, 2024
Sure! Here's what we're trying to do. This is a bit simplified, but the issue with Rack vs. Rails responses still applies.

from falcon.

Comments (4)

ioquatix avatar ioquatix commented on September 25, 2024 1

@pschrammel I'm adding a fully working example here: socketry/async-examples#14

from falcon.

ioquatix avatar ioquatix commented on September 25, 2024 1

Okay, it's now working:

class StreamingController < ApplicationController
  def download
    headers = {
      'content-type' => 'application/json',
      'cache-control' => 'no-cache',
      'last-modified' => Time.now.httpdate
    }
    
    body = lambda do |stream|
      chunks = Async::Queue.new
    
      request_task = Async do
        $stderr.puts "Downloading..."
        response = Faraday.get("https://httpbin.org/stream/100") do |request|
          request.options.on_data = proc do |chunk|
            $stderr.puts "Received chunk: #{chunk.bytesize}"
            chunks.enqueue(chunk)
          end
        end
        $stderr.puts "Downloaded: #{response}"
        chunks.enqueue(nil)
      ensure
        $stderr.puts "Request Exiting: #{$!}"
      end
      
      while chunk = chunks.dequeue
        stream.write(chunk)
      end
    ensure
      $stderr.puts "Response Exiting: #{$!}"
      request_task&.stop
      stream.close
    end
    
    self.response = Rack::Response[200, headers, body]
  end
end

Client output:

> curl http://localhost:3000/streaming/download
{"url": "https://httpbin.org/stream/100", "args": {}, "headers": {"Host": "httpbin.org", "X-Amzn-Trace-Id": "Root=1-66c904ae-4ecedec9459327b3148d9705", "User-Agent": "Faraday v2.10.1"}, "origin": "119.224.53.223", "id": 0}
{"url": "https://httpbin.org/stream/100", "args": {}, "headers": {"Host": "httpbin.org", "X-Amzn-Trace-Id": "Root=1-66c904ae-4ecedec9459327b3148d9705", "User-Agent": "Faraday v2.10.1"}, "origin": "119.224.53.223", "id": 1}
{"url": "https://httpbin.org/stream/100", "args": {}, "headers": {"Host": "httpbin.org", "X-Amzn-Trace-Id": "Root=1-66c904ae-4ecedec9459327b3148d9705", "User-Agent": "Faraday v2.10.1"}, "origin": "119.224.53.223", "id": 2}
{"url": "https://httpbin.org/stream/100", "args": {}, "headers": {"Host": "httpbin.org", "X-Amzn-Trace-Id": "Root=1-66c904ae-4ecedec9459327b3148d9705", "User-Agent": "Faraday v2.10.1"}, "origin": "119.224.53.223", "id": 3}
{"url": "https://httpbin.org/stream/100", "args": {}, "headers": {"Host": "httpbin.org", "X-Amzn-Trace-Id": "Root=1-66c904ae-4ecedec9459327b3148d9705", "User-Agent": "Faraday v2.10.1"}, "origin": "119.224.53.223", "id": 4}
{"url": "https://httpbin.org/stream/100", "args": {}, "headers": {"Host": "httpbin.org", "X-Amzn-Trace-Id": "Root=1-66c904ae-4ecedec9459327b3148d9705", "User-Agent": "Faraday v2.10.1"}, "origin": "119.224.53.223", "id": 5}
{"url": "https://httpbin.org/stream/100", "args": {}, "headers": {"Host": "httpbin.org", "X-Amzn-Trace-Id": "Root=1-66c904ae-4ecedec9459327b3148d9705", "User-Agent": "Faraday v2.10.1"}, "origin": "119.224.53.223", "id": 6}
... snip ...

from falcon.

ioquatix avatar ioquatix commented on September 25, 2024

In theory this should work, but there are some issues with the protocol-rack gem (in principle) that make it more difficult than it should be.

Let me investigate a bit more. We definitely want this to work.

from falcon.

ioquatix avatar ioquatix commented on September 25, 2024

The full working example is here: https://github.com/socketry/async-examples/tree/main/rails-streaming-download

from falcon.

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.