コード例 #1
0
ファイル: soap_proxy.py プロジェクト: SkippyNor/Cohen3
 def gotError(error, url):
     self.error(f'callRemote error requesting url {url}')
     self.debug(error)
     try:
         self.error(
             f'\t-> error.value.response is: {error.value.response}')
         try:
             tree = etree.fromstring(error.value.response)
         except Exception:
             self.warning(
                 'callRemote: error on parsing soap result, probably'
                 ' has encoding declaration, trying with another'
                 ' method...')
             tree = parse_with_lxml(error.value.response,
                                    encoding='utf-8')
         body = tree.find(
             '{http://schemas.xmlsoap.org/soap/envelope/}Body')
         return failure.Failure(
             Exception(
                 '%s - %s' %
                 (body.find('.//{urn:schemas-upnp-org:control-1-0}'
                            'errorCode').text,
                  body.find('.//{urn:schemas-upnp-org:control-1-0}'
                            'errorDescription').text)))
     except Exception as e:
         self.error(f'callRemote error on getting traceback: {e}')
         import traceback
         self.debug(traceback.format_exc())
     return error
コード例 #2
0
ファイル: lolcats_storage.py プロジェクト: riedel/Cohen3
    def parse_item(self, item):
        title = item.find('title').text
        title = re.sub('(\u2018|\u2019)', '\'', title)

        try:
            img_html = item.find(
                '{http://purl.org/rss/1.0/modules/content/}encoded').text
            img_xml = parse_with_lxml(img_html)
        except Exception as e:
            self.error('Error on searching lol cat image: {}'.format(e))
            self.debug(f'\t - parser fails on:\n{img_html}\n')
            return None

        url = img_xml.find('img').get('src', None)
        if url is None:
            return None

        data = {'title': title, 'url': url}
        return data
コード例 #3
0
    def render(self, request):
        '''Handle a SOAP command.'''
        data = request.content.read()
        headers = request.getAllHeaders()
        self.info(f'soap_request: {headers}')

        # allow external check of data
        self.dispatch_event('control_client_command_received', headers, data)

        def print_c(e):
            for c in e.getchildren():
                print(c, c.tag)
                print_c(c)

        if data == b'':
            return b'<p>No content to show</p>'
        try:
            tree = etree.fromstring(data)
        except Exception:
            self.warning(
                'UPnPPublisher.render: error on parsing soap result, probably'
                + ' has encoding declaration, trying with another method...'
            )
            tree = parse_with_lxml(data, encoding='utf-8')

        body = tree.find('{http://schemas.xmlsoap.org/soap/envelope/}Body')
        method = body.getchildren()[0]
        methodName = method.tag
        ns = None

        if methodName.startswith('{') and methodName.rfind('}') > 1:
            ns, methodName = methodName[1:].split('}')

        args = []
        kwargs = {}
        for child in method.getchildren():
            kwargs[child.tag] = self.decode_result(child)
            args.append(kwargs[child.tag])

        # p, header, body, attrs = SOAPpy.parseSOAPRPC(data, 1, 1, 1)
        # methodName, args, kwargs, ns = p._name, p._aslist, p._asdict, p._ns

        try:
            headers[b'content-type'].index(b'text/xml')
        except (KeyError, ValueError):
            self._gotError(
                failure.Failure(errorCode(415)), request, methodName, ns
            )
            return server.NOT_DONE_YET

        self.debug(f'headers: {headers}')

        l_function, use_keywords = self.lookupFunction(methodName)
        # print('function', function, 'keywords', useKeywords,
        #       'args', args, 'kwargs', kwargs)

        if not l_function:
            self._methodNotFound(request, methodName)
            return server.NOT_DONE_YET
        else:
            keywords = {'soap_methodName': methodName}
            if (
                b'user-agent' in headers
                and headers[b'user-agent'].find(b'Xbox/') == 0
            ):
                keywords['X_UPnPClient'] = 'XBox'
            # if headers.has_key(b'user-agent') and \
            #         headers[b'user-agent'].startswith(
            #             b'''Mozilla/4.0 (compatible; UPnP/1.0; Windows'''):
            #     keywords['X_UPnPClient'] = 'XBox'
            if (
                b'x-av-client-info' in headers
                and headers[b'x-av-client-info'].find(b'"PLAYSTATION3') > 0
            ):
                keywords['X_UPnPClient'] = 'PLAYSTATION3'
            if (
                b'user-agent' in headers
                and headers[b'user-agent'].find(
                    b'Philips-Software-WebClient/4.32'
                )
                == 0
            ):
                keywords['X_UPnPClient'] = 'Philips-TV'
            for k, v in list(kwargs.items()):
                keywords[str(k)] = v
            self.info(f'call {methodName} {keywords}')
            if hasattr(l_function, 'useKeywords'):
                d = defer.maybeDeferred(l_function, **keywords)
            else:
                d = defer.maybeDeferred(l_function, *args, **keywords)

        d.addCallback(self._gotResult, request, methodName, ns)
        d.addErrback(self._gotError, request, methodName, ns)
        return server.NOT_DONE_YET