Comments (4)
@pschrammel I'm adding a fully working example here: socketry/async-examples#14
from falcon.
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.
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.
The full working example is here: https://github.com/socketry/async-examples/tree/main/rails-streaming-download
from falcon.
Related Issues (20)
- The problem with io-event update to 1.3.0 HOT 7
- Limiting incoming requests queue HOT 3
- Sinatra - cannot load such file -- sinatra/base HOT 2
- Concurrent Database Transaction worries HOT 2
- Getting a Errno::EPIPE: Broken pipe warning HOT 11
- Socket::ResolutionError: getnameinfo: Temporary failure in name resolution HOT 10
- Should the 'virtual' command be changing the Console.logger log level? HOT 4
- Plugin `:tmp_restart` HOT 2
- Falcon not working properly locally on MacOS (m1) in forked mode HOT 18
- Production ready? HOT 1
- How to install? HOT 4
- Falcon 0.44 broken when used with Rack 2 HOT 7
- Falcon no longer respects count, new likely increases memory usage on shared hosts HOT 8
- Core methods doesn't work in configuration block after upgrading Falcon to 0.44 HOT 1
- async-io still in use HOT 3
- `falcon proxy` prints an exception if no `paths` are given
- Cleartext HTTP/2 connections HOT 6
- LocalJumpError after migration to 0.45.1 HOT 3
- pause/resume for tasks HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from falcon.