Skip to content

Commit 196f3d7

Browse files
authored
Merge pull request #63 from nobu/unknown-content-range-unit
Make `Net::HTTPHeader#content_range` return nil on non-byte units
2 parents 17c911f + 0b5030d commit 196f3d7

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

lib/net/http/header.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,10 @@ def chunked?
338338
# fits inside the full entity body, as range of byte offsets.
339339
def content_range
340340
return nil unless @header['content-range']
341-
m = %r<bytes\s+(\d+)-(\d+)/(\d+|\*)>i.match(self['Content-Range']) or
341+
m = %r<\A\s*(\w+)\s+(\d+)-(\d+)/(\d+|\*)>.match(self['Content-Range']) or
342342
raise Net::HTTPHeaderSyntaxError, 'wrong Content-Range format'
343-
m[1].to_i .. m[2].to_i
343+
return unless m[1] == 'bytes'
344+
m[2].to_i .. m[3].to_i
344345
end
345346

346347
# The length of the range represented in Content-Range: header.

test/net/http/test_httpheader.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,18 @@ def test_range=
308308
end
309309

310310
def test_content_range
311+
@c['Content-Range'] = "bytes 0-499/1000"
312+
assert_equal 0..499, @c.content_range
313+
@c['Content-Range'] = "bytes 1-500/1000"
314+
assert_equal 1..500, @c.content_range
315+
@c['Content-Range'] = "bytes 1-1/1000"
316+
assert_equal 1..1, @c.content_range
317+
@c['Content-Range'] = "tokens 1-1/1000"
318+
assert_equal nil, @c.content_range
319+
320+
try_invalid_content_range "invalid"
321+
try_invalid_content_range "bytes 123-abc"
322+
try_invalid_content_range "bytes abc-123"
311323
end
312324

313325
def test_range_length
@@ -317,6 +329,15 @@ def test_range_length
317329
assert_equal 500, @c.range_length
318330
@c['Content-Range'] = "bytes 1-1/1000"
319331
assert_equal 1, @c.range_length
332+
@c['Content-Range'] = "tokens 1-1/1000"
333+
assert_equal nil, @c.range_length
334+
335+
try_invalid_content_range "bytes 1-1/abc"
336+
end
337+
338+
def try_invalid_content_range(s)
339+
@c['Content-Range'] = "#{s}"
340+
assert_raise(Net::HTTPHeaderSyntaxError, s){ @c.content_range }
320341
end
321342

322343
def test_chunked?

0 commit comments

Comments
 (0)