def do_POST(self): content = Utils.get_file_buffer() data = self.path.split('/') if len(data) > 1 and data[1] == self.server.service.name: try: size = int(self.headers.getheader('content-length', 0)) cmd = eval(self.rfile.read(size)) method = Utils.get_safe_value(cmd, 'method') if method: code = 200 args = Utils.get_safe_value(cmd, 'args', []) kwargs = Utils.get_safe_value(cmd, 'kwargs', {}) Logger.debug('Command received:\n%s' % cmd) content.write( repr(self.server.data.rpc(method, args, kwargs))) else: code = 400 content.write('Method required') except Exception as e: httpex = ExceptionUtils.extract_exception(e, HTTPError) if httpex: code = httpex.code else: code = 500 content.write(ExceptionUtils.full_stacktrace(e)) else: code = 404 self.write_response(code, content=content)
def process_path(self, addon_name, drive_name, path): headers = {} response = Utils.get_file_buffer() driveid = self.get_driveid(drive_name) if driveid: parts = self.path.split('/') filename = parts[len(parts)-1] if filename: response_code = 303 if path: u = urlparse(path) path = u.path Logger.debug('query: %s' % u.query) if u.query == 'subtitles': response_code = 200 response.write(json.dumps({'driveid': driveid, 'subtitles': self.get_subtitles(driveid, path)})) else: key = '%s%s:children' % (driveid, path[0:path.rfind('/')],) Logger.debug('reading cache key: ' + key) children = self._children_cache.get(key) if not children and type(children) is NoneType: self.get_folder_items(driveid, path[0:path.rfind('/')+1]) url = self.get_download_url(driveid, path) headers['location'] = url Logger.debug('redirect to: ' + url) else: url = self.path + '/' headers['location'] = url else: response_code = 200 response.write(str(self.show_folder(driveid, path))) else: response_code = 404 response.write('Drive "%s" does not exist for addon "%s"' % (drive_name, addon_name)) return {'response_code': response_code, 'content': response, 'headers': headers}
def do_GET(self): Logger.debug(self.path) data = self.path.split('/') code = 307 headers = {} content = Utils.get_file_buffer() if len(data) > 5 and data[1] == self.server.service.name: try: item = RpcUtil.rpc(data[2], 'get_item', kwargs = { 'driveid' : data[3], 'item_driveid' : data[4], 'item_id' : data[5], 'include_download_info' : True }) headers['location'] = item['download_info']['url'] except Exception as e: httpex = ExceptionUtils.extract_exception(e, HTTPError) if httpex: code = httpex.code else: code = 500 content.write(ExceptionUtils.full_stacktrace(e)) else: code = 404 self.write_response(code, content=content, headers=headers)
def do_GET(self): Logger.debug(self.path) data = self.path.split('/') code = 307 headers = {} content = Utils.get_file_buffer() if len(data) > 4 and data[1] == self.server.service.name: try: driveid = data[2] provider = self.server.data() account_manager = AccountManager( self.server.service.profile_path) provider.configure(account_manager, driveid) item = provider.get_item(item_driveid=data[3], item_id=data[4], include_download_info=True) headers['location'] = item['download_info']['url'] except Exception as e: httpex = ExceptionUtils.extract_exception(e, HTTPError) if httpex: code = httpex.code else: code = 500 ErrorReport.handle_exception(e) content.write(ExceptionUtils.full_stacktrace(e)) else: code = 404 self.write_response(code, content=content, headers=headers)
def process_path(self, addon_name, drive_name, path): headers = {} response = Utils.get_file_buffer() driveid = self.get_driveid(drive_name) if driveid: parts = self.path.split('/') if parts[len(parts) - 1]: response_code = 303 if path: key = '%s%s:children' % ( driveid, path[0:path.rfind('/')], ) Logger.debug('reading cache key: ' + key) children = self._children_cache.get(key) if not children and type(children) is NoneType: self.get_folder_items(driveid, path[0:path.rfind('/') + 1]) url = self.get_download_url(driveid, path) else: url = self.path + '/' headers['location'] = url else: response_code = 200 response.write(str(self.show_folder(driveid, path))) else: response_code = 404 response.write('Drive "%s" does not exist for addon "%s"' % (drive_name, addon_name)) return { 'response_code': response_code, 'content': response, 'headers': headers }
def do_GET(self): data = self.path.split('/') size = len(data) if size > 1 and data[1] == self.server.service.name: try: if size == 2: self.write_response(303, headers={'location': self.path + '/'}) elif size > 2 and data[2]: addon_name = data[2] if size == 3: self.write_response(303, headers={'location': self.path + '/'}) elif size == 4 and not data[3]: self.show_drives(addon_name) else: drive_name = data[3] path = self.path[len(self.server.service.name)+len(addon_name)+len(drive_name)+3:] self.process_path(addon_name, drive_name, path) else: self.show_addon_list() except Exception as e: httpex = ExceptionUtils.extract_exception(e, HTTPError) if httpex: response_code = httpex.code else: response_code = 500 content = Utils.get_file_buffer() content.write(ExceptionUtils.full_stacktrace(e)) self.write_response(response_code, content=content) else: self.write_response(404)
def process_path(self, addon_name, drive_name, path): addonid = self.get_addonid(addon_name) headers = {} response = Utils.get_file_buffer() if addonid: driveid = self.get_driveid(addonid, drive_name) if driveid: parts = self.path.split('/') if parts[len(parts)-1]: response_code = 303 if path: url = self.get_download_url(addonid, driveid, path) else: url = self.path + '/' headers['location'] = url else: response_code = 200 response.write(str(self.show_folder(addonid, driveid, path))) else: response_code = 404 response.write('Drive "%s" does not exist for addon "%s"' % (drive_name, addon_name)) else: response_code = 404 response.write('Cloud Drive addon "%s" does not exist' % addon_name) self.write_response(response_code, content=response, headers=headers)
def show_addon_list(self): html, table = self.open_table('Index of /') for addon in self.get_cloud_drive_addons(): self.add_row(table, Utils.str(addon['name']) + '/') self.close_table(table) response = Utils.get_file_buffer() response.write(str(html)) self.write_response(200, content=response)
def show_drives(self, addon_name): html, table = self.open_table('Index of /'+addon_name+'/') self.add_row(table, '../') drives = self.get_drive_list() for drive in drives: self.add_row(table, Utils.str(drive['display_name']) + '/') self.close_table(table) response = Utils.get_file_buffer() response.write(str(html)) return {'response_code': 200, 'content': response}
def show_addon_list(self): html, table = self.open_table('Index of /') addons = self.get_cloud_drive_addons() if addons: for addon in addons: self.add_row(table, Utils.str(addon['name']) + '/') else: self.add_row(table, KodiUtils.get_addon_info('name') + '/') self.close_table(table) response = Utils.get_file_buffer() response.write(str(html)) return {'response_code': 200, 'content': response}
def show_drives(self, addon_name): addonid = self.get_addonid(addon_name) response_code = 200 if addonid: html, table = self.open_table('Index of /'+addon_name+'/') self.add_row(table, '../') drives = self.get_drive_list(addonid) for drive in drives: self.add_row(table, Utils.str(drive['display_name']) + '/') self.close_table(table) else: response_code = 404 html = 'Cloud Drive addon "%s" does not exist' % addon_name response = Utils.get_file_buffer() response.write(str(html)) self.write_response(response_code, content=response)
def do_GET(self): Logger.debug(self.path + ': Requested') if self._system_monitor.abortRequested(): Logger.debug(self.path + ': abort requested') return data = self.path.split('/') size = len(data) cached_page = self._page_cache.get(self.path) if cached_page: if cached_page['pending']: Logger.debug(self.path + ': Already requested. Waiting for original request...') max_waiting_time = time.time() + 30 while not self._system_monitor.abortRequested() and max_waiting_time > time.time() and cached_page['pending']: if self._system_monitor.waitForAbort(1): break cached_page = self._page_cache.get(self.path) if not self._system_monitor.abortRequested(): if cached_page['pending']: self.write_response(504) Logger.debug(self.path + ': 504 - Gateway timeout') self._page_cache.remove(self.path) else: if 'content' in cached_page and cached_page['content']: content = Utils.get_file_buffer() content.write(cached_page['content']) cached_page['content'] = content self.write_response(cached_page['response_code'], content=Utils.get_safe_value(cached_page, 'content'), headers=Utils.get_safe_value(cached_page, 'headers', {})) Logger.debug(self.path + ': %d - Served from cache' % cached_page['response_code']) else: cached_page = {'pending': True} self._page_cache.set(self.path, cached_page) if size > 1 and data[1] == self.server.service.name: try: if size == 2: cached_page['response_code'] = 303 cached_page['headers'] = {'location': self.path + '/'} elif size > 2 and data[2]: cached_page = self.handle_resource_request(data) else: cached_page = self.show_addon_list() except Exception as e: httpex = ExceptionUtils.extract_exception(e, HTTPError) if httpex: cached_page['response_code'] = httpex.code else: cached_page['response_code'] = 500 ErrorReport.handle_exception(e) content = Utils.get_file_buffer() content.write(ExceptionUtils.full_stacktrace(e)) cached_page['content'] = content else: cached_page['response_code'] = 404 cached_page['pending'] = False content_value = None if 'content' in cached_page: content_value = cached_page['content'].getvalue() self.write_response(cached_page['response_code'], content=Utils.get_safe_value(cached_page, 'content'), headers=Utils.get_safe_value(cached_page, 'headers', {})) cached_page['content'] = content_value if Utils.get_safe_value(cached_page, 'response_code', 0) >= 500: self._page_cache.remove(self.path) else: self._page_cache.set(self.path, cached_page) Logger.debug(self.path + ': Response code ' + Utils.str(cached_page['response_code']))