Skip to content

Commit 131c673

Browse files
committed
Fix empty content in AdWordsReportError
1 parent 3b7e87d commit 131c673

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

googleads/adwords.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,11 +1661,13 @@ def _DownloadReportAsStream(self, post_body, **kwargs):
16611661
response.code, response.msg)
16621662
return response
16631663
except urllib2.HTTPError as e:
1664+
# Content from HTTPError instance can be read only one time.
1665+
error = self._ExtractError(e)
16641666
if _report_logger.isEnabledFor(logging.WARNING):
16651667
_report_logger.warning(
16661668
'Request Summary: %s', self._ExtractRequestSummaryFields(
1667-
request, error=e))
1668-
raise self._ExtractError(e)
1669+
request, error=error))
1670+
raise error
16691671

16701672
def _SanitizeRequestHeaders(self, headers):
16711673
"""Removes sensitive data from request headers for use in logging.
@@ -1708,7 +1710,7 @@ def _ExtractRequestSummaryFields(self, request, error=None):
17081710
Args:
17091711
request: a urllib2.Request instance.
17101712
[optional]
1711-
error: a urllib2.HttpError instance used to retrieve error details.
1713+
error: a AdWordsReportError instance used to retrieve error details.
17121714
17131715
Returns:
17141716
A dict containing the fields to be output in the summary logs.
@@ -1728,7 +1730,7 @@ def _ExtractRequestSummaryFields(self, request, error=None):
17281730

17291731
if error:
17301732
summary_fields['isError'] = True
1731-
summary_fields['errorMessage'] = error.read()
1733+
summary_fields['errorMessage'] = error.content
17321734
else:
17331735
summary_fields['isError'] = False
17341736

tests/adwords_test.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1783,17 +1783,21 @@ def testDownloadReport_failure(self):
17831783

17841784
self.marshaller.process.return_value = serialized_report
17851785

1786+
request = mock.patch(URL_REQUEST_PATH + '.Request')
1787+
logger = mock.patch('googleads.adwords._report_logger')
1788+
17861789
with mock.patch('suds.mx.Content') as mock_content:
1787-
with mock.patch(URL_REQUEST_PATH + '.Request') as mock_request:
1790+
with request as mock_request, logger as mock_logger:
1791+
mock_logger.isEnabledFor.return_value = True
17881792
mock_request_instance = mock.Mock()
17891793
mock_request.return_value = mock_request_instance
17901794
mock_request_instance.get_full_url.return_value = 'https://google.com/'
17911795
mock_request_instance.headers = {}
17921796
self.opener.open.side_effect = error
1793-
self.assertRaises(
1794-
googleads.errors.AdWordsReportError,
1795-
self.report_downloader.DownloadReport, report_definition,
1796-
output_file)
1797+
1798+
with self.assertRaises(googleads.errors.AdWordsReportError) as ex:
1799+
self.report_downloader.DownloadReport(report_definition, output_file)
1800+
self.assertEqual(ex.exception.content, report_data)
17971801

17981802
mock_request.assert_called_once_with(
17991803
('https://adwords.google.com/api/adwords/reportdownload/%s'

0 commit comments

Comments
 (0)