Class: Wsv::RangeRequest

Inherits:
Object
  • Object
show all
Defined in:
lib/wsv/range_request.rb

Overview

Parses an HTTP ‘Range` header (RFC 7233) against a known file size.

Defined Under Namespace

Classes: Result

Constant Summary collapse

PATTERN =
/\Abytes=(\d+)?-(\d+)?\z/

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(header_value, file_size) ⇒ RangeRequest

Returns a new instance of RangeRequest.



45
46
47
48
# File 'lib/wsv/range_request.rb', line 45

def initialize(header_value, file_size)
  @header_value = header_value
  @file_size = file_size
end

Class Method Details

.parse(header_value, file_size) ⇒ Object



41
42
43
# File 'lib/wsv/range_request.rb', line 41

def self.parse(header_value, file_size)
  new(header_value, file_size).parse
end

Instance Method Details

#parseObject



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/wsv/range_request.rb', line 50

def parse
  return Result.full if @header_value.nil? || @header_value.empty?

  match = @header_value.match(PATTERN)
  # Per RFC 7233, an unparseable Range is treated as if absent: return
  # full so the caller serves a normal 200 instead of 416.
  return Result.full unless match

  first, last = match.captures
  if first.nil? && last.nil?
    Result.full
  elsif first.nil?
    suffix_range(last.to_i)
  elsif last.nil?
    open_range(first.to_i)
  else
    bounded_range(first.to_i, last.to_i)
  end
end