What version are you running?
* Review Board 2.0 RC2
* Django 1.6.3
* Djblets 0.8 RC1
What's the URL of the page containing the problem?
http://<SERVER-ADDRESS>/r/<ANY-NUMBER>/
What steps will reproduce the problem?
1. Create new review request
2. Input Non-ascii character to "Groups:" or "People:" of Reviewers for the created review request.
3. UnicodeEncodeError happens in Djblets-0.8rc1-py2.6.egg/djblets/util/http.py
What is the expected output? What do you see instead?
Search result of groups or users should be output, but nothing happens on the screen.
What operating system are you using? What browser?
Review board: CentOS 6.5
Web browser: Firefox 28.0 running on Windows 7 64bit Japanese
Please provide any additional information below.
Here is Traceback output when I input UNICODE character 0x304B (Japanese "か") to "people:" of Reviewers.
-------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/Django-1.6.3-py2.6.egg/django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.6/site-packages/Django-1.6.3-py2.6.egg/django/views/decorators/cache.py", line 52, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/Django-1.6.3-py2.6.egg/django/views/decorators/vary.py", line 19, in inner_func
response = func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/resources.py", line 451, in __call__
result = view(request, api_format=api_format, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 115, in _call
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0rc2-py2.6.egg/reviewboard/webapi/decorators.py", line 110, in _check
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 115, in _call
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 285, in _validate
return view_func(*args, **new_kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/util/decorators.py", line 78, in _call
f = augmented_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 115, in _call
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0rc2-py2.6.egg/reviewboard/webapi/decorators.py", line 31, in _check
return webapi_login_required(view_func)(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 115, in _call
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 136, in _checklogin
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 115, in _call
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0rc2-py2.6.egg/reviewboard/webapi/decorators.py", line 110, in _check
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 115, in _call
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 285, in _validate
return view_func(*args, **new_kwargs)
File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0rc2-py2.6.egg/reviewboard/webapi/base.py", line 75, in get_list
return self._get_list_impl(request, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0rc2-py2.6.egg/reviewboard/webapi/base.py", line 90, in _get_list_impl
return super(WebAPIResource, self).get_list(request, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/util/decorators.py", line 78, in _call
f = augmented_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 115, in _call
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 115, in _call
return view_func(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/decorators.py", line 285, in _validate
return view_func(*args, **new_kwargs)
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/resources.py", line 789, in get_list
**self.build_response_args(request))
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/webapi/core.py", line 354, in __init__
'start', 'max-results')
File "/usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/util/http.py", line 211, in get_url_params_except
if key not in params
File "/usr/lib64/python2.6/urllib.py", line 1281, in urlencode
v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u304b' in position 0: ordinal not in range(128)
<WSGIRequest
path:/review/api/users/,
GET:<QueryDict: {u'q': [u'\u304b'], u'timestamp': [u'1399103170394'], u'fullname': [u'1'], u'limit': [u'150']}>,
POST:<QueryDict: {}>,
COOKIES:{'_redmine_session': 'BAh7DEkiDHVzZXJfaWQGOgZFRmkJSSIKY3RpbWUGOwBGbCsHT55kU0kiCmF0aW1lBjsARmwrB2GeZFNJIg9zZXNzaW9uX2lkBjsARkkiJTViY2ZhNzYwNGZmNTBhY2NiNmFmMGY3YjU3YWYzZGFlBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMS82NWhoNEE3emY3emVVcjVtM21oUUsvUmlRcTZSQUhYUXFBN3VsdEFOV1U9BjsARkkiCnF1ZXJ5BjsARnsJOg9wcm9qZWN0X2lkaS86DGZpbHRlcnN7BkkiDnN0YXR1c19pZAY7AEZ7BzoNb3BlcmF0b3JJIgZvBjsARjoLdmFsdWVzWwZJIgAGOwBGOg1ncm91cF9ieTA6EWNvbHVtbl9uYW1lczBJIhZpc3N1ZXNfaW5kZXhfc29ydAY7AEZJIgxpZDpkZXNjBjsARg%3D%3D--eda2f9a7e941cffaa11dce8ae1f1d2b33a1cfad9',
'csrftoken': 'XMr5AujYQPIXEyUILR1WFPS6qT6caVqA',
'rbsessionid': 'evfygda95w0s53g6fzvvl1s3jebslbao'},
META:{'DOCUMENT_ROOT': '/var/www/html',
'GATEWAY_INTERFACE': 'CGI/1.1',
'HTTP_ACCEPT': '*/*',
'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
'HTTP_ACCEPT_LANGUAGE': 'ja,en-us;q=0.7,en;q=0.3',
'HTTP_CONNECTION': 'keep-alive',
'HTTP_COOKIE': 'rbsessionid=evfygda95w0s53g6fzvvl1s3jebslbao; csrftoken=XMr5AujYQPIXEyUILR1WFPS6qT6caVqA; _redmine_session=BAh7DEkiDHVzZXJfaWQGOgZFRmkJSSIKY3RpbWUGOwBGbCsHT55kU0kiCmF0aW1lBjsARmwrB2GeZFNJIg9zZXNzaW9uX2lkBjsARkkiJTViY2ZhNzYwNGZmNTBhY2NiNmFmMGY3YjU3YWYzZGFlBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMS82NWhoNEE3emY3emVVcjVtM21oUUsvUmlRcTZSQUhYUXFBN3VsdEFOV1U9BjsARkkiCnF1ZXJ5BjsARnsJOg9wcm9qZWN0X2lkaS86DGZpbHRlcnN7BkkiDnN0YXR1c19pZAY7AEZ7BzoNb3BlcmF0b3JJIgZvBjsARjoLdmFsdWVzWwZJIgAGOwBGOg1ncm91cF9ieTA6EWNvbHVtbl9uYW1lczBJIhZpc3N1ZXNfaW5kZXhfc29ydAY7AEZJIgxpZDpkZXNjBjsARg%3D%3D--eda2f9a7e941cffaa11dce8ae1f1d2b33a1cfad9',
'HTTP_HOST': '<SERVER-ADDRESS>',
'HTTP_REFERER': 'http://<SERVER-ADDRESS>/review/r/11/',
'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0',
'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest',
'PATH_INFO': u'/review/api/users/',
'PATH_TRANSLATED': '/var/lib/reviewboard/review/htdocs/reviewboard.wsgi/review/api/users/',
'QUERY_STRING': 'q=%E3%81%8B&limit=150×tamp=1399103170394&fullname=1',
'REMOTE_ADDR': <PC-ADDRESS>,
'REMOTE_PORT': '49601',
'REQUEST_METHOD': 'GET',
'REQUEST_URI': '/review/api/users/?q=%E3%81%8B&limit=150×tamp=1399103170394&fullname=1',
'SCRIPT_FILENAME': '/var/lib/reviewboard/review/htdocs/reviewboard.wsgi',
'SCRIPT_NAME': u'',
'SERVER_ADDR': <SERVER-ADDRESS>,
'SERVER_ADMIN': 'root@localhost',
'SERVER_NAME': <SERVER-ADDRESS>,
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.1',
'SERVER_SIGNATURE': '',
'SERVER_SOFTWARE': 'Apache',
'mod_ssl.is_https': <built-in method ssl_is_https of mod_wsgi.Adapter object at 0x7fc22b5fae40>,
'mod_ssl.var_lookup': <built-in method ssl_var_lookup of mod_wsgi.Adapter object at 0x7fc22b5fae40>,
'mod_wsgi.application_group': '<SERVER-ADDRESS>|',
'mod_wsgi.callable_object': 'application',
'mod_wsgi.handler_script': '',
'mod_wsgi.input_chunked': '0',
'mod_wsgi.listener_host': '',
'mod_wsgi.listener_port': '80',
'mod_wsgi.process_group': '',
'mod_wsgi.request_handler': 'wsgi-script',
'mod_wsgi.script_reloading': '1',
'mod_wsgi.version': (3, 2),
'wsgi.errors': <mod_wsgi.Log object at 0x7fc22b5d4bb0>,
'wsgi.file_wrapper': <built-in method file_wrapper of mod_wsgi.Adapter object at 0x7fc22b5fae40>,
'wsgi.input': <mod_wsgi.Input object at 0x7fc22b5d4fb0>,
'wsgi.multiprocess': True,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 1)}>
-------------------------------------------------------------
This exception happens because UNICODE string is used for urllib.urlencode().
After I modified in "djblets/util/http.py" of Djablets 0.8 RC1 below, Review Board works fine and no exception was thrown.
-------------------------------------------------------------
--- /usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/util/http.py.org 2014-04-20 04:20:31.198505851 +0900
+++ /usr/lib/python2.6/site-packages/Djblets-0.8rc1-py2.6.egg/djblets/util/http.py 2014-05-03 18:27:21.061581872 +0900
@@ -206,7 +206,7 @@
others.
"""
return urlencode([
- (key, value)
+ (key, value.encode('utf-8'))
for key, value in six.iteritems(query)
if key not in params
])
-------------------------------------------------------------
I have no idea whether encoding here is good implementation because I just started reading code of Review Board and Djblets.