Exemplo n.º 1
0
 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)
Exemplo n.º 5
0
    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']))