mirror of
https://github.com/webrecorder/pywb.git
synced 2025-03-24 06:59:52 +01:00
urlrewrite: generalize support for overridable handle_custom_response() callback for handling modifiers (default support top-frame)
pass headers to add_custom_params, include error message on error if available headers: use add_header() to support multiple headers with same name is_ajax(): check for X-Pywb-Requested-With header to make as ajax and not pass to upstream
This commit is contained in:
parent
fa5d5e6bcc
commit
f4cc143dc7
@ -42,6 +42,9 @@ class RewriteInputRequest(DirectWSGIInputRequest):
|
|||||||
if cookie_val:
|
if cookie_val:
|
||||||
value = cookie_val
|
value = cookie_val
|
||||||
|
|
||||||
|
elif name == 'HTTP_X_PYWB_REQUESTED_WITH':
|
||||||
|
continue
|
||||||
|
|
||||||
elif name == 'HTTP_X_FORWARDED_PROTO':
|
elif name == 'HTTP_X_FORWARDED_PROTO':
|
||||||
name = 'X-Forwarded-Proto'
|
name = 'X-Forwarded-Proto'
|
||||||
value = self.splits.scheme
|
value = self.splits.scheme
|
||||||
|
@ -48,16 +48,9 @@ class RewriterApp(object):
|
|||||||
rel_prefix = self.get_rel_prefix()
|
rel_prefix = self.get_rel_prefix()
|
||||||
full_prefix = host_prefix + rel_prefix
|
full_prefix = host_prefix + rel_prefix
|
||||||
|
|
||||||
if self.framed_replay and wb_url.mod == self.frame_mod:
|
resp = self.handle_custom_response(wb_url, full_prefix, host_prefix, kwargs)
|
||||||
extra_params = self.get_top_frame_params(wb_url, kwargs)
|
if resp is not None:
|
||||||
return self.frame_insert_view.get_top_frame(wb_url,
|
return resp
|
||||||
full_prefix,
|
|
||||||
host_prefix,
|
|
||||||
request.environ,
|
|
||||||
self.frame_mod,
|
|
||||||
self.replay_mod,
|
|
||||||
coll='',
|
|
||||||
extra_params=extra_params)
|
|
||||||
|
|
||||||
urlrewriter = UrlRewriter(wb_url,
|
urlrewriter = UrlRewriter(wb_url,
|
||||||
prefix=full_prefix,
|
prefix=full_prefix,
|
||||||
@ -90,12 +83,19 @@ class RewriterApp(object):
|
|||||||
stream=True)
|
stream=True)
|
||||||
|
|
||||||
if r.status_code >= 400:
|
if r.status_code >= 400:
|
||||||
|
error = None
|
||||||
try:
|
try:
|
||||||
|
error = r.raw.read()
|
||||||
r.raw.close()
|
r.raw.close()
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
data = dict(url=url, args=kwargs)
|
if error:
|
||||||
|
error = error.decode('utf-8')
|
||||||
|
else:
|
||||||
|
error = ''
|
||||||
|
|
||||||
|
data = dict(url=url, args=kwargs, error=error)
|
||||||
raise HTTPError(r.status_code, exception=data)
|
raise HTTPError(r.status_code, exception=data)
|
||||||
|
|
||||||
record = self.loader.parse_record_stream(r.raw)
|
record = self.loader.parse_record_stream(r.raw)
|
||||||
@ -105,7 +105,7 @@ class RewriterApp(object):
|
|||||||
cdx['timestamp'] = http_date_to_timestamp(r.headers.get('Memento-Datetime'))
|
cdx['timestamp'] = http_date_to_timestamp(r.headers.get('Memento-Datetime'))
|
||||||
cdx['url'] = url
|
cdx['url'] = url
|
||||||
|
|
||||||
self._add_custom_params(cdx, kwargs)
|
self._add_custom_params(cdx, r.headers, kwargs)
|
||||||
|
|
||||||
if self.is_ajax():
|
if self.is_ajax():
|
||||||
head_insert_func = None
|
head_insert_func = None
|
||||||
@ -129,7 +129,7 @@ class RewriterApp(object):
|
|||||||
response.status = int(status_headers.get_statuscode())
|
response.status = int(status_headers.get_statuscode())
|
||||||
|
|
||||||
for n, v in status_headers.headers:
|
for n, v in status_headers.headers:
|
||||||
response.headers[n] = v
|
response.add_header(n, v)
|
||||||
|
|
||||||
return gen
|
return gen
|
||||||
|
|
||||||
@ -158,6 +158,7 @@ class RewriterApp(object):
|
|||||||
|
|
||||||
def is_ajax(self):
|
def is_ajax(self):
|
||||||
value = request.environ.get('HTTP_X_REQUESTED_WITH')
|
value = request.environ.get('HTTP_X_REQUESTED_WITH')
|
||||||
|
value = value or request.environ.get('HTTP_X_PYWB_REQUESTED_WITH')
|
||||||
if value and value.lower() == 'xmlhttprequest':
|
if value and value.lower() == 'xmlhttprequest':
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -166,9 +167,22 @@ class RewriterApp(object):
|
|||||||
def get_upstream_url(self, url, wb_url, closest, kwargs):
|
def get_upstream_url(self, url, wb_url, closest, kwargs):
|
||||||
raise NotImplemented()
|
raise NotImplemented()
|
||||||
|
|
||||||
def _add_custom_params(self, cdx, kwargs):
|
def _add_custom_params(self, cdx, headers, kwargs):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def get_top_frame_params(self, wb_url, kwargs):
|
def get_top_frame_params(self, wb_url, kwargs):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def handle_custom_response(self, wb_url, full_prefix, host_prefix, kwargs):
|
||||||
|
if self.framed_replay and wb_url.mod == self.frame_mod:
|
||||||
|
extra_params = self.get_top_frame_params(wb_url, kwargs)
|
||||||
|
return self.frame_insert_view.get_top_frame(wb_url,
|
||||||
|
full_prefix,
|
||||||
|
host_prefix,
|
||||||
|
request.environ,
|
||||||
|
self.frame_mod,
|
||||||
|
self.replay_mod,
|
||||||
|
coll='',
|
||||||
|
extra_params=extra_params)
|
||||||
|
|
||||||
|
return None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user