Class: Harbor::BlockIO

Inherits:
Object
  • Object
show all
Defined in:
lib/harbor/block_io.rb

Overview

Used by Harbor::Response#send_file and Harbor::Response#stream_file to send large files or streams in chunks. This is a fallback measure for the cases where X-Sendfile cannot be used.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path_or_io) ⇒ BlockIO

Returns a new instance of BlockIO.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/harbor/block_io.rb', line 18

def initialize(path_or_io)
  case path_or_io
  when ::IO
    @io = path_or_io
    @size = @io.stat.size
  when StringIO
    @io = path_or_io
    @size = @io.size
  when Harbor::FileStore::File
    @io = path_or_io
    @size = @io.size
    @path = path_or_io.absolute_path
  when Pathname
    @path = path_or_io.expand_path.to_s
    @io = path_or_io.open('r')
    @size = path_or_io.size
  else
    @path = path_or_io.to_s
    @io = ::File::open(@path, 'r')
    @size = ::File.size(@path)
  end
end

Class Method Details

.block_sizeObject



9
10
11
# File 'lib/harbor/block_io.rb', line 9

def self.block_size
  @@block_size ||= 500_000 # 500kb
end

.block_size=(value) ⇒ Object

Raises:

  • (ArgumentError)


13
14
15
16
# File 'lib/harbor/block_io.rb', line 13

def self.block_size=(value)
  raise ArgumentError.new("Harbor::BlockIO::block_size value must be a Fixnum") unless value.is_a?(Fixnum)
  @@block_size = value
end

Instance Method Details

#closeObject



53
54
55
# File 'lib/harbor/block_io.rb', line 53

def close
  @io.close
end

#eachObject



57
58
59
60
61
# File 'lib/harbor/block_io.rb', line 57

def each
  while data = @io.read(Harbor::BlockIO::block_size) do
    yield data
  end
end

#pathObject



41
42
43
# File 'lib/harbor/block_io.rb', line 41

def path
  @path
end

#sizeObject



49
50
51
# File 'lib/harbor/block_io.rb', line 49

def size
  @size
end

#to_sObject



45
46
47
# File 'lib/harbor/block_io.rb', line 45

def to_s
  @io.read
end