git.fiddlerwoaroof.com
Browse code

returning an HTTP 500 status code on error

Ed L authored on 07/06/2011 22:45:42
Showing 3 changed files
... ...
@@ -136,7 +136,7 @@ class Request(object, JsonInstantiate):
136 136
 
137 137
 
138 138
 	def json_equivalent(self):
139
-		if self.kwargs.has_key('__args'):
139
+		if self.kwargs and self.kwargs.has_key('__args'):
140 140
 			raise ValueError, 'invalid argument name: __args'
141 141
 
142 142
 		params = self.args
... ...
@@ -40,6 +40,7 @@ from jsonrpc.server import ServerEvents, JSON_RPC
40 40
 class ExampleServer(ServerEvents):
41 41
 	# inherited hooks
42 42
 	def log(self, responses, txrequest):
43
+		print txrequest.code,
43 44
 		if isinstance(responses, list):
44 45
 			for response in responses:
45 46
 				msg = self._get_msg(response)
... ...
@@ -118,9 +118,10 @@ class JSON_RPC(Resource):
118 118
 			except jsonrpc.common.RPCError, e:
119 119
 				self._ebRender(e, request, content.id if hasattr(content, 'id') else None)
120 120
 
121
-			d = threads.deferToThread(self._action, request, content)
122
-			d.addCallback(self._cbRender, request)
123
-			d.addErrback(self._ebRender, request, content.id if hasattr(content, 'id') else None)
121
+			else:
122
+				d = threads.deferToThread(self._action, request, content)
123
+				d.addCallback(self._cbRender, request)
124
+				d.addErrback(self._ebRender, request, content.id if hasattr(content, 'id') else None)
124 125
 		except BaseException, e:
125 126
 			self._ebRender(e, request, None)
126 127
 
... ...
@@ -154,15 +155,21 @@ class JSON_RPC(Resource):
154 155
 			if not islist: result = result[0]
155 156
 		else: result = None
156 157
 
157
-		self.eventhandler.log(result, request)
158 158
 		return result
159 159
 
160 160
 
161
+	def _setresponseCode(self, result, request):
162
+		code = 200
163
+		if not isinstance(result, list):
164
+			if result is not None and result.error is not None:
165
+				code = 500
166
+		request.setResponseCode(code)
161 167
 
162 168
 	def _cbRender(self, result, request):
169
+		self._setresponseCode(result, request)
170
+		self.eventhandler.log(result, request)
163 171
 		if result is not None:
164 172
 			request.setHeader("content-type", 'application/json')
165
-			request.setResponseCode(200)
166 173
 			result = jsonrpc.jsonutil.encode(result).encode('utf-8')
167 174
 			request.setHeader("content-length", len(result))
168 175
 			request.write(result)
... ...
@@ -178,10 +185,10 @@ class JSON_RPC(Resource):
178 185
 		else: err = result
179 186
 
180 187
 		err = self.render_error(err, id)
188
+		self._setresponseCode(err, request)
181 189
 		self.eventhandler.log(err, request)
182 190
 
183 191
 		request.setHeader("content-type", 'application/json')
184
-		request.setResponseCode(200)
185 192
 		result = jsonrpc.jsonutil.encode(err).encode('utf-8')
186 193
 		request.setHeader("content-length", len(result))
187 194
 		request.write(result)