comparison rhodecode/controllers/api/__init__.py @ 1489:b951731f2143 beta

API fixes - fixed error messages for API
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 29 Sep 2011 03:12:16 +0300
parents c78f6bf52e9c
children 256e729a94cd
comparison
equal deleted inserted replaced
1488:dc16211e7292 1489:b951731f2143
37 from pylons.controllers.util import Response 37 from pylons.controllers.util import Response
38 38
39 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError, \ 39 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError, \
40 HTTPBadRequest, HTTPError 40 HTTPBadRequest, HTTPError
41 41
42 from rhodecode.model.user import User 42 from rhodecode.model.db import User
43 from rhodecode.lib.auth import AuthUser 43 from rhodecode.lib.auth import AuthUser
44 44
45 log = logging.getLogger('JSONRPC') 45 log = logging.getLogger('JSONRPC')
46 46
47 class JSONRPCError(BaseException): 47 class JSONRPCError(BaseException):
83 def __call__(self, environ, start_response): 83 def __call__(self, environ, start_response):
84 """ 84 """
85 Parse the request body as JSON, look up the method on the 85 Parse the request body as JSON, look up the method on the
86 controller and if it exists, dispatch to it. 86 controller and if it exists, dispatch to it.
87 """ 87 """
88
89 if 'CONTENT_LENGTH' not in environ: 88 if 'CONTENT_LENGTH' not in environ:
90 log.debug("No Content-Length") 89 log.debug("No Content-Length")
91 return jsonrpc_error(0, "No Content-Length") 90 return jsonrpc_error(message="No Content-Length in request")
92 else: 91 else:
93 length = environ['CONTENT_LENGTH'] or 0 92 length = environ['CONTENT_LENGTH'] or 0
94 length = int(environ['CONTENT_LENGTH']) 93 length = int(environ['CONTENT_LENGTH'])
95 log.debug('Content-Length: %s', length) 94 log.debug('Content-Length: %s', length)
96 95
97 if length == 0: 96 if length == 0:
98 log.debug("Content-Length is 0") 97 log.debug("Content-Length is 0")
99 return jsonrpc_error(0, "Content-Length is 0") 98 return jsonrpc_error(message="Content-Length is 0")
100 99
101 raw_body = environ['wsgi.input'].read(length) 100 raw_body = environ['wsgi.input'].read(length)
102 101
103 try: 102 try:
104 json_body = json.loads(urllib.unquote_plus(raw_body)) 103 json_body = json.loads(urllib.unquote_plus(raw_body))
105 except ValueError as e: 104 except ValueError as e:
106 #catch JSON errors Here 105 #catch JSON errors Here
107 return jsonrpc_error("JSON parse error ERR:%s RAW:%r" \ 106 return jsonrpc_error(message="JSON parse error ERR:%s RAW:%r" \
108 % (e, urllib.unquote_plus(raw_body))) 107 % (e, urllib.unquote_plus(raw_body)))
109 108
110
111 #check AUTH based on API KEY 109 #check AUTH based on API KEY
112
113 try: 110 try:
114 self._req_api_key = json_body['api_key'] 111 self._req_api_key = json_body['api_key']
115 self._req_method = json_body['method'] 112 self._req_method = json_body['method']
116 self._req_params = json_body['args'] 113 self._req_params = json_body['args']
117 log.debug('method: %s, params: %s', 114 log.debug('method: %s, params: %s',
129 126
130 self._error = None 127 self._error = None
131 try: 128 try:
132 self._func = self._find_method() 129 self._func = self._find_method()
133 except AttributeError, e: 130 except AttributeError, e:
134 return jsonrpc_error(str(e)) 131 return jsonrpc_error(message=str(e))
135 132
136 # now that we have a method, add self._req_params to 133 # now that we have a method, add self._req_params to
137 # self.kargs and dispatch control to WGIController 134 # self.kargs and dispatch control to WGIController
138 arglist = inspect.getargspec(self._func)[0][1:] 135 arglist = inspect.getargspec(self._func)[0][1:]
139 136
141 # perms decorators to work they expect the controller class to have 138 # perms decorators to work they expect the controller class to have
142 # rhodecode_user set 139 # rhodecode_user set
143 self.rhodecode_user = auth_u 140 self.rhodecode_user = auth_u
144 141
145 if 'user' not in arglist: 142 if 'user' not in arglist:
146 return jsonrpc_error('This method [%s] does not support ' 143 return jsonrpc_error(message='This method [%s] does not support '
147 'authentication (missing user param)' % 144 'authentication (missing user param)' %
148 self._func.__name__) 145 self._func.__name__)
149 146
150 # get our arglist and check if we provided them as args 147 # get our arglist and check if we provided them as args
151 for arg in arglist: 148 for arg in arglist:
153 # user is something translated from api key and this is 150 # user is something translated from api key and this is
154 # checked before 151 # checked before
155 continue 152 continue
156 153
157 if not self._req_params or arg not in self._req_params: 154 if not self._req_params or arg not in self._req_params:
158 return jsonrpc_error('Missing %s arg in JSON DATA' % arg) 155 return jsonrpc_error(message='Missing %s arg in JSON DATA' % arg)
159 156
160 self._rpc_args = dict(user=u) 157 self._rpc_args = dict(user=u)
161 self._rpc_args.update(self._req_params) 158 self._rpc_args.update(self._req_params)
162 159
163 self._rpc_args['action'] = self._req_method 160 self._rpc_args['action'] = self._req_method