Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions lib/net/http/header.rb
Original file line number Diff line number Diff line change
Expand Up @@ -539,7 +539,9 @@ def range
end

byte_range_set = $1
result = byte_range_set.split(/,/).map {|spec|
suffix_range = false
result = byte_range_set.split(/,/).filter_map {|spec|
next if spec.strip.empty?
m = /(\d+)?\s*-\s*(\d+)?/i.match(spec) or
raise Net::HTTPHeaderSyntaxError, "invalid byte-range-spec: '#{spec}'"
d1 = m[1].to_i
Expand All @@ -552,6 +554,7 @@ def range
elsif m[1]
d1..-1
elsif m[2]
suffix_range = true
-d2..-1
else
raise Net::HTTPHeaderSyntaxError, 'range is not specified'
Expand All @@ -560,7 +563,7 @@ def range
# if result.empty?
# byte-range-set must include at least one byte-range-spec or suffix-byte-range-spec
# but above regexp already denies it.
if result.size == 1 && result[0].begin == 0 && result[0].end == -1
if result.size == 1 && suffix_range && result[0].begin == 0 && result[0].end == -1
raise Net::HTTPHeaderSyntaxError, 'only one suffix-byte-range-spec with zero suffix-length'
end
result
Expand Down Expand Up @@ -604,9 +607,12 @@ def set_range(r, e = nil)
when Range
first = r.first
last = r.end
last -= 1 if r.exclude_end?
if r.exclude_end?
raise Net::HTTPHeaderSyntaxError, 'range is empty' if first == last
last -= 1
end
if last == -1
rangestr = (first > 0 ? "#{first}-" : "-#{-first}")
rangestr = (first >= 0 ? "#{first}-" : "-#{-first}")
else
raise Net::HTTPHeaderSyntaxError, 'range.first is negative' if first < 0
raise Net::HTTPHeaderSyntaxError, 'range.last is negative' if last < 0
Expand Down