fix and test path regexes

- require leading `/`
- match empty string
- disallow consecutive `//`

This means that path_regex should be included as `/api/whatever%s`, not `/api/whatever/%s`
This commit is contained in:
Min RK 2014-11-10 12:12:13 -08:00
parent 5c2ae3e92c
commit ba370731a5
2 changed files with 64 additions and 2 deletions

View File

@ -463,8 +463,9 @@ class FilesRedirectHandler(IPythonHandler):
# URL pattern fragments for re-use
#-----------------------------------------------------------------------------
path_regex = r"(?P<path>.*)"
notebook_path_regex = r"(?P<path>.+\.ipynb)"
# path matches any number of `/foo[/bar...]` or just `/` or ''
path_regex = r"(?P<path>(?:(?:/[^/]+)+|/?))"
notebook_path_regex = r"(?P<path>(?:/[^/]+)+\.ipynb)"
#-----------------------------------------------------------------------------
# URL to handler mappings

View File

@ -0,0 +1,61 @@
import re
import nose.tools as nt
from IPython.html.base.handlers import path_regex, notebook_path_regex
try: # py3
assert_regex = nt.assert_regex
assert_not_regex = nt.assert_not_regex
except AttributeError: # py2
assert_regex = nt.assert_regexp_matches
assert_not_regex = nt.assert_not_regexp_matches
# build regexps that tornado uses:
path_pat = re.compile('^' + '/x%s' % path_regex + '$')
nb_path_pat = re.compile('^' + '/y%s' % notebook_path_regex + '$')
def test_path_regex():
for path in (
'/x',
'/x/',
'/x/foo',
'/x/foo.ipynb',
'/x/foo/bar',
'/x/foo/bar.txt',
):
assert_regex(path, path_pat)
def test_path_regex_bad():
for path in (
'/xfoo',
'/xfoo/',
'/xfoo/bar',
'/xfoo/bar/',
'/x/foo/bar/',
'/x//foo',
'/y',
'/y/x/foo',
):
assert_not_regex(path, path_pat)
def test_notebook_path_regex():
for path in (
'/y/asdf.ipynb',
'/y/foo/bar.ipynb',
'/y/a/b/c/d/e.ipynb',
):
assert_regex(path, nb_path_pat)
def test_notebook_path_regex_bad():
for path in (
'/y',
'/y/',
'/y/.ipynb',
'/y/foo/.ipynb',
'/y/foo/bar',
'/yfoo.ipynb',
'/yfoo/bar.ipynb',
):
assert_not_regex(path, nb_path_pat)