Parent

Included Modules

EventMachine::FileStreamer

Constants

MappingThreshold

Use mapped streamer for files bigger than 16k

BackpressureLevel

Wait until next tick to send more data when 50k is still in the outgoing buffer

ChunkSize

Send 16k chunks at a time

Public Class Methods

new(connection, filename, args = {}) click to toggle source

Stream a file over a given connection. An optional :http_chunks => true argument will use HTTP 1.1 style chunked-encoding semantics.

 module FileSender
   def post_init
     streamer = EventMachine::FileStreamer.new(self, '/tmp/bigfile.tar')
     streamer.callback{
       # file was sent successfully
       close_connection_after_writing
     }
   end
 end
    # File lib/em/streamer.rb, line 51
51:     def initialize connection, filename, args = {}
52:       @connection = connection
53:       @http_chunks = args[:http_chunks]
54: 
55:       if File.exist?(filename)
56:         @size = File.size?(filename)
57:         if @size <= MappingThreshold
58:           stream_without_mapping filename
59:         else
60:           stream_with_mapping filename
61:         end
62:       else
63:         fail "file not found"
64:       end
65:     end

Public Instance Methods

stream_one_chunk() click to toggle source

Used internally to stream one chunk at a time over multiple reactor ticks

     # File lib/em/streamer.rb, line 89
 89:     def stream_one_chunk
 90:       loop {
 91:         if @position < @size
 92:           if @connection.get_outbound_data_size > BackpressureLevel
 93:             EventMachine::next_tick {stream_one_chunk}
 94:             break
 95:           else
 96:             len = @size - @position
 97:             len = ChunkSize if (len > ChunkSize)
 98: 
 99:             @connection.send_data( "#{len.to_s(16)}\r\n" ) if @http_chunks
100:             @connection.send_data( @mapping.get_chunk( @position, len ))
101:             @connection.send_data("\r\n") if @http_chunks
102: 
103:             @position += len
104:           end
105:         else
106:           @connection.send_data "0\r\n\r\n" if @http_chunks
107:           @mapping.close
108:           succeed
109:           break
110:         end
111:       }
112:     end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.