Browse Source

Fixed #20108 -- Fixed filepath_to_uri decoding error

This was a regression due to unicode_literals usage. Thanks Ivan
Virabyan for the report and the initial patch.
Claude Paroz 12 years ago
parent
commit
164528acc8
2 changed files with 8 additions and 2 deletions
  1. 1 1
      django/utils/encoding.py
  2. 7 1
      tests/utils_tests/encoding.py

+ 1 - 1
django/utils/encoding.py

@@ -234,7 +234,7 @@ def filepath_to_uri(path):
         return path
     # I know about `os.sep` and `os.altsep` but I want to leave
     # some flexibility for hardcoding separators.
-    return quote(force_bytes(path.replace("\\", "/")), safe=b"/~!*()'")
+    return quote(force_bytes(path).replace(b"\\", b"/"), safe=b"/~!*()'")
 
 def get_system_encoding():
     """

+ 7 - 1
tests/utils_tests/encoding.py

@@ -2,7 +2,7 @@
 from __future__ import unicode_literals
 
 from django.utils import unittest
-from django.utils.encoding import force_bytes
+from django.utils.encoding import force_bytes, filepath_to_uri
 
 
 class TestEncodingUtils(unittest.TestCase):
@@ -15,3 +15,9 @@ class TestEncodingUtils(unittest.TestCase):
         exc = ValueError(error_msg)
         result = force_bytes(exc)
         self.assertEqual(result, error_msg.encode('utf-8'))
+
+    def test_filepath_to_uri(self):
+        self.assertEqual(filepath_to_uri('upload\\чубака.mp4'),
+            'upload/%D1%87%D1%83%D0%B1%D0%B0%D0%BA%D0%B0.mp4')
+        self.assertEqual(filepath_to_uri('upload\\чубака.mp4'.encode('utf-8')),
+            'upload/%D1%87%D1%83%D0%B1%D0%B0%D0%BA%D0%B0.mp4')