| 160 | | // first remove the XML declaration |
| 161 | | $this->message = preg_replace('/<\?xml.*?\?'.'>/', '', $this->message); |
| | 160 | // first remove the XML declaration |
| | 161 | // this method avoids the RAM usage of preg_replace on very large messages |
| | 162 | $header = preg_replace( '/<\?xml.*?\?'.'>/', '', substr( $this->message, 0, 100 ), 1 ); |
| | 163 | $this->message = substr_replace($this->message, $header, 0, 100); |
| 165 | 167 | $this->_parser = xml_parser_create(); |
| 166 | 168 | // Set XML parser to take the case of tags in to account |
| 167 | 169 | xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false); |
| 168 | 170 | // Set XML parser callback functions |
| 169 | 171 | xml_set_object($this->_parser, $this); |
| 170 | 172 | xml_set_element_handler($this->_parser, 'tag_open', 'tag_close'); |
| 171 | | xml_set_character_data_handler($this->_parser, 'cdata'); |
| 172 | | if (!xml_parse($this->_parser, $this->message)) { |
| 173 | | /* die(sprintf('XML error: %s at line %d', |
| 174 | | xml_error_string(xml_get_error_code($this->_parser)), |
| 175 | | xml_get_current_line_number($this->_parser))); */ |
| 176 | | return false; |
| 177 | | } |
| 178 | | xml_parser_free($this->_parser); |
| | 173 | xml_set_character_data_handler($this->_parser, 'cdata'); |
| | 174 | $chunk_size = 262144; // 256Kb, parse in chunks to avoid the RAM usage on very large messages |
| | 175 | do { |
| | 176 | if ( strlen($this->message) <= $chunk_size ) |
| | 177 | $final=true; |
| | 178 | $part = substr( $this->message, 0, $chunk_size ); |
| | 179 | $this->message = substr( $this->message, $chunk_size ); |
| | 180 | if ( !xml_parse( $this->_parser, $part, $final ) ) |
| | 181 | return false; |
| | 182 | if ( $final ) |
| | 183 | break; |
| | 184 | } while ( true ); |
| | 185 | xml_parser_free($this->_parser); |