mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
New encode/decode_path_component functions
ASGI cannot differentiate between / and %2F in a URL, so we need an
alternative scheme for encoding the names of tables that contain special
characters such as /
For background, see
https://github.com/django/asgiref/issues/51#issuecomment-450603464
Some examples:
"table/and/slashes" => "tableU+002FandU+002Fslashes"
"~table" => "U+007Etable"
"+bobcats!" => "U+002Bbobcats!"
"U+007Etable" => "UU+002B007Etable"
This commit is contained in:
parent
bfa2ae0d16
commit
9fdb47ca95
2 changed files with 37 additions and 0 deletions
|
|
@ -261,6 +261,27 @@ def escape_sqlite(s):
|
||||||
return "[{}]".format(s)
|
return "[{}]".format(s)
|
||||||
|
|
||||||
|
|
||||||
|
_decode_path_component_re = re.compile(r"U\+([\da-h]{4})", re.IGNORECASE)
|
||||||
|
_encode_path_component_re = re.compile(
|
||||||
|
"[{}]".format(
|
||||||
|
"".join(
|
||||||
|
re.escape(c)
|
||||||
|
for c in (";", "/", "?", ":", "@", "&", "=", "+", "$", ",", "~")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def decode_path_component(table_name):
|
||||||
|
return _decode_path_component_re.sub(lambda m: chr(int(m.group(1), 16)), table_name)
|
||||||
|
|
||||||
|
|
||||||
|
def encode_path_component(table_name):
|
||||||
|
return _encode_path_component_re.sub(
|
||||||
|
lambda m: "U+{0:0{1}x}".format(ord(m.group(0)), 4).upper(), table_name
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def make_dockerfile(
|
def make_dockerfile(
|
||||||
files,
|
files,
|
||||||
metadata_file,
|
metadata_file,
|
||||||
|
|
|
||||||
|
|
@ -381,3 +381,19 @@ def test_path_with_format(path, format, extra_qs, expected):
|
||||||
)
|
)
|
||||||
def test_format_bytes(bytes, expected):
|
def test_format_bytes(bytes, expected):
|
||||||
assert expected == utils.format_bytes(bytes)
|
assert expected == utils.format_bytes(bytes)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"name,expected",
|
||||||
|
[
|
||||||
|
("table", "table"),
|
||||||
|
("table/and/slashes", "tableU+002FandU+002Fslashes"),
|
||||||
|
("~table", "U+007Etable"),
|
||||||
|
("+bobcats!", "U+002Bbobcats!"),
|
||||||
|
("U+007Etable", "UU+002B007Etable"),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_encode_decode_path_component(name, expected):
|
||||||
|
encoded = utils.encode_path_component(name)
|
||||||
|
assert encoded == expected
|
||||||
|
assert name == utils.decode_path_component(encoded)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue