Class: Dassets::Server::Response::Body

Inherits:
Object
  • Object
show all
Defined in:
lib/dassets/server/response.rb

Constant Summary collapse

CHUNK_SIZE =

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.

(8*1024).freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(env, asset_file) ⇒ Body

Returns a new instance of Body.



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/dassets/server/response.rb', line 48

def initialize(env, asset_file)
  @asset_file = asset_file

  content_size = @asset_file.size
  ranges = Rack::Utils.byte_ranges(env, content_size)
  if ranges.nil? || ranges.empty? || ranges.length > 1
    # No ranges or multiple ranges are not supported
    @range         = 0..content_size-1
    @content_range = nil
  else
    # single range
    @range         = ranges[0]
    @content_range = "bytes #{@range.begin}-#{@range.end}/#{content_size}"
  end

  @size = self.range_end - self.range_begin + 1
end

Instance Attribute Details

#asset_fileObject (readonly)

Returns the value of attribute asset_file.



46
47
48
# File 'lib/dassets/server/response.rb', line 46

def asset_file
  @asset_file
end

#content_rangeObject (readonly)

Returns the value of attribute content_range.



46
47
48
# File 'lib/dassets/server/response.rb', line 46

def content_range
  @content_range
end

#sizeObject (readonly)

Returns the value of attribute size.



46
47
48
# File 'lib/dassets/server/response.rb', line 46

def size
  @size
end

Instance Method Details

#==(other_body) ⇒ Object



93
94
95
96
97
# File 'lib/dassets/server/response.rb', line 93

def ==(other_body)
  self.asset_file  == other_body.asset_file  &&
  self.range_begin == other_body.range_begin &&
  self.range_end   == other_body.range_end
end

#eachObject



73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/dassets/server/response.rb', line 73

def each
  StringIO.open(@asset_file.content, "rb") do |io|
    io.seek(@range.begin)
    remaining_len = self.size
    while remaining_len > 0
      part = io.read([CHUNK_SIZE, remaining_len].min)
      break if part.nil?

      remaining_len -= part.length
      yield part
    end
  end
end

#inspectObject



87
88
89
90
91
# File 'lib/dassets/server/response.rb', line 87

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}>"
end

#partial?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/dassets/server/response.rb', line 66

def partial?
  !@content_range.nil?
end

#range_beginObject



70
# File 'lib/dassets/server/response.rb', line 70

def range_begin; @range.begin; end

#range_endObject



71
# File 'lib/dassets/server/response.rb', line 71

def range_end;   @range.end;   end