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_byte_buffer() response.write(Utils.encode(html)) return {'response_code': 200, 'content': response}
def process_path(self, addon_name, drive_name, path): headers = {} response = Utils.get_file_byte_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( Utils.encode( 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 isinstance(children, type(None)): 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(Utils.encode(self.show_folder(driveid, path))) else: response_code = 404 response.write( Utils.encode('Drive "%s" does not exist for addon "%s"' % (drive_name, addon_name))) return { 'response_code': response_code, 'content': response, 'headers': headers }
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_byte_buffer() response.write(Utils.encode(html)) return {'response_code': 200, '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_byte_buffer() content.write(Utils.encode(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_byte_buffer() content.write( Utils.encode(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']))