3804: Error editing description with markup due to unicode characters

msunde
david
david
May 17, 2015
What version are you running?
2.0.14

What's the URL of the page containing the problem?
http://review.aurea.local/r/1043/

What steps will reproduce the problem?
1. Edit the description of a review.
2. Click Okay to save changes.
3. The page just hangs there on the loading and there is an error in the logs.

What is the expected output? What do you see instead?
The description would be properly saved instead of keep spinning on the "Loading..."

What operating system are you using? What browser?
Amazon Linux

Please provide any additional information below.

There are a few other bugs related to encoding that have been logged: #3803, #3796
With different stack traces in the logs. The current stack trace:

2015-03-11 20:04:29,151 - ERROR -  - Exception thrown for user XXXX at http://review.XXXX/api/review-requests/1043/?api_format=json&force-text-type=html&include-text-t   ypes=raw

'ascii' codec can't decode byte 0xe2 in position 189: ordinal not in range(128). -- Note: Markdown only accepts unicode input!
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/Django-1.6.10-py2.6.egg/django/core/handlers/base.py", line 112, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python2.6/site-packages/Django-1.6.10-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.10-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.8.16-py2.6.egg/djblets/webapi/resources.py", line 498, in __call__
    request, method, view, api_format=api_format, *args, **kwargs)
  File "/usr/lib/python2.6/site-packages/Djblets-0.8.16-py2.6.egg/djblets/webapi/resources.py", line 569, in call_method_view
    return view(request, *args, **kwargs)
  File "/usr/lib/python2.6/site-packages/Djblets-0.8.16-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.8.16-py2.6.egg/djblets/webapi/decorators.py", line 117, in _call
    return view_func(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0.14-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.8.16-py2.6.egg/djblets/webapi/decorators.py", line 117, in _call
    return view_func(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/Djblets-0.8.16-py2.6.egg/djblets/webapi/decorators.py", line 138, in _checklogin
    return view_func(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/Djblets-0.8.16-py2.6.egg/djblets/webapi/decorators.py", line 117, in _call
    return view_func(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0.14-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.8.16-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.8.16-py2.6.egg/djblets/webapi/decorators.py", line 117, in _call
    return view_func(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/Djblets-0.8.16-py2.6.egg/djblets/webapi/resources.py", line 790, in get
    etag = self.get_etag(request, obj)
  File "/usr/lib/python2.6/site-packages/Djblets-0.8.16-py2.6.egg/djblets/webapi/resources.py", line 1275, in get_etag
    encode_etag=False)
  File "/usr/lib/python2.6/site-packages/Djblets-0.8.16-py2.6.egg/djblets/webapi/resources.py", line 1305, in generate_etag
    etag = repr(self.serialize_object(obj, request=request, *kwargs))
  File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0.14-py2.6.egg/reviewboard/webapi/mixins.py", line 92, in serialize_object
    field, force_text_type, getter)
  File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0.14-py2.6.egg/reviewboard/webapi/mixins.py", line 141, in _serialize_text_info
    value, field_is_rich_text, force_text_type)
  File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0.14-py2.6.egg/reviewboard/webapi/mixins.py", line 226, in _normalize_text
    text = render_markdown(text)
  File "/usr/lib/python2.6/site-packages/ReviewBoard-2.0.14-py2.6.egg/reviewboard/reviews/markdown_utils.py", line 322, in render_markdown
    return markdown(text, **MARKDOWN_KWARGS)
  File "/usr/lib/python2.6/site-packages/markdown/__init__.py", line 411, in markdown
    return md.convert(text)
  File "/usr/lib/python2.6/site-packages/markdown/__init__.py", line 279, in convert
    source = util.text_type(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 189: ordinal not in range(128). -- Note: Markdown only accepts unicode input!
#1 msunde
This is preventing reviews from being discarded.

Thanks
#2 Chester.********@gmai***** (Google Code) (Is this you? Claim this profile.)
Have you tried this on other os? I could not reproduce this issue.
#3 msunde
The review board server is running on Amazon Linux. It is a windows client that is accessing the UI. The machine that created the review initially was probably in France so a different local. I also tried deleting it from my windows machine (Canada), but there is something in the review that is preventing it.

Let me know if there are debug lines that I could add to help track it down. I have logged a few different issues related to character encoding and capturing the various stack traces that I see in the logs.

Thanks for looking at this.
david
#4 david
  • +PendingReview
  • +Component-API
    +Project-ReviewBoard
  • +david
david
#5 david
Fixed in release-2.0.x (354070b). This will ship in 2.0.16. Thanks!
  • -PendingReview
    +Fixed