Parent

Included Modules

Class/Module Index [+]

Quicksearch

EventMachine::FileStreamer

Streams a file over a given connection. Streaming begins once the object is instantiated. Typically FileStreamer instances are not reused.

Streaming uses buffering for files larger than 16K and uses so-called fast file reader (a C++ extension) if available (it is part of eventmachine gem itself).

@example

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

@author Francis Cianfrocca

Constants

BackpressureLevel

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

ChunkSize

Send 16k chunks at a time

MappingThreshold

Use mapped streamer for files bigger than 16k

Public Class Methods

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

@param [EventMachine::Connection] connection @param [String] filename File path

@option args [Boolean] :http_chunks (false) Use HTTP 1.1 style chunked-encoding semantics.

# File lib/em/streamer.rb, line 36
def initialize connection, filename, args = {}
  @connection = connection
  @http_chunks = args[:http_chunks]

  if File.exist?(filename)
    @size = File.size(filename)
    if @size <= MappingThreshold
      stream_without_mapping filename
    else
      stream_with_mapping filename
    end
  else
    fail "file not found"
  end
end

Public Instance Methods

stream_one_chunk() click to toggle source

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

# File lib/em/streamer.rb, line 77
def stream_one_chunk
  loop {
    if @position < @size
      if @connection.get_outbound_data_size > BackpressureLevel
        EventMachine::next_tick {stream_one_chunk}
        break
      else
        len = @size - @position
        len = ChunkSize if (len > ChunkSize)

        @connection.send_data( "#{len.to_s(16)}\r\n" ) if @http_chunks
        @connection.send_data( @mapping.get_chunk( @position, len ))
        @connection.send_data("\r\n") if @http_chunks

        @position += len
      end
    else
      @connection.send_data "0\r\n\r\n" if @http_chunks
      @mapping.close
      succeed
      break
    end
  }
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.