##// END OF EJS Templates
Adding JSON error handling and fixing location headers.
Brian E. Granger -
Show More
@@ -19,11 +19,14 b' Authors:'
19
19
20 import datetime
20 import datetime
21 import email.utils
21 import email.utils
22 import functools
22 import hashlib
23 import hashlib
24 import json
23 import logging
25 import logging
24 import mimetypes
26 import mimetypes
25 import os
27 import os
26 import stat
28 import stat
29 import sys
27 import threading
30 import threading
28
31
29 from tornado import web
32 from tornado import web
@@ -37,6 +40,7 b' except ImportError:'
37 from IPython.config import Application
40 from IPython.config import Application
38 from IPython.external.decorator import decorator
41 from IPython.external.decorator import decorator
39 from IPython.utils.path import filefind
42 from IPython.utils.path import filefind
43 from IPython.utils.jsonutil import date_default
40
44
41 #-----------------------------------------------------------------------------
45 #-----------------------------------------------------------------------------
42 # Monkeypatch for Tornado <= 2.1.1 - Remove when no longer necessary!
46 # Monkeypatch for Tornado <= 2.1.1 - Remove when no longer necessary!
@@ -244,6 +248,7 b' class IPythonHandler(AuthenticatedHandler):'
244 use_less=self.use_less,
248 use_less=self.use_less,
245 )
249 )
246
250
251
247 class AuthenticatedFileHandler(IPythonHandler, web.StaticFileHandler):
252 class AuthenticatedFileHandler(IPythonHandler, web.StaticFileHandler):
248 """static files should only be accessible when logged in"""
253 """static files should only be accessible when logged in"""
249
254
@@ -252,6 +257,39 b' class AuthenticatedFileHandler(IPythonHandler, web.StaticFileHandler):'
252 return web.StaticFileHandler.get(self, path)
257 return web.StaticFileHandler.get(self, path)
253
258
254
259
260 def json_errors(method):
261 """Decorate methods with this to return GitHub style JSON errors.
262
263 This should be used on any handler method that can raise HTTPErrors.
264
265 This will grab the latest HTTPError exception using sys.exc_info
266 and then:
267
268 1. Set the HTTP status code based on the HTTPError
269 2. Create and return a JSON body with a message field describing
270 the error in a human readable form.
271 """
272 @functools.wraps(method)
273 def wrapper(self, *args, **kwargs):
274 try:
275 result = method(self, *args, **kwargs)
276 except:
277 t, value, tb = sys.exc_info()
278 if isinstance(value, web.HTTPError):
279 status = value.status_code
280 message = value.log_message
281 else:
282 status = 400
283 message = u"Unknown server error"
284 self.set_status(status)
285 reply = dict(message=message)
286 self.finish(json.dumps(reply, default=date_default))
287 else:
288 return result
289 return wrapper
290
291
292
255 #-----------------------------------------------------------------------------
293 #-----------------------------------------------------------------------------
256 # File handler
294 # File handler
257 #-----------------------------------------------------------------------------
295 #-----------------------------------------------------------------------------
General Comments 0
You need to be logged in to leave comments. Login now