XMP: log structured data for halting errors
authorBryan Davis <bd808@wikimedia.org>
Thu, 27 Aug 2015 19:56:57 +0000 (13:56 -0600)
committerBryan Davis <bd808@wikimedia.org>
Thu, 27 Aug 2015 20:00:07 +0000 (14:00 -0600)
Log structured data for halting errors in XMPReader::parse at warning
level.

Bug: T89532
Change-Id: Iba38fedb4255687742228cf656218b4b633a7f40

includes/media/XMP.php

index 12550a5..87aff42 100644 (file)
@@ -348,7 +348,7 @@ class XMPReader implements LoggerAwareInterface {
                        // could declare entities unsafe to parse with xml_parse (T85848/T71210).
                        if ( $this->parsable !== self::PARSABLE_OK ) {
                                if ( $this->parsable === self::PARSABLE_NO ) {
-                                       throw new Exception( 'Unsafe doctype declaration in XML.' );
+                                       throw new RuntimeException( 'Unsafe doctype declaration in XML.' );
                                }
 
                                $content = $this->xmlParsableBuffer . $content;
@@ -361,24 +361,43 @@ class XMPReader implements LoggerAwareInterface {
                                        $msg = ( $this->parsable === self::PARSABLE_NO ) ?
                                                'Unsafe doctype declaration in XML.' :
                                                'No root element found in XML.';
-                                       throw new Exception( $msg );
+                                       throw new RuntimeException( $msg );
                                }
                        }
 
                        $ok = xml_parse( $this->xmlParser, $content, $allOfIt );
                        if ( !$ok ) {
-                               $error = xml_error_string( xml_get_error_code( $this->xmlParser ) );
-                               $where = 'line: ' . xml_get_current_line_number( $this->xmlParser )
-                                       . ' column: ' . xml_get_current_column_number( $this->xmlParser )
-                                       . ' byte offset: ' . xml_get_current_byte_index( $this->xmlParser );
-
-                               $this->logger->info( "XMPReader::parse : Error reading XMP content: $error ($where)" );
+                               $code = xml_get_error_code( $this->xmlParser );
+                               $error = xml_error_string( $code );
+                               $line = xml_get_current_line_number( $this->xmlParser );
+                               $col = xml_get_current_column_number( $this->xmlParser );
+                               $offset = xml_get_current_byte_index( $this->xmlParser );
+
+                               $this->logger->warning(
+                                       '{method} : Error reading XMP content: {error} ' .
+                                       '(line: {line} column: {column} byte offset: {offset})',
+                                       array(
+                                               'method' => __METHOD__,
+                                               'error_code' => $code,
+                                               'error' => $error,
+                                               'line' => $line,
+                                               'column' => $col,
+                                               'offset' => $offset,
+                                               'content' => $content,
+                               ) );
                                $this->results = array(); // blank if error.
                                $this->destroyXMLParser();
                                return false;
                        }
                } catch ( Exception $e ) {
-                       $this->logger->info( 'XMP parse error: ' . $e );
+                       $this->logger->warning(
+                               '{method} Exception caught while parsing: ' . $e->getMessage(),
+                               array(
+                                       'method' => __METHOD__,
+                                       'exception' => $e,
+                                       'content' => $content,
+                               )
+                       );
                        $this->results = array();
 
                        if ( $allOfIt ) {