Skip to content

Commit 3ce5f56

Browse files
splunk-junyuwjunyu-w
authored andcommitted
ITSI-4561: fix sdk py3
1 parent 65729d6 commit 3ce5f56

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

splunklib/searchcommands/internals.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from __future__ import absolute_import, division, print_function
1818

19+
from io import TextIOWrapper
1920
from collections import deque, namedtuple
2021
from splunklib import six
2122
try:
@@ -781,19 +782,49 @@ def _write_chunk(self, metadata, body):
781782

782783
if metadata:
783784
metadata = str(''.join(self._iterencode_json(dict([(n, v) for n, v in metadata if v is not None]), 0)))
785+
if sys.version_info >= (3, 0):
786+
metadata = metadata.encode('utf-8')
784787
metadata_length = len(metadata)
785788
else:
786789
metadata_length = 0
787790

791+
if sys.version_info >= (3, 0):
792+
body = body.encode('utf-8')
788793
body_length = len(body)
789794

790795
if not (metadata_length > 0 or body_length > 0):
791796
return
792797

793798
start_line = 'chunked 1.0,%s,%s\n' % (metadata_length, body_length)
794-
write = self._ofile.write
795-
write(start_line)
799+
ofile_handle = set_binary_mode(self._ofile)
800+
write = ofile_handle.write
801+
write(start_line.encode('utf-8'))
796802
write(metadata)
797803
write(body)
798804
self._ofile.flush()
799805
self._flushed = False
806+
807+
def set_binary_mode(fh):
808+
""" Helper method to set up binary mode for file handles.
809+
Emphasis being sys.stdin, sys.stdout, sys.stderr.
810+
For python3, we want to return .buffer
811+
For python2+windows we want to set os.O_BINARY
812+
"""
813+
typefile = TextIOWrapper if sys.version_info >= (3, 0) else file
814+
# check for file handle
815+
if not isinstance(fh, typefile):
816+
return fh
817+
818+
# check for python3 and buffer
819+
if sys.version_info >= (3, 0) and hasattr(fh, 'buffer'):
820+
return fh.buffer
821+
# check for python3
822+
elif sys.version_info >= (3, 0):
823+
pass
824+
# check for windows
825+
elif sys.platform == 'win32':
826+
import msvcrt
827+
msvcrt.setmode(fh.fileno(), os.O_BINARY)
828+
829+
return fh
830+

0 commit comments

Comments
 (0)