44import sys
55import json
66import traceback
7+ import platform
8+ import struct
79
810NODE_CHANNEL_FD = int (os .environ ['NODE_CHANNEL_FD' ])
911UNICODE_TYPE = unicode if sys .version_info [0 ] == 2 else str
1012
1113
14+ if platform .system () == 'Windows' :
15+ # hacky reimplementation of https://github.com/nodejs/node/blob/master/deps/uv/src/win/pipe.c
16+ def read_data (f ):
17+ header = f .read (16 )
18+ if not header :
19+ return header
20+ try :
21+ msg_length , = struct .unpack ('<Q' , header [8 :])
22+ return f .read (msg_length )
23+ except :
24+ raise ValueError ('Error parsing msg with header: {}' .format (repr (header )))
25+ def write_data (f , data ):
26+ header = struct .pack ('<Q' , 1 ) + struct .pack ('<Q' , len (data ))
27+ f .write (header + data )
28+ f .flush ()
29+ else :
30+ def read_data (f ):
31+ return reader .readline ()
32+ def write_data (f , data ):
33+ f .write (data )
34+ f .flush ()
35+
36+
1237def format_exception (t = None , e = None , tb = None ):
1338 return dict (
1439 exception = dict (
@@ -30,16 +55,19 @@ def format_exception(t=None, e=None, tb=None):
3055
3156
3257if __name__ == '__main__' :
33- writer = os .fdopen (NODE_CHANNEL_FD , 'w ' )
34- reader = os .fdopen (NODE_CHANNEL_FD , 'r ' )
58+ writer = os .fdopen (NODE_CHANNEL_FD , 'wb ' )
59+ reader = os .fdopen (NODE_CHANNEL_FD , 'rb ' )
3560
3661 while True :
3762 try :
3863 # Read new command
39- line = reader . readline ( )
64+ line = read_data ( reader )
4065 if not line :
4166 break
42- data = json .loads (line )
67+ try :
68+ data = json .loads (line .decode ('utf-8' ))
69+ except ValueError :
70+ raise ValueError ('Could not decode IPC data:\n {}' .format (repr (line )))
4371
4472 # Assert data saneness
4573 if data ['type' ] not in ['execute' , 'evaluate' ]:
@@ -57,8 +85,8 @@ def format_exception(t=None, e=None, tb=None):
5785 t , e , tb = sys .exc_info ()
5886 response = dict (type = 'exception' , value = format_exception (t , e , tb ))
5987
60- writer . write ( json .dumps (response , separators = (',' , ':' )) + '\n ' )
61- writer . flush ( )
88+ data = json .dumps (response , separators = (',' , ':' )). encode ( 'utf-8' ) + b '\n '
89+ write_data ( writer , data )
6290
6391 # Closing is messy
6492 try :
0 commit comments