From 3c525220d9bcebb7394fe7a4c24b088ebc9e1692 Mon Sep 17 00:00:00 2001 From: 0div Date: Wed, 11 Dec 2024 17:07:36 -0800 Subject: [PATCH] make stdout and stderr decode handle errors by replacing with unicode replacement char; add tests --- .../e2b/sandbox_sync/commands/command_handle.py | 4 ++-- .../tests/sync/sandbox_sync/commands/test_run.py | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/python-sdk/e2b/sandbox_sync/commands/command_handle.py b/packages/python-sdk/e2b/sandbox_sync/commands/command_handle.py index edb18d11d..331d7b80e 100644 --- a/packages/python-sdk/e2b/sandbox_sync/commands/command_handle.py +++ b/packages/python-sdk/e2b/sandbox_sync/commands/command_handle.py @@ -65,11 +65,11 @@ def _handle_events( for event in self._events: if event.event.HasField("data"): if event.event.data.stdout: - out = event.event.data.stdout.decode() + out = event.event.data.stdout.decode('utf-8', 'replace') self._stdout += out yield out, None, None if event.event.data.stderr: - out = event.event.data.stderr.decode() + out = event.event.data.stderr.decode('utf-8', 'replace') self._stderr += out yield None, out, None if event.event.data.pty: diff --git a/packages/python-sdk/tests/sync/sandbox_sync/commands/test_run.py b/packages/python-sdk/tests/sync/sandbox_sync/commands/test_run.py index 4abd3f92b..67072cd78 100644 --- a/packages/python-sdk/tests/sync/sandbox_sync/commands/test_run.py +++ b/packages/python-sdk/tests/sync/sandbox_sync/commands/test_run.py @@ -20,6 +20,14 @@ def test_run_with_special_characters(sandbox: Sandbox): assert cmd.exit_code == 0 assert cmd.stdout == f"{text}\n" +def test_run_with_broken_utf8(sandbox: Sandbox): + # Create a string with 8191 'a' characters followed by the problematic byte 0xe2 + long_str = 'a' * 8191 + '\\xe2' + result = sandbox.commands.run(f'printf "{long_str}"') + assert result.exit_code == 0 + + # The broken UTF-8 bytes should be replaced with the Unicode replacement character + assert result.stdout == ('a' * 8191 + '\ufffd') def test_run_with_multiline_string(sandbox): text = "Hello,\nWorld!"