From cac21e3cff323d828b69b2280151b9c505bdaeda Mon Sep 17 00:00:00 2001
From: Joel Wright <joel.wright@sohonet.com>
Date: Wed, 14 Jan 2015 11:10:48 +0000
Subject: [PATCH] Fix crash when stat'ing objects with non-ascii names

This patch fixes a crash and stack trace in stat when an object
name contains non-ascii characters.

Change-Id: Ib6dc686771e593243de56cafc100b17e51d9d9d5
Closes-Bug: 1411665
---
 swiftclient/multithreading.py     |  4 +---
 tests/unit/test_multithreading.py | 10 +++++++++-
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/swiftclient/multithreading.py b/swiftclient/multithreading.py
index 7ae82fa3..32d8ffa8 100644
--- a/swiftclient/multithreading.py
+++ b/swiftclient/multithreading.py
@@ -84,13 +84,11 @@ class OutputManager(object):
         self.print_pool.submit(self._print, msg)
 
     def print_items(self, items, offset=DEFAULT_OFFSET, skip_missing=False):
-        lines = []
         template = '%%%ds: %%s' % offset
         for k, v in items:
             if skip_missing and not v:
                 continue
-            lines.append((template % (k, v)).rstrip())
-        self.print_msg('\n'.join(lines))
+            self.print_msg((template % (k, v)).rstrip())
 
     def error(self, msg, *fmt_args):
         if fmt_args:
diff --git a/tests/unit/test_multithreading.py b/tests/unit/test_multithreading.py
index 5f85b1c7..65977934 100644
--- a/tests/unit/test_multithreading.py
+++ b/tests/unit/test_multithreading.py
@@ -205,6 +205,11 @@ class TestOutputManager(testtools.TestCase):
             thread_manager.print_raw(
                 u'some raw bytes: \u062A\u062A'.encode('utf-8'))
 
+            thread_manager.print_items([
+                ('key', u'value'),
+                ('object', 'O\xcc\x88bject')
+            ])
+
             # Now we have a thread for error printing and a thread for
             # normal print messages
             self.assertEqual(starting_thread_count + 2,
@@ -227,7 +232,10 @@ class TestOutputManager(testtools.TestCase):
         self.assertEqual(''.join([
             'one-argument\n',
             'one fish, 88 fish\n',
-            'some\n', 'where\n', over_the, raw_bytes
+            'some\n', 'where\n',
+            over_the, raw_bytes,
+            '           key: value\n',
+            '        object: O\xcc\x88bject\n'
         ]), out_stream.getvalue())
 
         first_item = u'I have 99 problems, but a \u062A\u062A is not one\n'