1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-15 00:03:28 +01:00

proxy mode: replay improvements for content not captured via proxy mode (#520)

- if preflight OPTIONS request, respond directly (don't attempt OPTIONS capture lookup)
- if preflight CORS request, ensure response has appropriate CORS headers, even if not captured
- wombat: update to latest wombat with updated Date() fixed timezone in proxy mode
- bump version to 2.4.0rc3
This commit is contained in:
Ilya Kreymer 2019-11-12 12:41:04 -08:00 committed by GitHub
parent c7fdfe72a7
commit 30680803e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 41 additions and 7 deletions

View File

@ -326,6 +326,10 @@ class RewriterApp(object):
'pywb.static_prefix', '/static/')
is_proxy = ('wsgiprox.proxy_host' in environ)
# if OPTIONS in proxy mode, just generate the proxy responss
if is_proxy and self.is_preflight(environ):
return WbResponse.options_response(environ)
environ['pywb.host_prefix'] = host_prefix
if self.use_js_obj_proxy:
@ -551,6 +555,9 @@ class RewriterApp(object):
response = WbResponse(status_headers, gen)
if is_proxy and environ.get('HTTP_ORIGIN'):
response.add_access_control_headers(environ)
return response
def format_response(self, response, wb_url, full_prefix, is_timegate, is_proxy):
@ -817,6 +824,19 @@ class RewriterApp(object):
return False
def is_preflight(self, environ):
if environ.get('REQUEST_METHOD') != 'OPTIONS':
return False
if not environ.get('HTTP_ORIGIN'):
return False
if not environ.get('HTTP_ACCESS_CONTROL_REQUEST_METHOD') and not environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS'):
return False
return True
def get_base_url(self, wb_url, kwargs):
type_ = kwargs.get('type')
return self.paths[type_].format(**kwargs)

View File

@ -186,14 +186,14 @@ class WbResponse(object):
allowed_methods = allowed_methods + ', ' + r_method
acr_headers = env.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')
if acr_headers is not None:
self.status_headers.add_header('Access-Control-Allow-Headers', acr_headers)
self.status_headers.replace_header('Access-Control-Allow-Headers', acr_headers)
allowed_origin = env.get('HTTP_ORIGIN', env.get('HTTP_REFERER', allowed_origin))
if allowed_origin is None:
allowed_origin = '*'
self.status_headers.replace_header('Access-Control-Allow-Origin', allowed_origin)
self.status_headers.add_header('Access-Control-Allow-Methods', allowed_methods)
self.status_headers.add_header('Access-Control-Allow-Credentials', 'true')
self.status_headers.add_header('Access-Control-Max-Age', '1800')
self.status_headers.replace_header('Access-Control-Allow-Methods', allowed_methods)
self.status_headers.replace_header('Access-Control-Allow-Credentials', 'true')
self.status_headers.replace_header('Access-Control-Max-Age', '1800')
return self
def __repr__(self):

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
__version__ = '2.4.0rc0'
__version__ = '2.4.0rc3'
if __name__ == '__main__':
print(__version__)

View File

@ -83,6 +83,20 @@ class TestProxy(BaseTestProxy):
assert res.headers['Memento-Datetime'] == 'Mon, 27 Jan 2014 17:12:51 GMT'
assert 'Content-Location' not in res.headers
def test_proxy_replay_cors(self, scheme):
res = requests.get('{0}://example.com/'.format(scheme),
proxies=self.proxies,
verify=self.root_ca_file,
headers={'Origin': '{0}://api.example.com/'.format(scheme)})
assert 'Example Domain' in res.text
assert res.headers['Access-Control-Allow-Methods'] == 'GET, POST, PUT, OPTIONS, DELETE, PATCH, HEAD, TRACE, CONNECT'
assert res.headers['Access-Control-Allow-Credentials'] == 'true'
assert res.headers['Access-Control-Allow-Origin'] == '{0}://api.example.com/'.format(scheme)
assert 'Content-Location' not in res.headers
def test_proxy_replay_change_dt(self, scheme):
headers = {'Accept-Datetime': 'Mon, 26 Dec 2011 17:12:51 GMT'}
res = requests.get('{0}://example.com/'.format(scheme),

2
wombat

@ -1 +1 @@
Subproject commit 50ff6e3ed3afc2fd27f82bae4f5f20194f1bfc53
Subproject commit c3276154de61196c0c34d9f5f1242706d6e407b6