diff --git a/couchpotato/__init__.py b/couchpotato/__init__.py index 8dc691d..9ab7d65 100644 --- a/couchpotato/__init__.py +++ b/couchpotato/__init__.py @@ -11,9 +11,11 @@ from tornado import template from tornado.web import RequestHandler import os import time +import traceback log = CPLog(__name__) + views = {} template_loader = template.Loader(os.path.join(os.path.dirname(__file__), 'templates')) @@ -25,7 +27,12 @@ class WebHandler(RequestHandler): if not views.get(route): page_not_found(self) return - self.write(views[route]()) + + try: + self.write(views[route]()) + except: + log.error('Failed doing web request "%s": %s', (route, traceback.format_exc())) + self.write({'success': False, 'error': 'Failed returning results'}) def addView(route, func, static = False): views[route] = func @@ -58,16 +65,22 @@ addView('docs', apiDocs) class KeyHandler(RequestHandler): def get(self, *args, **kwargs): api = None - username = Env.setting('username') - password = Env.setting('password') - if (self.get_argument('u') == md5(username) or not username) and (self.get_argument('p') == password or not password): - api = Env.setting('api_key') + try: + username = Env.setting('username') + password = Env.setting('password') + + if (self.get_argument('u') == md5(username) or not username) and (self.get_argument('p') == password or not password): + api = Env.setting('api_key') + + self.write({ + 'success': api is not None, + 'api_key': api + }) + except: + log.error('Failed doing key request: %s', (traceback.format_exc())) + self.write({'success': False, 'error': 'Failed returning results'}) - self.write({ - 'success': api is not None, - 'api_key': api - }) def page_not_found(rh): index_url = Env.get('web_base') diff --git a/couchpotato/api.py b/couchpotato/api.py index 77957f1..d133853 100644 --- a/couchpotato/api.py +++ b/couchpotato/api.py @@ -1,4 +1,5 @@ from couchpotato.core.helpers.request import getParams +from couchpotato.core.logger import CPLog from functools import wraps from threading import Thread from tornado.gen import coroutine @@ -6,8 +7,12 @@ from tornado.web import RequestHandler, asynchronous import json import threading import tornado +import traceback import urllib +log = CPLog(__name__) + + api = {} api_locks = {} api_nonblock = {} @@ -41,7 +46,11 @@ class NonBlockHandler(RequestHandler): if self.request.connection.stream.closed(): return - self.write(response) + try: + self.write(response) + except: + log.error('Failed doing nonblock request: %s', (traceback.format_exc())) + self.write({'success': False, 'error': 'Failed returning results'}) def on_connection_close(self): @@ -70,33 +79,39 @@ class ApiHandler(RequestHandler): api_locks[route].acquire() - kwargs = {} - for x in self.request.arguments: - kwargs[x] = urllib.unquote(self.get_argument(x)) - - # Split array arguments - kwargs = getParams(kwargs) - - # Remove t random string - try: del kwargs['t'] - except: pass - - # Add async callback handler - @run_async - def run_handler(callback): - result = api[route](**kwargs) - callback(result) - result = yield tornado.gen.Task(run_handler) - - # Check JSONP callback - jsonp_callback = self.get_argument('callback_func', default = None) - - if jsonp_callback: - self.write(str(jsonp_callback) + '(' + json.dumps(result) + ')') - elif isinstance(result, (tuple)) and result[0] == 'redirect': - self.redirect(result[1]) - else: - self.write(result) + try: + + kwargs = {} + for x in self.request.arguments: + kwargs[x] = urllib.unquote(self.get_argument(x)) + + # Split array arguments + kwargs = getParams(kwargs) + + # Remove t random string + try: del kwargs['t'] + except: pass + + # Add async callback handler + @run_async + def run_handler(callback): + result = api[route](**kwargs) + callback(result) + result = yield tornado.gen.Task(run_handler) + + # Check JSONP callback + jsonp_callback = self.get_argument('callback_func', default = None) + + if jsonp_callback: + self.write(str(jsonp_callback) + '(' + json.dumps(result) + ')') + elif isinstance(result, (tuple)) and result[0] == 'redirect': + self.redirect(result[1]) + else: + self.write(result) + + except: + log.error('Failed doing api request "%s": %s', (route, traceback.format_exc())) + self.write({'success': False, 'error': 'Failed returning results'}) api_locks[route].release()