|
16 | 16 |
|
17 | 17 | from __future__ import absolute_import, division, print_function
|
18 | 18 |
|
| 19 | +from io import TextIOWrapper |
19 | 20 | from collections import deque, namedtuple
|
20 | 21 | from splunklib import six
|
21 | 22 | try:
|
@@ -781,19 +782,49 @@ def _write_chunk(self, metadata, body):
|
781 | 782 |
|
782 | 783 | if metadata:
|
783 | 784 | 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') |
784 | 787 | metadata_length = len(metadata)
|
785 | 788 | else:
|
786 | 789 | metadata_length = 0
|
787 | 790 |
|
| 791 | + if sys.version_info >= (3, 0): |
| 792 | + body = body.encode('utf-8') |
788 | 793 | body_length = len(body)
|
789 | 794 |
|
790 | 795 | if not (metadata_length > 0 or body_length > 0):
|
791 | 796 | return
|
792 | 797 |
|
793 | 798 | 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')) |
796 | 802 | write(metadata)
|
797 | 803 | write(body)
|
798 | 804 | self._ofile.flush()
|
799 | 805 | 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