lib/dassets/server/response.rb in dassets-0.15.0 vs lib/dassets/server/response.rb in dassets-0.15.1

- old
+ new

@@ -4,10 +4,11 @@ require "rack/utils" require "rack/mime" module Dassets; end class Dassets::Server; end + class Dassets::Server::Response attr_reader :asset_file, :status, :headers, :body def initialize(env, asset_file) @asset_file = asset_file @@ -28,17 +29,19 @@ else @asset_file.digest! body = Body.new(env, @asset_file) [ body.partial? ? 206 : 200, - Rack::Utils::HeaderHash.new.merge(@asset_file.response_headers).tap do |h| - h["Last-Modified"] = mtime.to_s - h["Content-Type"] = @asset_file.mime_type.to_s - h["Content-Length"] = body.size.to_s - h["Content-Range"] = body.content_range if body.partial? - end, - env["REQUEST_METHOD"] == "HEAD" ? [] : body + Rack::Utils::HeaderHash + .new + .merge(@asset_file.response_headers).tap do |h| + h["Last-Modified"] = mtime.to_s + h["Content-Type"] = @asset_file.mime_type.to_s + h["Content-Length"] = body.size.to_s + h["Content-Range"] = body.content_range if body.partial? + end, + env["REQUEST_METHOD"] == "HEAD" ? [] : body, ] end end def to_rack @@ -46,18 +49,18 @@ end # This class borrows from the body range handling in Rack::File and adapts # it for use with Dasset's asset files and their generic string content. class Body - CHUNK_SIZE = (8*1024).freeze # 8k + CHUNK_SIZE = (8 * 1024) # 8k attr_reader :asset_file, :size, :content_range def initialize(env, asset_file) @asset_file = asset_file @range, @content_range = get_range_info(env, @asset_file) - @size = self.range_end - self.range_begin + 1 + @size = range_end - range_begin + 1 end def partial? !@content_range.nil? end @@ -71,11 +74,11 @@ end def each StringIO.open(@asset_file.content, "rb") do |io| io.seek(@range.begin) - remaining_len = self.size + remaining_len = size while remaining_len > 0 part = io.read([CHUNK_SIZE, remaining_len].min) break if part.nil? remaining_len -= part.length @@ -83,38 +86,44 @@ end end end def inspect - "#<#{self.class}:#{"0x0%x" % (self.object_id << 1)} " \ - "digest_path=#{self.asset_file.digest_path} " \ - "range_begin=#{self.range_begin} range_end=#{self.range_end}>" + "#<#{self.class}:#{"0x0%x" % (object_id << 1)} " \ + "digest_path=#{asset_file.digest_path} " \ + "range_begin=#{range_begin} range_end=#{range_end}>" end - def ==(other_body) - if other_body.is_a?(self.class) - self.asset_file == other_body.asset_file && - self.range_begin == other_body.range_begin && - self.range_end == other_body.range_end + def ==(other) + if other.is_a?(self.class) + asset_file == other.asset_file && + range_begin == other.range_begin && + range_end == other.range_end else super end end private def get_range_info(env, asset_file) content_size = asset_file.size # legacy rack version, just return full size - return full_size_range_info(content_size) if !Rack::Utils.respond_to?(:byte_ranges) + unless Rack::Utils.respond_to?(:byte_ranges) + return full_size_range_info(content_size) + end + ranges = Rack::Utils.byte_ranges(env, content_size) # No ranges or multiple ranges are not supported, just return full size - return full_size_range_info(content_size) if ranges.nil? || ranges.empty? || ranges.length > 1 + if ranges.nil? || ranges.empty? || ranges.length > 1 + return full_size_range_info(content_size) + end + # single range [ranges[0], "bytes #{ranges[0].begin}-#{ranges[0].end}/#{content_size}"] end def full_size_range_info(content_size) - [(0..content_size-1), nil] + [(0..content_size - 1), nil] end end end