1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-22 22:32:19 +01:00
pywb/tests/test_range.py
Ilya Kreymer ae56514c03
range request fixes: (#266)
- fully support range requests on frontend, if range request reaches pywb
- add OffsetLimitReader() to skip offset and limit read
- disbale rewriting for range requests
- serve 416 if range outside of content-length
- tests: add tests for range request handling
dockerignore: add collections/
2017-11-21 17:57:38 -08:00

79 lines
2.9 KiB
Python

from .base_config_test import BaseConfigTest, fmod
from pywb.warcserver.warcserver import BaseWarcServer
from mock import patch
orig_call = BaseWarcServer.__call__
# ============================================================================
def mock_call(self, environ, start_response):
TestReplayRange.recorder_skip = environ.get('HTTP_RECORDER_SKIP')
return orig_call(self, environ, start_response)
# ============================================================================
@patch('pywb.warcserver.basewarcserver.BaseWarcServer.__call__', mock_call)
class TestReplayRange(BaseConfigTest):
recorder_skip = None
recorder_range = None
@classmethod
def setup_class(cls):
super(TestReplayRange, cls).setup_class('config_test.yaml')
def test_replay_range_start_end(self, fmod):
headers = [('Range', 'bytes=0-200')]
resp = self.get('/pywb/20140127171250{0}/http://example.com/', fmod, headers=headers)
assert resp.status_int == 206
assert resp.headers['Accept-Ranges'] == 'bytes'
assert resp.headers['Content-Range'] == 'bytes 0-200/1270', resp.headers['Content-Range']
assert resp.content_length == 201, resp.content_length
assert self.recorder_skip == None
assert 'wombat.js' not in resp.text
def test_replay_range_start_end_2(self, fmod):
headers = [('Range', 'bytes=10-200')]
resp = self.get('/pywb/20140127171250{0}/http://example.com/', fmod, headers=headers)
assert resp.status_int == 206
assert resp.headers['Accept-Ranges'] == 'bytes'
assert resp.headers['Content-Range'] == 'bytes 10-200/1270', resp.headers['Content-Range']
assert resp.content_length == 191, resp.content_length
assert self.recorder_skip == '1'
assert 'wombat.js' not in resp.text
def test_replay_range_start_only(self, fmod):
headers = [('Range', 'bytes=0-')]
resp = self.get('/pywb/20140127171250{0}/http://example.com/', fmod, headers=headers)
assert resp.status_int == 206
assert resp.headers['Accept-Ranges'] == 'bytes'
assert resp.headers['Content-Range'] == 'bytes 0-1269/1270', resp.headers['Content-Range']
assert resp.content_length == 1270, resp.content_length
assert self.recorder_skip == None
assert 'wombat.js' not in resp.text
def test_error_range_out_of_bounds_1(self, fmod):
headers = [('Range', 'bytes=10-2000')]
resp = self.get('/pywb/20140127171251{0}/http://example.com/', fmod, headers=headers, status=416)
assert resp.status_int == 416
assert self.recorder_skip == '1'
def test_error_range_out_of_bounds_2(self, fmod):
headers = [('Range', 'bytes=2000-10')]
resp = self.get('/pywb/20140127171251{0}/http://example.com/', fmod, headers=headers, status=416)
assert resp.status_int == 416
assert self.recorder_skip == '1'