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 __init__(self, url, data, headers=None, tries=4, delay=5, backoff=2, exceptions=None, \ before_request=None, on_exception=None, on_failure=None, on_success=None, on_complete=None, on_update_download=None, \ cancel_operation=None, waiting_retry=None, wait=None, read_content=True, download_path=None): self.url = url if isinstance(data, str): self.data = Utils.encode(data) else: self.data = data self.headers = headers self.tries = tries self.current_tries = tries self.delay = delay self.current_delay = delay self.backoff = backoff self.before_request = before_request self.on_exception = on_exception self.on_failure = on_failure self.on_success = on_success self.on_complete = on_complete self.exceptions = exceptions self.cancel_operation = cancel_operation self.waiting_retry = waiting_retry self.wait = wait self.read_content = read_content self.download_path = download_path self.on_update_download = on_update_download
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 fetch_tokens_info(self, pin_info, request_params=None): request_params = self._wrap_on_exception(request_params) headers = { 'authorization': 'Basic ' + Utils.str( base64.b64encode(Utils.encode(':' + pin_info['password']))), 'addon': self.get_addon_header() } return Request( KodiUtils.get_signin_server() + '/pin/' + pin_info['pin'], None, headers, **request_params).request_json()
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']))