Skip to content

Commit cd5922e

Browse files
committed
fix(attachments): raise SW360Error on failed downloads
Fixes #20
1 parent aae5144 commit cd5922e

3 files changed

Lines changed: 37 additions & 1 deletion

File tree

ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
## NEXT
99

10+
* fix: download_xxx_attachment now raises an SW360Error for failed downloads
11+
instead of silently creating a file containing the JSON answer
1012
* dependency updates to fix requests CVE-2023-32681.
1113
* be REUSE compliant.
1214
* get rid of json_params_matcher deprecation warning.

sw360/attachments.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,10 @@ def download_attachment(self, filename, download_url):
169169
hdr = self.api_headers.copy()
170170
hdr["Accept"] = "application/*"
171171
req = requests.get(download_url, allow_redirects=True, headers=hdr)
172-
open(filename, "wb").write(req.content)
172+
if req.ok:
173+
open(filename, "wb").write(req.content)
174+
else:
175+
raise SW360Error(req, download_url)
173176

174177
def _upload_resource_attachment(self, resource_type, resource_id, upload_file,
175178
upload_type="SOURCE", upload_comment=""):

tests/test_sw360_attachments.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,37 @@ def test_download_release_attachment(self):
216216
os.remove(filename)
217217
os.removedirs(tmpdir)
218218

219+
@responses.activate
220+
def test_download_release_attachment_404(self):
221+
lib = SW360(self.MYURL, self.MYTOKEN, False)
222+
lib.force_no_session = True
223+
self._add_login_response()
224+
actual = lib.login_api()
225+
self.assertTrue(actual)
226+
227+
url = self.MYURL + "resource/api/releases/1234/attachments/5678"
228+
responses.add(
229+
method=responses.GET,
230+
url=url,
231+
body='xxxx',
232+
status=404,
233+
content_type="application/text",
234+
adding_headers={"Authorization": "Token " + self.MYTOKEN},
235+
)
236+
237+
tmpdir = tempfile.mkdtemp()
238+
filename = os.path.join(tmpdir, "test_attachment.txt")
239+
if os.path.exists(filename):
240+
os.remove(filename)
241+
242+
self.assertFalse(os.path.exists(filename))
243+
with self.assertRaises(SW360Error) as context:
244+
lib.download_release_attachment(filename, "1234", "5678")
245+
self.assertFalse(os.path.exists(filename))
246+
self.assertEqual(context.exception.url, url)
247+
self.assertEqual(context.exception.response.status_code, 404)
248+
os.removedirs(tmpdir)
249+
219250
@responses.activate
220251
def test_download_project_attachment(self):
221252
lib = SW360(self.MYURL, self.MYTOKEN, False)

0 commit comments

Comments
 (0)