blob: ef2b161ca3b0d45751be488c92d32580dc9efacb [file] [log] [blame]
Joe Gregorio3ad5e9a2010-12-09 15:01:04 -05001#!/usr/bin/python2.4
2#
Joe Gregorio20a5aa92011-04-01 17:44:25 -04003# Copyright (C) 2010 Google Inc.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Joe Gregorio3ad5e9a2010-12-09 15:01:04 -050016
17"""Errors for the library.
18
19All exceptions defined by the library
20should be defined in this file.
21"""
22
23__author__ = 'jcgregorio@google.com (Joe Gregorio)'
24
25
Joe Gregorio68a8cfe2012-08-03 16:17:40 -040026from oauth2client import util
Joe Gregorio549230c2012-01-11 10:38:05 -050027from oauth2client.anyjson import simplejson
Ali Afshar2dcc6522010-12-16 10:11:53 +010028
29
Joe Gregorio3ad5e9a2010-12-09 15:01:04 -050030class Error(Exception):
31 """Base error for this module."""
32 pass
33
34
35class HttpError(Error):
36 """HTTP data was invalid or unexpected."""
37
Joe Gregorio68a8cfe2012-08-03 16:17:40 -040038 @util.positional(3)
Joe Gregorio49396552011-03-08 10:39:00 -050039 def __init__(self, resp, content, uri=None):
Joe Gregorio3ad5e9a2010-12-09 15:01:04 -050040 self.resp = resp
Ali Afshar2dcc6522010-12-16 10:11:53 +010041 self.content = content
Joe Gregorio49396552011-03-08 10:39:00 -050042 self.uri = uri
Joe Gregorio3ad5e9a2010-12-09 15:01:04 -050043
Ali Afshar2dcc6522010-12-16 10:11:53 +010044 def _get_reason(self):
Joe Gregoriofdf7c802011-06-30 12:33:38 -040045 """Calculate the reason for the error from the response content."""
Joe Gregorio20b54fb2012-07-26 09:59:35 -040046 reason = self.resp.reason
47 try:
48 data = simplejson.loads(self.content)
49 reason = data['error']['message']
50 except (ValueError, KeyError):
51 pass
Joe Gregorioe7bbbb92013-02-20 15:37:24 -050052 if reason is None:
53 reason = ''
Ali Afshar2dcc6522010-12-16 10:11:53 +010054 return reason
55
56 def __repr__(self):
Joe Gregorio49396552011-03-08 10:39:00 -050057 if self.uri:
58 return '<HttpError %s when requesting %s returned "%s">' % (
Joe Gregorio3fb93672012-07-25 11:31:11 -040059 self.resp.status, self.uri, self._get_reason().strip())
Joe Gregorio49396552011-03-08 10:39:00 -050060 else:
61 return '<HttpError %s "%s">' % (self.resp.status, self._get_reason())
Ali Afshar2dcc6522010-12-16 10:11:53 +010062
63 __str__ = __repr__
Joe Gregorio3ad5e9a2010-12-09 15:01:04 -050064
65
Joe Gregorio49396552011-03-08 10:39:00 -050066class InvalidJsonError(Error):
67 """The JSON returned could not be parsed."""
68 pass
69
70
Joe Gregoriodc106fc2012-11-20 14:30:14 -050071class UnknownFileType(Error):
72 """File type unknown or unexpected."""
73 pass
74
75
Joe Gregorio3ad5e9a2010-12-09 15:01:04 -050076class UnknownLinkType(Error):
77 """Link type unknown or unexpected."""
78 pass
Joe Gregoriofdf7c802011-06-30 12:33:38 -040079
Joe Gregorio66f57522011-11-30 11:00:00 -050080
Joe Gregoriodae2f552011-11-21 08:16:56 -050081class UnknownApiNameOrVersion(Error):
Joe Gregorio8b4df3f2011-11-18 15:44:48 -050082 """No API with that name and version exists."""
83 pass
84
Joe Gregorioa388ce32011-09-09 17:19:13 -040085
Joe Gregoriofdf7c802011-06-30 12:33:38 -040086class UnacceptableMimeTypeError(Error):
87 """That is an unacceptable mimetype for this operation."""
88 pass
89
Joe Gregorioa388ce32011-09-09 17:19:13 -040090
Joe Gregoriofdf7c802011-06-30 12:33:38 -040091class MediaUploadSizeError(Error):
92 """Media is larger than the method can accept."""
93 pass
Joe Gregorioa388ce32011-09-09 17:19:13 -040094
95
Joe Gregoriobaf04802013-03-01 12:27:06 -050096class ResumableUploadError(HttpError):
Joe Gregoriod0bd3882011-11-22 09:49:47 -050097 """Error occured during resumable upload."""
98 pass
99
100
Joe Gregorioc80ac9d2012-08-21 14:09:09 -0400101class InvalidChunkSizeError(Error):
102 """The given chunksize is not valid."""
103 pass
104
Joe Gregorio1a5e30e2013-06-25 15:35:47 -0400105class InvalidNotificationError(Error):
106 """The channel Notification is invalid."""
107 pass
Joe Gregorioc80ac9d2012-08-21 14:09:09 -0400108
Joe Gregorio5d1171b2012-01-05 10:48:24 -0500109class BatchError(HttpError):
Joe Gregorio66f57522011-11-30 11:00:00 -0500110 """Error occured during batch operations."""
Joe Gregorio5d1171b2012-01-05 10:48:24 -0500111
Joe Gregorio68a8cfe2012-08-03 16:17:40 -0400112 @util.positional(2)
Joe Gregorio5d1171b2012-01-05 10:48:24 -0500113 def __init__(self, reason, resp=None, content=None):
114 self.resp = resp
115 self.content = content
116 self.reason = reason
117
118 def __repr__(self):
119 return '<BatchError %s "%s">' % (self.resp.status, self.reason)
120
121 __str__ = __repr__
Joe Gregorio66f57522011-11-30 11:00:00 -0500122
123
Joe Gregorioa388ce32011-09-09 17:19:13 -0400124class UnexpectedMethodError(Error):
125 """Exception raised by RequestMockBuilder on unexpected calls."""
126
Joe Gregorio68a8cfe2012-08-03 16:17:40 -0400127 @util.positional(1)
Joe Gregorioa388ce32011-09-09 17:19:13 -0400128 def __init__(self, methodId=None):
129 """Constructor for an UnexpectedMethodError."""
130 super(UnexpectedMethodError, self).__init__(
131 'Received unexpected call %s' % methodId)
132
133
134class UnexpectedBodyError(Error):
135 """Exception raised by RequestMockBuilder on unexpected bodies."""
136
137 def __init__(self, expected, provided):
138 """Constructor for an UnexpectedMethodError."""
139 super(UnexpectedBodyError, self).__init__(
140 'Expected: [%s] - Provided: [%s]' % (expected, provided))