mirror of
https://github.com/webrecorder/pywb.git
synced 2025-03-24 06:59:52 +01:00
rewrite: disable refer-redirect in case of POST, handle request w/o redirect
(can't use 307 because of FF)
This commit is contained in:
parent
dfef05a74d
commit
0d3f663ef1
@ -2,6 +2,7 @@ import urlparse
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from pywb.rewrite.url_rewriter import UrlRewriter
|
from pywb.rewrite.url_rewriter import UrlRewriter
|
||||||
|
from pywb.rewrite.wburl import WbUrl
|
||||||
from wbrequestresponse import WbRequest, WbResponse
|
from wbrequestresponse import WbRequest, WbResponse
|
||||||
|
|
||||||
|
|
||||||
@ -161,9 +162,13 @@ class ReferRedirect:
|
|||||||
|
|
||||||
path = path[len(app_path):]
|
path = path[len(app_path):]
|
||||||
|
|
||||||
|
ref_route = None
|
||||||
|
ref_request = None
|
||||||
|
|
||||||
for route in routes:
|
for route in routes:
|
||||||
ref_request = route.parse_request(env, False, request_uri=path)
|
ref_request = route.parse_request(env, False, request_uri=path)
|
||||||
if ref_request:
|
if ref_request:
|
||||||
|
ref_route = route
|
||||||
break
|
break
|
||||||
|
|
||||||
# must have matched one of the routes
|
# must have matched one of the routes
|
||||||
@ -186,10 +191,23 @@ class ReferRedirect:
|
|||||||
# 2013/path.html -> /path.html
|
# 2013/path.html -> /path.html
|
||||||
rel_request_uri = rel_request_uri[len(timestamp_path) - 1:]
|
rel_request_uri = rel_request_uri[len(timestamp_path) - 1:]
|
||||||
|
|
||||||
|
rewritten_url = rewriter.rewrite(rel_request_uri)
|
||||||
|
|
||||||
|
# if post, can't redirect as that would lost the post data
|
||||||
|
# (can't use 307 because FF will show confirmation warning)
|
||||||
|
if ref_request.method == 'POST':
|
||||||
|
new_wb_url = WbUrl(rewritten_url[len(rewriter.prefix):])
|
||||||
|
ref_request.wb_url.url = new_wb_url.url
|
||||||
|
|
||||||
|
print 'REL URI ', ref_request.wb_url.url
|
||||||
|
|
||||||
|
return ref_route.handler(ref_request)
|
||||||
|
|
||||||
|
|
||||||
final_url = urlparse.urlunsplit((ref_split.scheme,
|
final_url = urlparse.urlunsplit((ref_split.scheme,
|
||||||
ref_split.netloc,
|
ref_split.netloc,
|
||||||
rewriter.rewrite(rel_request_uri),
|
rewritten_url,
|
||||||
'',
|
'',
|
||||||
''))
|
''))
|
||||||
|
|
||||||
return WbResponse.redir_response(final_url, status='307 Temp Redirect')
|
return WbResponse.redir_response(final_url, status='302 Temp Redirect')
|
||||||
|
@ -188,12 +188,12 @@ class TestWb:
|
|||||||
|
|
||||||
# without timestamp
|
# without timestamp
|
||||||
resp = self.testapp.get('/_css/2013.1/screen.css', headers = [('Referer', 'http://localhost:8080/pywb/2014/http://iana.org/')])
|
resp = self.testapp.get('/_css/2013.1/screen.css', headers = [('Referer', 'http://localhost:8080/pywb/2014/http://iana.org/')])
|
||||||
assert resp.status_int == 307
|
assert resp.status_int == 302
|
||||||
assert resp.headers['Location'] == target, resp.headers['Location']
|
assert resp.headers['Location'] == target, resp.headers['Location']
|
||||||
|
|
||||||
# with timestamp
|
# with timestamp
|
||||||
resp = self.testapp.get('/2014/_css/2013.1/screen.css', headers = [('Referer', 'http://localhost:8080/pywb/2014/http://iana.org/')])
|
resp = self.testapp.get('/2014/_css/2013.1/screen.css', headers = [('Referer', 'http://localhost:8080/pywb/2014/http://iana.org/')])
|
||||||
assert resp.status_int == 307
|
assert resp.status_int == 302
|
||||||
assert resp.headers['Location'] == target, resp.headers['Location']
|
assert resp.headers['Location'] == target, resp.headers['Location']
|
||||||
|
|
||||||
|
|
||||||
@ -240,6 +240,14 @@ class TestWb:
|
|||||||
assert resp.status_int == 200
|
assert resp.status_int == 200
|
||||||
assert '"data": "^"' in resp.body
|
assert '"data": "^"' in resp.body
|
||||||
|
|
||||||
|
def test_post_redirect(self):
|
||||||
|
# post handled without redirect (since 307 not allowed)
|
||||||
|
resp = self.testapp.post('/post', {'foo': 'bar', 'test': 'abc'}, headers=[('Referer', 'http://localhost:8080/pywb/2014/http://httpbin.org/post')])
|
||||||
|
assert resp.status_int == 200
|
||||||
|
assert '"foo": "bar"' in resp.body
|
||||||
|
assert '"test": "abc"' in resp.body
|
||||||
|
|
||||||
|
|
||||||
def test_excluded_content(self):
|
def test_excluded_content(self):
|
||||||
resp = self.testapp.get('/pywb/http://www.iana.org/_img/bookmark_icon.ico', status = 403)
|
resp = self.testapp.get('/pywb/http://www.iana.org/_img/bookmark_icon.ico', status = 403)
|
||||||
assert resp.status_int == 403
|
assert resp.status_int == 403
|
||||||
|
Loading…
x
Reference in New Issue
Block a user