Sha256: 51e8986b22aa9220471a4f25c27eead8aec9f6a55f29c326602a73170d4115eb
Contents?: true
Size: 1.63 KB
Versions: 13
Compression:
Stored size: 1.63 KB
Contents
#!/usr/bin/env falcon --verbose serve -c require 'rack' def bottles(n) n == 1 ? "#{n} bottle" : "#{n} bottles" end # Browsers don't show streaming content until a certain threshold has been met. For most browers, it's about 1024 bytes. So, we have a comment of about that length which we feed to the client before streaming actual content. For more details see https://stackoverflow.com/questions/16909227 COMMENT = "<!--#{'-' * 1024}-->" # To test this example with the curl command-line tool, you'll need to add the `--no-buffer` flag or set the COMMENT size to the required 4096 bytes in order for curl to start streaming. # curl http://localhost:9292/ --no-buffer run lambda {|env| task = Async::Task.current body = Async::HTTP::Body::Writable.new request = Rack::Request.new(env) count = (request.params['count'] || 99).to_i body.write("<!DOCTYPE html><html><head><title>#{count} Bottles of Beer</title></head><body>") task.async do |task| body.write(COMMENT) count.downto(1) do |i| task.annotate "bottles of beer #{i}" puts "#{bottles(i)} of beer on the wall..." body.write("<p>#{bottles(i)} of beer on the wall, ") task.sleep(0.1) body.write("#{bottles(i)} of beer, ") task.sleep(0.1) body.write("take one down and pass it around, ") task.sleep(0.1) body.write("#{bottles(i-1)} of beer on the wall.</p>") task.sleep(0.1) body.write("<script>var child; while (child = document.body.firstChild) child.remove();</script>") end body.write("</body></html>") rescue puts "Remote end closed connection: #{$!}" ensure body.close end [200, {'content-type' => 'text/html; charset=utf-8'}, body] }
Version data entries
13 entries across 13 versions & 1 rubygems