YCM client now sends utf-8 encoded JSON.

Previously, we'd just use json.dumps() to dump out JSON. By default,
ensure_ascii is set to true and non-ASCII chars are encoded as \uXXXX.

Problems seem to happen with other text in the data then not being utf8. I'm not
sure why, still can't repro. This should go away now that we explicitly build a
unicode string which we then encode as utf8.

Hopefully fixes #821.
This commit is contained in:
Strahinja Val Markovic 2014-03-19 13:16:49 -07:00
parent 36436d03b6
commit 2f051ee9f1
2 changed files with 8 additions and 3 deletions

View File

@ -18,13 +18,13 @@
# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. # along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>.
import vim import vim
import json
import requests import requests
import urlparse import urlparse
from retries import retries from retries import retries
from requests_futures.sessions import FuturesSession from requests_futures.sessions import FuturesSession
from ycm.unsafe_thread_pool_executor import UnsafeThreadPoolExecutor from ycm.unsafe_thread_pool_executor import UnsafeThreadPoolExecutor
from ycm import vimsupport from ycm import vimsupport
from ycm.utils import ToUtf8Json
from ycm.server.responses import ServerError, UnknownExtraConf from ycm.server.responses import ServerError, UnknownExtraConf
_HEADERS = {'content-type': 'application/json'} _HEADERS = {'content-type': 'application/json'}
@ -89,7 +89,7 @@ class BaseRequest( object ):
def SendRequest( data, handler, method, timeout ): def SendRequest( data, handler, method, timeout ):
if method == 'POST': if method == 'POST':
return BaseRequest.session.post( _BuildUri( handler ), return BaseRequest.session.post( _BuildUri( handler ),
data = json.dumps( data ), data = ToUtf8Json( data ),
headers = _HEADERS, headers = _HEADERS,
timeout = timeout ) timeout = timeout )
if method == 'GET': if method == 'GET':
@ -101,7 +101,7 @@ class BaseRequest( object ):
def DelayedSendRequest( data, handler, method ): def DelayedSendRequest( data, handler, method ):
if method == 'POST': if method == 'POST':
return requests.post( _BuildUri( handler ), return requests.post( _BuildUri( handler ),
data = json.dumps( data ), data = ToUtf8Json( data ),
headers = _HEADERS ) headers = _HEADERS )
if method == 'GET': if method == 'GET':
return requests.get( _BuildUri( handler ), return requests.get( _BuildUri( handler ),

View File

@ -24,6 +24,7 @@ import signal
import functools import functools
import socket import socket
import stat import stat
import json
from distutils.spawn import find_executable from distutils.spawn import find_executable
import subprocess import subprocess
@ -47,6 +48,10 @@ def ToUtf8IfNeeded( value ):
return str( value ) return str( value )
def ToUtf8Json( data ):
return ToUtf8IfNeeded( json.dumps( data, ensure_ascii = False ) )
def PathToTempDir(): def PathToTempDir():
tempdir = os.path.join( tempfile.gettempdir(), 'ycm_temp' ) tempdir = os.path.join( tempfile.gettempdir(), 'ycm_temp' )
if not os.path.exists( tempdir ): if not os.path.exists( tempdir ):