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