Status: New
Owner: ----
Labels: Type-Defect Priority-Medium

New issue 3324 by h.ka...@co-nss.co.jp: UnicodeEncodeError exception happens on input non-ASCII code to Groups: or Peoples: of review request.
http://code.google.com/p/reviewboard/issues/detail?id=3324

*** READ THIS BEFORE POSTING!
***
*** You must complete this form in its entirety, or your bug report will be
rejected.
***
*** For customer support, please post to reviewbo...@googlegroups.com
***
*** If you have a patch, please submit it to
http://reviews.reviewboard.org/
***
*** Do not post confidential information in this bug report!


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&timestamp=1399103170394&fullname=1',
 'REMOTE_ADDR': <PC-ADDRESS>,
 'REMOTE_PORT': '49601',
 'REQUEST_METHOD': 'GET',
 'REQUEST_URI': 
'/review/api/users/?q=%E3%81%8B&limit=150&timestamp=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.


--
You received this message because this project is configured to send all issue notifications to this address.
You may adjust your notification preferences at:
https://code.google.com/hosting/settings

--
You received this message because you are subscribed to the Google Groups 
"reviewboard-issues" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to reviewboard-issues+unsubscr...@googlegroups.com.
To post to this group, send email to reviewboard-issues@googlegroups.com.
Visit this group at http://groups.google.com/group/reviewboard-issues.
For more options, visit https://groups.google.com/d/optout.

Reply via email to