lgtm On Wed, Jul 25, 2012 at 10:49 AM, <jcgregorio@google.com> wrote: > Reviewers: aiuto, > > Description: > Fixes issue #169. > > Please review this at http://codereview.appspot.com/**6444046/<http://codereview.appspot.com/6444046/> > > Affected files: > M apiclient/errors.py > M apiclient/http.py > M tests/test_http.py > > > Index: apiclient/errors.py > ==============================**==============================**======= > --- a/apiclient/errors.py > +++ b/apiclient/errors.py > @@ -54,7 +54,7 @@ > def __repr__(self): > if self.uri: > return '<HttpError %s when requesting %s returned "%s">' % ( > - self.resp.status, self.uri, self._get_reason()) > + self.resp.status, self.uri, self._get_reason().strip()) > else: > return '<HttpError %s "%s">' % (self.resp.status, > self._get_reason()) > > Index: apiclient/http.py > ==============================**==============================**======= > --- a/apiclient/http.py > +++ b/apiclient/http.py > @@ -649,7 +649,6 @@ > resp, content = http.request(self.uri, self.method, > body=self.body, > headers=self.headers) > - > if resp.status >= 300: > raise HttpError(resp, content, self.uri) > return self.postproc(resp, content) > @@ -1185,6 +1184,8 @@ > response = None > exception = None > try: > + if resp.status >= 300: > + raise HttpError(resp, content, request.uri) > response = request.postproc(resp, content) > except HttpError, e: > exception = e > Index: tests/test_http.py > ==============================**==============================**======= > --- a/tests/test_http.py > +++ b/tests/test_http.py > @@ -381,6 +381,44 @@ > --batch_foobarbaz--""" > > > +BATCH_ERROR_RESPONSE = """--batch_foobarbaz > +Content-Type: application/http > +Content-Transfer-Encoding: binary > +Content-ID: <randomness+1> > + > +HTTP/1.1 200 OK > +Content-Type application/json > +Content-Length: 14 > +ETag: "etag/pony"\r\n\r\n{"foo": 42} > + > +--batch_foobarbaz > +Content-Type: application/http > +Content-Transfer-Encoding: binary > +Content-ID: <randomness+2> > + > +HTTP/1.1 403 Access Not Configured > +Content-Type application/json > +Content-Length: 14 > +ETag: "etag/sheep"\r\n\r\nContent-**Length: 245 > + > +{ > + "error": { > + "errors": [ > + { > + "domain": "usageLimits", > + "reason": "accessNotConfigured", > + "message": "Access Not Configured", > + "debugInfo": "QuotaState: BLOCKED" > + } > + ], > + "code": 403, > + "message": "Access Not Configured" > + } > +} > + > +--batch_foobarbaz--""" > + > + > BATCH_RESPONSE_WITH_401 = """--batch_foobarbaz > Content-Type: application/http > Content-Transfer-Encoding: binary > @@ -670,6 +708,20 @@ > self.assertEqual({'foo': 42}, callbacks.responses['1']) > self.assertEqual({'baz': 'qux'}, callbacks.responses['2']) > > + def test_execute_http_error(self): > + callbacks = Callbacks() > + batch = BatchHttpRequest(callback=**callbacks.f) > + > + batch.add(self.request1) > + batch.add(self.request2) > + http = HttpMockSequence([ > + ({'status': '200', > + 'content-type': 'multipart/mixed; boundary="batch_foobarbaz"'}, > + BATCH_ERROR_RESPONSE), > + ]) > + batch.execute(http) > + self.assertEqual({'foo': 42}, callbacks.responses['1']) > + self.assertEqual('<HttpError 403 when requesting > https://www.googleapis.com/**someapi/v1/collection/?foo=bar<https://www.googl... "Access Not Configured">', str(callbacks.exceptions['2']) > **) > > if __name__ == '__main__': > unittest.main() > > >
Committed in http://code.google.com/p/google-api-python-client/source/detail?r=84c1ea7c1fe...