2017-11-21 17:57:38 -08:00
|
|
|
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
|
|
|
|
|
2017-12-07 17:46:50 -08:00
|
|
|
def test_replay_range_on_redirect(self, fmod):
|
|
|
|
headers = [('Range', 'bytes=0-')]
|
|
|
|
resp = self.get('/pywb/2014{0}/http://www.iana.org/domains/example', fmod, headers=headers)
|
|
|
|
assert resp.headers['Location'].startswith('/pywb/2014{0}/'.format(fmod))
|
|
|
|
assert resp.status_code == 302
|
|
|
|
|
2017-11-21 17:57:38 -08:00
|
|
|
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'
|
|
|
|
|