File 0001-Check-that-content_type-header-exists-before-using.patch of Package python-swiftclient

From 68f271aae2c45cd65d5a93659a812f9b8e823212 Mon Sep 17 00:00:00 2001
From: Chris Buccella <chris.buccella@antallagon.com>
Date: Thu, 6 Nov 2014 15:33:14 -0500
Subject: [PATCH] Check that content_type header exists before using

When downloading an object, the content_type header is inspected
to determine if a directory needs to be created. This header is
assumed to always be in the response; if it isn't an Exception is
raised. swiftclient should not assume content_type will always be
set.

Change-Id: I156195c02b6e0bc398fa962eb1f78c4dbddd1596
---
 swiftclient/service.py   |  3 ++-
 tests/unit/test_shell.py | 28 ++++++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

Index: python-swiftclient-2.3.1/swiftclient/service.py
===================================================================
--- python-swiftclient-2.3.1.orig/swiftclient/service.py
+++ python-swiftclient-2.3.1/swiftclient/service.py
@@ -1020,7 +1020,8 @@ class SwiftService(object):
                 try:
                     no_file = options['no_download']
                     content_type = headers.get('content-type')
-                    if content_type.split(';', 1)[0] == 'text/directory':
+                    if (content_type and
+                       content_type.split(';', 1)[0] == 'text/directory'):
                         make_dir = not no_file and out_file != "-"
                         if make_dir and not isdir(path):
                             mkdirs(path)
Index: python-swiftclient-2.3.1/tests/unit/test_shell.py
===================================================================
--- python-swiftclient-2.3.1.orig/tests/unit/test_shell.py
+++ python-swiftclient-2.3.1/tests/unit/test_shell.py
@@ -246,6 +246,34 @@ class TestShell(unittest.TestCase):
                 response_dict={})
             mock_open.assert_called_with('object', 'wb')
 
+    @mock.patch('swiftclient.service.Connection')
+    def test_download_no_content_type(self, connection):
+        connection.return_value.get_object.return_value = [
+            {'etag': 'd41d8cd98f00b204e9800998ecf8427e'},
+            '']
+
+        # Test downloading whole container
+        connection.return_value.get_container.side_effect = [
+            [None, [{'name': 'object'}]],
+            [None, [{'name': 'pseudo/'}]],
+            [None, []],
+        ]
+        connection.return_value.auth_end_time = 0
+        connection.return_value.attempts = 0
+
+        with mock.patch(BUILTIN_OPEN) as mock_open:
+            argv = ["", "download", "container"]
+            swiftclient.shell.main(argv)
+            calls = [mock.call('container', 'object',
+                               headers={}, resp_chunk_size=65536,
+                               response_dict={}),
+                     mock.call('container', 'pseudo/',
+                               headers={}, resp_chunk_size=65536,
+                               response_dict={})]
+            connection.return_value.get_object.assert_has_calls(
+                calls, any_order=True)
+            mock_open.assert_called_once_with('object', 'wb')
+
     @mock.patch('swiftclient.shell.walk')
     @mock.patch('swiftclient.service.Connection')
     def test_upload(self, connection, walk):
openSUSE Build Service is sponsored by