From eb414518c13ed21aa53121fed0a3a00be84bf6da Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Feb 14 2017 16:20:08 +0000 Subject: PR#303 check http request status before attempting to decode response Merges #303 https://pagure.io/koji/pull-request/303 --- diff --git a/koji/__init__.py b/koji/__init__.py index 55e11ae..95bd44c 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -2321,6 +2321,7 @@ class ClientSession(object): if catcher: warnings.simplefilter("ignore") r = self.rsession.post(handler, **callopts) + r.raise_for_status() try: ret = self._read_xmlrpc_response(r) finally: diff --git a/koji/compatrequests.py b/koji/compatrequests.py index 2855da0..7f6a14d 100644 --- a/koji/compatrequests.py +++ b/koji/compatrequests.py @@ -121,6 +121,11 @@ class Response(object): self.session = session self.response = response + def raise_for_status(self): + if self.response.status >= 400: + raise httplib.HTTPException("HTTP %s: %s" % (self.response.status, + self.response.reason)) + def iter_content(self, blocksize=8192): # should we check this in Session.post()? # should we even check this here? diff --git a/tests/test_compatrequests.py b/tests/test_compatrequests.py index f835d79..ba255d4 100644 --- a/tests/test_compatrequests.py +++ b/tests/test_compatrequests.py @@ -1,3 +1,4 @@ +import httplib import mock import unittest import urlparse @@ -55,6 +56,13 @@ class TestResponse(unittest.TestCase): list(self.response.iter_content()) self.response.response.read.assert_called_once() + self.response.response.status = 404 + self.response.response.reason = 'Not Found' + self.response.response.getheader.return_value = 42 + with self.assertRaises(httplib.HTTPException): + self.response.raise_for_status() + + class TestSessionPost(unittest.TestCase):