|
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