def get_message_from_urllib2_httperror(http_response, in_response_to): """ This function should not be called by libtaxii users directly. """ info = http_response.info() if hasattr(info, 'getheader'): taxii_content_type = info.getheader('X-TAXII-Content-Type') _, params = cgi.parse_header(info.getheader('Content-Type')) else: taxii_content_type = info.get('X-TAXII-Content-Type') _, params = cgi.parse_header(info.get('Content-Type')) encoding = params.get('charset', 'utf-8') response_message = http_response.read() if taxii_content_type is None: m = str(http_response) + '\r\n' + str(http_response.info()) + '\r\n' + response_message return tm11.StatusMessage(message_id='0', in_response_to=in_response_to, status_type=ST_FAILURE, message=m) elif taxii_content_type == VID_TAXII_XML_10: # It's a TAXII XML 1.0 message return tm10.get_message_from_xml(response_message, encoding) elif taxii_content_type == VID_TAXII_XML_11: # It's a TAXII XML 1.1 message return tm11.get_message_from_xml(response_message, encoding) elif taxii_content_type == VID_CERT_EU_JSON_10: return tm10.get_message_from_json(response_message, encoding) else: raise ValueError('Unsupported X-TAXII-Content-Type: %s' % taxii_content_type)
def get_message_from_urllib_addinfourl(http_response, in_response_to): """ This function should not be called by libtaxii users directly. """ taxii_content_type = http_response.info().getheader('X-TAXII-Content-Type') response_message = http_response.read() if taxii_content_type is None: # Treat it as a Failure Status Message, per the spec message = [] #header_tuples = http_response.getheaders() header_dict = http_response.info().dict.iteritems() for k, v in header_dict:#header_tuples: message.append(k + ': ' + v + '\r\n') message.append('\r\n') message.append(response_message) m = ''.join(message) return tm11.StatusMessage(message_id='0', in_response_to=in_response_to, status_type=tm11.ST_FAILURE, message=m) elif taxii_content_type == VID_TAXII_XML_10: # It's a TAXII XML 1.0 message return tm10.get_message_from_xml(response_message) elif taxii_content_type == VID_TAXII_XML_11: #It's a TAXII XML 1.1 message return tm11.get_message_from_xml(response_message) elif taxii_content_type == VID_CERT_EU_JSON_10: return tm10.get_message_from_json(response_message) else: raise ValueError('Unsupported X-TAXII-Content-Type: %s' % taxii_content_type) return None
def get_message_from_urllib2_httperror(http_response, in_response_to): """ This function should not be called by libtaxii users directly. """ info = http_response.info() if hasattr(info, 'getheader'): taxii_content_type = info.getheader('X-TAXII-Content-Type') _, params = cgi.parse_header(info.getheader('Content-Type')) else: taxii_content_type = info.get('X-TAXII-Content-Type') _, params = cgi.parse_header(info.get('Content-Type')) encoding = params.get('charset', 'utf-8') response_message = http_response.read() if taxii_content_type is None: m = str(http_response) + '\r\n' + str( http_response.info()) + '\r\n' + response_message return tm11.StatusMessage(message_id='0', in_response_to=in_response_to, status_type=ST_FAILURE, message=m) elif taxii_content_type == VID_TAXII_XML_10: # It's a TAXII XML 1.0 message return tm10.get_message_from_xml(response_message, encoding) elif taxii_content_type == VID_TAXII_XML_11: # It's a TAXII XML 1.1 message return tm11.get_message_from_xml(response_message, encoding) elif taxii_content_type == VID_CERT_EU_JSON_10: return tm10.get_message_from_json(response_message, encoding) else: raise ValueError('Unsupported X-TAXII-Content-Type: %s' % taxii_content_type)
def get_message_from_urllib_addinfourl(http_response, in_response_to): """ This function should not be called by libtaxii users directly. """ info = http_response.info() if hasattr(info, 'getheader'): taxii_content_type = info.getheader('X-TAXII-Content-Type') _, params = cgi.parse_header(info.getheader('Content-Type')) else: taxii_content_type = info.get('X-TAXII-Content-Type') _, params = cgi.parse_header(info.get('Content-Type')) encoding = params.get('charset', 'utf-8') response_message = http_response.read() if taxii_content_type is None: # Treat it as a Failure Status Message, per the spec message = [] header_dict = six.iteritems(http_response.info().dict) for k, v in header_dict: message.append(k + ': ' + v + '\r\n') message.append('\r\n') message.append(response_message) m = ''.join(message) return tm11.StatusMessage(message_id='0', in_response_to=in_response_to, status_type=ST_FAILURE, message=m) elif taxii_content_type == VID_TAXII_XML_10: # It's a TAXII XML 1.0 message return tm10.get_message_from_xml(response_message, encoding) elif taxii_content_type == VID_TAXII_XML_11: # It's a TAXII XML 1.1 message return tm11.get_message_from_xml(response_message, encoding) elif taxii_content_type == VID_CERT_EU_JSON_10: return tm10.get_message_from_json(response_message, encoding) else: raise ValueError('Unsupported X-TAXII-Content-Type: %s' % taxii_content_type)
def get_message_from_urllib_addinfourl(http_response, in_response_to): """ This function should not be called by libtaxii users directly. """ taxii_content_type = http_response.info().getheader('X-TAXII-Content-Type') _, params = cgi.parse_header( http_response.info().getheader('Content-Type')) encoding = params.get('charset', 'utf-8') response_message = http_response.read() if taxii_content_type is None: # Treat it as a Failure Status Message, per the spec message = [] header_dict = six.iteritems(http_response.info().dict) for k, v in header_dict: message.append(k + ': ' + v + '\r\n') message.append('\r\n') message.append(response_message) m = ''.join(message) return tm11.StatusMessage(message_id='0', in_response_to=in_response_to, status_type=ST_FAILURE, message=m) elif taxii_content_type == VID_TAXII_XML_10: # It's a TAXII XML 1.0 message return tm10.get_message_from_xml(response_message, encoding) elif taxii_content_type == VID_TAXII_XML_11: # It's a TAXII XML 1.1 message return tm11.get_message_from_xml(response_message, encoding) elif taxii_content_type == VID_CERT_EU_JSON_10: return tm10.get_message_from_json(response_message, encoding) else: raise ValueError('Unsupported X-TAXII-Content-Type: %s' % taxii_content_type) return None
def _parse_response(stream, headers, version): content_type = headers.get('X-TAXII-Content-Type') if not content_type: body = stream.read() headers = '\n'.join([ '{}={}'.format(k, v) for k, v in headers.items()]) log.debug( "Invalid response:\n%s\n%s", headers, body) raise InvalidResponseError("Invalid response received") elif content_type not in [const.VID_TAXII_XML_10, const.VID_TAXII_XML_11, const.VID_CERT_EU_JSON_10]: raise ValueError('Unsupported X-TAXII-Content-Type: {}' .format(content_type)) elif content_type == const.VID_CERT_EU_JSON_10: body = stream.read() yield tm10.get_message_from_json(body) gen = etree.iterparse(stream, events=('start', 'end')) action, root = next(gen) namespace = etree.QName(root).namespace message_type = root.xpath('local-name()') if namespace not in VERSIONS: raise ValueError('Unsupported namespace: {}' .format(namespace)) elif version != VERSIONS[namespace]: raise InvalidResponseError( "Response TAXII version '%s' " "does not match request version '%s'" % (VERSIONS[namespace], version)) if message_type in [tm11.PollResponse.message_type, tm10.PollResponse.message_type]: yield STREAM_MARKER for obj in _stream_poll_response(namespace, gen): yield obj else: # Walk tree iterator to the end to fill up root element for _ in gen: pass if log.isEnabledFor(logging.DEBUG): log.debug("Response:\n%s", etree.tostring(root, pretty_print=True).decode('utf-8')) yield _parse_full_tree(content_type, message_type, root)
def _parse_response(stream, headers, version): content_type = headers.get('X-TAXII-Content-Type') if not content_type: body = stream.read() headers = '\n'.join(['{}={}'.format(k, v) for k, v in headers.items()]) log.debug("Invalid response:\n{}\n{}".format(headers, body)) raise InvalidResponseError("Invalid response received") elif content_type not in const.SUPPORTED_CONTENT_BINDINGS: raise ValueError( 'Unsupported X-TAXII-Content-Type: {}'.format(content_type)) elif content_type == const.CERT_EU_JSON_10_BINDING: body = stream.read() yield tm10.get_message_from_json(body) gen = etree.iterparse(stream, events=('start', 'end')) action, root = next(gen) namespace = etree.QName(root).namespace message_type = root.xpath('local-name()') if namespace not in const.VERSIONS: raise ValueError('Unsupported namespace: {}'.format(namespace)) elif version != const.VERSIONS[namespace]: raise InvalidResponseError( "Response TAXII version '{}' " "does not match request version '{}'".format( const.VERSIONS[namespace], version)) if message_type in [ tm11.PollResponse.message_type, tm10.PollResponse.message_type ]: yield const.STREAM_MARKER for obj in _stream_poll_response(namespace, gen): yield obj else: # Walk tree iterator to the end to fill up root element for _ in gen: pass if log.isEnabledFor(logging.DEBUG): log.debug("Response:\n%s", etree.tostring(root, pretty_print=True).decode('utf-8')) yield _parse_full_tree(content_type, message_type, root)
def test_02(self): """ Test all the encodings for TAXII 1.0 JSON """ for encoding in PYTHON_ENCODINGS: if encoding in ('cp720', 'cp858', 'iso8859_11') and (sys.version_info[0] == 2 and sys.version_info[1] == 6): continue # This encoding is not supported in Python 2.6 encoded_doc = json_taxii_message_10.encode(encoding, 'strict') try: msg = tm10.get_message_from_json(encoded_doc, encoding) except Exception as e: print('Bad codec was: %s' % encoding) raise
def get_message_from_urllib2_httperror(http_response, in_response_to): """ This function should not be called by libtaxii users directly. """ taxii_content_type = http_response.info().getheader('X-TAXII-Content-Type') response_message = http_response.read() if taxii_content_type is None: m = str(http_response.info()) + '\r\n' + response_message return tm11.StatusMessage(message_id='0', in_response_to=in_response_to, status_type=tm11.ST_FAILURE, message=m) elif taxii_content_type == VID_TAXII_XML_10: # It's a TAXII XML 1.0 message return tm10.get_message_from_xml(response_message) elif taxii_content_type == VID_TAXII_XML_11: #It's a TAXII XML 1.1 message return tm11.get_message_from_xml(response_message) elif taxii_content_type == VID_CERT_EU_JSON_10: return tm10.get_message_from_json(response_message) else: raise ValueError('Unsupported X-TAXII-Content-Type: %s' % taxii_content_type) return None
def get_message_from_urllib2_httperror(http_response, in_response_to): """ This function should not be called by libtaxii users directly. """ taxii_content_type = http_response.info().getheader('X-TAXII-Content-Type') response_message = http_response.read() if taxii_content_type is None: m = str(http_response.info()) + '\r\n' + response_message return tm11.StatusMessage(message_id='0', in_response_to=in_response_to, status_type=ST_FAILURE, message=m) elif taxii_content_type == VID_TAXII_XML_10: # It's a TAXII XML 1.0 message return tm10.get_message_from_xml(response_message) elif taxii_content_type == VID_TAXII_XML_11: # It's a TAXII XML 1.1 message return tm11.get_message_from_xml(response_message) elif taxii_content_type == VID_CERT_EU_JSON_10: return tm10.get_message_from_json(response_message) else: raise ValueError('Unsupported X-TAXII-Content-Type: %s' % taxii_content_type) return None
def get_message_from_client_response(resp, in_response_to): """ helper func""" taxii_content_type = resp.get('X-TAXII-Content-Type', None) response_message = resp.content if taxii_content_type is None: m = str(resp) + '\r\n' + response_message return tm11.StatusMessage(message_id='0', in_response_to=in_response_to, status_type=ST_FAILURE, message=m) elif taxii_content_type == VID_TAXII_XML_10: # It's a TAXII XML 1.0 message return tm10.get_message_from_xml(response_message) elif taxii_content_type == VID_TAXII_XML_11: # It's a TAXII XML 1.1 message return tm11.get_message_from_xml(response_message) elif taxii_content_type == VID_CERT_EU_JSON_10: return tm10.get_message_from_json(response_message) else: raise ValueError('Unsupported X-TAXII-Content-Type: %s' % taxii_content_type) return None
def _parse_response(stream, headers, version): content_type = headers.get('X-TAXII-Content-Type') if not content_type: body = stream.read() headers = '\n'.join([ '{}={}'.format(k, v) for k, v in headers.items()]) log.debug( "Invalid response:\n{}\n{}".format(headers, body)) raise InvalidResponseError("Invalid response received") elif content_type not in const.SUPPORTED_CONTENT_BINDINGS: raise ValueError('Unsupported X-TAXII-Content-Type: {}' .format(content_type)) elif content_type == const.CERT_EU_JSON_10_BINDING: body = stream.read() yield tm10.get_message_from_json(body) support_huge_trees = not os.environ.get('CABBY_NO_HUGE_TREES') gen = etree.iterparse( stream, events=('start', 'end'), # inject default attributes from DTD or XMLSchema attribute_defaults=False, # validate against a DTD referenced by the document dtd_validation=False, # use DTD for parsing load_dtd=False, # prevent network access for related files (default: True) no_network=True, # try hard to parse through broken XML recover=False, # discard blank text nodes that appear ignorable remove_blank_text=False, # discard comments remove_comments=False, # discard processing instructions remove_pis=False, # replace CDATA sections by normal text content (default: True) strip_cdata=True, # save memory for short text content (default: True) compact=True, # replace entities by their text value (default: True) resolve_entities=False, # enable/disable security restrictions and support very deep # trees and very long text content huge_tree=support_huge_trees) action, root = next(gen) namespace = etree.QName(root).namespace message_type = root.xpath('local-name()') if namespace not in const.VERSIONS: raise ValueError( 'Unsupported namespace: {}'.format(namespace)) elif version != const.VERSIONS[namespace]: raise InvalidResponseError( "Response TAXII version '{}' " "does not match request version '{}'" .format(const.VERSIONS[namespace], version)) if message_type in [tm11.PollResponse.message_type, tm10.PollResponse.message_type]: yield const.STREAM_MARKER for obj in _stream_poll_response(namespace, gen): yield obj else: # Walk tree iterator to the end to fill up root element for _ in gen: pass if log.isEnabledFor(logging.DEBUG): log.debug("Response:\n%s", etree.tostring(root, pretty_print=True).decode('utf-8')) yield _parse_full_tree(content_type, message_type, root)