Wrap requests in try for better failing

Or would it be worse failing?
This commit is contained in:
Ruud
2013-09-02 14:35:05 +02:00
parent b5207bc88c
commit a428d36604
2 changed files with 60 additions and 32 deletions
+22 -9
View File
@@ -11,9 +11,11 @@ from tornado import template
from tornado.web import RequestHandler from tornado.web import RequestHandler
import os import os
import time import time
import traceback
log = CPLog(__name__) log = CPLog(__name__)
views = {} views = {}
template_loader = template.Loader(os.path.join(os.path.dirname(__file__), 'templates')) template_loader = template.Loader(os.path.join(os.path.dirname(__file__), 'templates'))
@@ -25,7 +27,12 @@ class WebHandler(RequestHandler):
if not views.get(route): if not views.get(route):
page_not_found(self) page_not_found(self)
return 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): def addView(route, func, static = False):
views[route] = func views[route] = func
@@ -58,16 +65,22 @@ addView('docs', apiDocs)
class KeyHandler(RequestHandler): class KeyHandler(RequestHandler):
def get(self, *args, **kwargs): def get(self, *args, **kwargs):
api = None 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): try:
api = Env.setting('api_key') 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): def page_not_found(rh):
index_url = Env.get('web_base') index_url = Env.get('web_base')
+38 -23
View File
@@ -1,4 +1,5 @@
from couchpotato.core.helpers.request import getParams from couchpotato.core.helpers.request import getParams
from couchpotato.core.logger import CPLog
from functools import wraps from functools import wraps
from threading import Thread from threading import Thread
from tornado.gen import coroutine from tornado.gen import coroutine
@@ -6,8 +7,12 @@ from tornado.web import RequestHandler, asynchronous
import json import json
import threading import threading
import tornado import tornado
import traceback
import urllib import urllib
log = CPLog(__name__)
api = {} api = {}
api_locks = {} api_locks = {}
api_nonblock = {} api_nonblock = {}
@@ -41,7 +46,11 @@ class NonBlockHandler(RequestHandler):
if self.request.connection.stream.closed(): if self.request.connection.stream.closed():
return 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): def on_connection_close(self):
@@ -70,33 +79,39 @@ class ApiHandler(RequestHandler):
api_locks[route].acquire() api_locks[route].acquire()
kwargs = {} try:
for x in self.request.arguments:
kwargs[x] = urllib.unquote(self.get_argument(x))
# Split array arguments kwargs = {}
kwargs = getParams(kwargs) for x in self.request.arguments:
kwargs[x] = urllib.unquote(self.get_argument(x))
# Remove t random string # Split array arguments
try: del kwargs['t'] kwargs = getParams(kwargs)
except: pass
# Add async callback handler # Remove t random string
@run_async try: del kwargs['t']
def run_handler(callback): except: pass
result = api[route](**kwargs)
callback(result)
result = yield tornado.gen.Task(run_handler)
# Check JSONP callback # Add async callback handler
jsonp_callback = self.get_argument('callback_func', default = None) @run_async
def run_handler(callback):
result = api[route](**kwargs)
callback(result)
result = yield tornado.gen.Task(run_handler)
if jsonp_callback: # Check JSONP callback
self.write(str(jsonp_callback) + '(' + json.dumps(result) + ')') jsonp_callback = self.get_argument('callback_func', default = None)
elif isinstance(result, (tuple)) and result[0] == 'redirect':
self.redirect(result[1]) if jsonp_callback:
else: self.write(str(jsonp_callback) + '(' + json.dumps(result) + ')')
self.write(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() api_locks[route].release()