Browse Source

Wrap requests in try for better failing

Or would it be worse failing?
pull/2096/merge
Ruud 12 years ago
parent
commit
a428d36604
  1. 31
      couchpotato/__init__.py
  2. 71
      couchpotato/api.py

31
couchpotato/__init__.py

@ -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')

71
couchpotato/api.py

@ -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)) kwargs = {}
for x in self.request.arguments:
# Split array arguments kwargs[x] = urllib.unquote(self.get_argument(x))
kwargs = getParams(kwargs)
# Split array arguments
# Remove t random string kwargs = getParams(kwargs)
try: del kwargs['t']
except: pass # Remove t random string
try: del kwargs['t']
# Add async callback handler except: pass
@run_async
def run_handler(callback): # Add async callback handler
result = api[route](**kwargs) @run_async
callback(result) def run_handler(callback):
result = yield tornado.gen.Task(run_handler) result = api[route](**kwargs)
callback(result)
# Check JSONP callback result = yield tornado.gen.Task(run_handler)
jsonp_callback = self.get_argument('callback_func', default = None)
# Check JSONP callback
if jsonp_callback: jsonp_callback = self.get_argument('callback_func', default = None)
self.write(str(jsonp_callback) + '(' + json.dumps(result) + ')')
elif isinstance(result, (tuple)) and result[0] == 'redirect': if jsonp_callback:
self.redirect(result[1]) self.write(str(jsonp_callback) + '(' + json.dumps(result) + ')')
else: elif isinstance(result, (tuple)) and result[0] == 'redirect':
self.write(result) 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()

Loading…
Cancel
Save