class Sinatra::Helpers::StaticFile
:nodoc:
generated iteratively in 8K chunks.
Rack response body used to deliver static files. The file contents are
def byte_ranges(env, size)
TODO: Copied from the new method Rack::Utils::byte_ranges; this method can be removed once
def byte_ranges(env, size) # See <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35> http_range = env['HTTP_RANGE'] return nil unless http_range ranges = [] http_range.split(/,\s*/).each do |range_spec| matches = range_spec.match(/bytes=(\d*)-(\d*)/) return nil unless matches r0,r1 = matches[1], matches[2] if r0.empty? return nil if r1.empty? # suffix-byte-range-spec, represents trailing suffix of file r0 = [size - r1.to_i, 0].max r1 = size - 1 else r0 = r0.to_i if r1.empty? r1 = size - 1 else r1 = r1.to_i return nil if r1 < r0 # backwards range is syntactically invalid r1 = size-1 if r1 >= size end end ranges << (r0..r1) if r0 <= r1 end ranges end
def each
def each if @range self.pos = @range.begin length = @range.end - @range.begin + 1 while length > 0 && (buf = read([CHUNK_SIZE,length].min)) yield buf length -= buf.length end else rewind while buf = read(CHUNK_SIZE) yield buf end end end
def parse_ranges(env, size)
Checks for byte-ranges in the request and sets self.range appropriately.
def parse_ranges(env, size) #r = Rack::Utils::byte_ranges(env, size) # TODO: not available yet in released Rack r = byte_ranges(env, size) return false if r == [] # Unsatisfiable; report error @range = r[0] if r && r.length == 1 # Ignore multiple-range requests for now return true end