[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

streaming with webrick

Ry

4/1/2007 1:19:00 AM

Can someone explain to me why the following serverlet doesn't stream
Hellos.

require 'webrick'

class Streamlet < WEBrick::HTTPServlet::AbstractServlet
def do_GET(req, res)
res["content-type"] = "text/plain"
r, w = IO.pipe
res.body = r
res.chunked = true

Thread.new do
5.times do |i|
w.write("hello #{i}\n")
sleep(1)
end
w.close
end
end
end

@server = WEBrick::HTTPServer.new(:Port => 4711)
@server.mount("/stream", Streamlet)

trap("INT") { @server.shutdown }
@server.start

Thank you.

2 Answers

Eric Hodel

4/1/2007 5:37:00 AM

0

On Mar 31, 2007, at 18:20, Ry wrote:

> Can someone explain to me why the following serverlet doesn't stream
> Hellos.
>
> require 'webrick'
>
> class Streamlet < WEBrick::HTTPServlet::AbstractServlet
> def do_GET(req, res)
> res["content-type"] = "text/plain"
> r, w = IO.pipe
> res.body = r
> res.chunked = true
>
> Thread.new do
> 5.times do |i|

I believe that 5 isn't enough hellos to fill up a chunk. Changing
this to loop do ... end causes webrick to give you infinite hellos.

> w.write("hello #{i}\n")
> sleep(1)
> end
> w.close
> end
> end
> end
>
> @server = WEBrick::HTTPServer.new(:Port => 4711)
> @server.mount("/stream", Streamlet)
>
> trap("INT") { @server.shutdown }
> @server.start
>
> Thank you.
>


Ry

4/1/2007 2:54:00 PM

0

> I believe that 5 isn't enough hellos to fill up a chunk. Changing
> this to loop do ... end causes webrick to give you infinite hellos.

Looking at the webrick's code in httpresponse.rb

261 while buf = @body.read(BUFSIZE)
262 next if buf.empty?
263 data = ""
264 data << format("%x", buf.size) << CRLF
265 data << buf << CRLF

The servlet reaches line 261 immediately but hangs for 5 seconds
before getting to line 262. If the IO.pipe only has a bit of data in
it, it seems like @body.read(BUFSIZE) should only return what is in
there and not wait for BUFSIZE.

Is there a way to avoid this behavior?


Thanks,
ry