class Rack::Files::BaseIterator

Attributes

options[R]
path[R]
ranges[R]

Public Class Methods

new(path, ranges, options) click to toggle source
# File lib/rack/files.rb, line 125
def initialize(path, ranges, options)
  @path = path
  @ranges = ranges
  @options = options
end

Public Instance Methods

bytesize() click to toggle source
# File lib/rack/files.rb, line 145
def bytesize
  size = ranges.inject(0) do |sum, range|
    sum += multipart_heading(range).bytesize if multipart?
    sum += range.size
  end
  size += "\r\n--#{MULTIPART_BOUNDARY}--\r\n".bytesize if multipart?
  size
end
close() click to toggle source
# File lib/rack/files.rb, line 154
def close; end
each() { |multipart_heading(range)| ... } click to toggle source
# File lib/rack/files.rb, line 131
def each
  ::File.open(path, "rb") do |file|
    ranges.each do |range|
      yield multipart_heading(range) if multipart?

      each_range_part(file, range) do |part|
        yield part
      end
    end

    yield "\r\n--#{MULTIPART_BOUNDARY}--\r\n" if multipart?
  end
end

Private Instance Methods

each_range_part(file, range) { |part| ... } click to toggle source
# File lib/rack/files.rb, line 172
def each_range_part(file, range)
  file.seek(range.begin)
  remaining_len = range.end - range.begin + 1
  while remaining_len > 0
    part = file.read([8192, remaining_len].min)
    break unless part
    remaining_len -= part.length

    yield part
  end
end
multipart?() click to toggle source
# File lib/rack/files.rb, line 158
def multipart?
  ranges.size > 1
end
multipart_heading(range) click to toggle source
# File lib/rack/files.rb, line 162
      def multipart_heading(range)
<<-EOF
\r
--#{MULTIPART_BOUNDARY}\r
Content-Type: #{options[:mime_type]}\r
Content-Range: bytes #{range.begin}-#{range.end}/#{options[:size]}\r
\r
EOF
      end