Mercurial > kallithea
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 |