diff --git a/CHANGES b/CHANGES index 2012c976a..9abad5e81 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,8 @@ Version 0.8.2 - The routing request redirect exception's code attribute is now used properly. - Fixed a bug with shutdowns on Windows. +- Fixed a few unicode issues with non-ascii characters being + hardcoded in URL rules. Version 0.8.1 ------------- diff --git a/werkzeug/routing.py b/werkzeug/routing.py index 4ea0531f6..7b11b1401 100644 --- a/werkzeug/routing.py +++ b/werkzeug/routing.py @@ -715,7 +715,7 @@ def build(self, values, append_unknown=True): return processed.add(data) else: - add(data) + add(url_quote(data, self.map.charset, safe='/:|')) domain_part, url = (u''.join(tmp)).split('|', 1) if append_unknown: @@ -1121,6 +1121,8 @@ def bind(self, server_name, script_name=None, subdomain=None, subdomain = self.default_subdomain if script_name is None: script_name = '/' + if isinstance(server_name, unicode): + server_name = server_name.encode('idna') return MapAdapter(self, server_name, script_name, subdomain, url_scheme, path_info, default_method, query_args) diff --git a/werkzeug/testsuite/routing.py b/werkzeug/testsuite/routing.py index db2adba63..de3d8bfbf 100644 --- a/werkzeug/testsuite/routing.py +++ b/werkzeug/testsuite/routing.py @@ -609,6 +609,23 @@ def test_redirect_request_exception_code(self): env = create_environ() self.assert_equal(exc.get_response(env).status_code, exc.code) + def test_unicode_rules(self): + m = r.Map([ + r.Rule(u'/войти/', endpoint='enter') + ]) + a = m.bind(u'☃.example.com') + try: + a.match(u'/войти') + except r.RequestRedirect, e: + self.assert_equal(e.new_url, 'http://xn--n3h.example.com/' + '%D0%B2%D0%BE%D0%B9%D1%82%D0%B8/') + endpoint, values = a.match(u'/войти/') + self.assert_equal(endpoint, 'enter') + self.assert_equal(values, {}) + + url = a.build('enter', {}, force_external=True) + self.assert_equal(url, 'http://xn--n3h.example.com/%D0%B2%D0%BE%D0%B9%D1%82%D0%B8/') + def suite(): suite = unittest.TestSuite()