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
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
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