Class: IntervalResponse::ToRackResponseTriplet::RackBodyWrapper

Inherits:
Object
  • Object
show all
Defined in:
lib/interval_response/to_rack_response_triplet.rb

Instance Method Summary collapse

Constructor Details

#initialize(with_interval_response, chunk_size:) ⇒ RackBodyWrapper

Returns a new instance of RackBodyWrapper.



5
6
7
8
# File 'lib/interval_response/to_rack_response_triplet.rb', line 5

def initialize(with_interval_response, chunk_size:)
  @chunk_size = chunk_size
  @interval_response = with_interval_response
end

Instance Method Details

#eachObject



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/interval_response/to_rack_response_triplet.rb', line 10

def each
  buf = String.new(capacity: @chunk_size)
  @interval_response.each do |segment, range_in_segment|
    case segment
    when IntervalResponse::LazyFile
      segment.with do |_file_handle|
        with_each_chunk(range_in_segment) do |offset, read_n|
          segment.seek(offset, IO::SEEK_SET)
          yield segment.read_nonblock(read_n, buf)
        end
      end
    when String
      with_each_chunk(range_in_segment) do |offset, read_n|
        yield segment.slice(offset, read_n)
      end
    when IO, Tempfile
      with_each_chunk(range_in_segment) do |offset, read_n|
        segment.seek(offset, IO::SEEK_SET)
        yield segment.read_nonblock(read_n, buf)
      end
    else
      raise TypeError, "RackBodyWrapper only supports IOs or Strings"
    end
  end
ensure
  buf.clear
end

#with_each_chunk(range_in_segment) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/interval_response/to_rack_response_triplet.rb', line 38

def with_each_chunk(range_in_segment)
  range_size = range_in_segment.end - range_in_segment.begin + 1
  start_at_offset = range_in_segment.begin
  n_whole_segments, remainder = range_size.divmod(@chunk_size)

  n_whole_segments.times do |n|
    unit_offset = start_at_offset + (n * @chunk_size)
    yield unit_offset, @chunk_size
  end

  if remainder > 0
    unit_offset = start_at_offset + (n_whole_segments * @chunk_size)
    yield unit_offset, remainder
  end
end