diff --git a/lib/Travel/Status/DE/HAFAS.pm b/lib/Travel/Status/DE/HAFAS.pm index 670cba6831621a4805110003aebe83a389e5dd00..839a599bf29138c1a4fa8f4f71ae50885cdf9eac 100644 --- a/lib/Travel/Status/DE/HAFAS.pm +++ b/lib/Travel/Status/DE/HAFAS.pm @@ -180,9 +180,15 @@ sub new { # errors in delay="...") when setting the language to dutch/italian. # No, I don't know why. - $ref->{tree} = XML::LibXML->load_xml( - string => $ref->{raw_xml}, - ); + eval { $ref->{tree} = XML::LibXML->load_xml( string => $ref->{raw_xml} ) }; + + if ( my $err = $@ ) { + if ( $ref->{developer_mode} ) { + say $ref->{raw_xml}; + } + $ref->{errstr} = "Backend returned invalid XML: $err"; + return $ref; + } if ( $ref->{developer_mode} ) { say $ref->{tree}->toString(1); diff --git a/t/30-invalid-xml.t b/t/30-invalid-xml.t index cb83a4c0dc96b7b19f03744e536ac6a52081d323..4a358a2ae433b2117263fd12b1cbabdb662b86e2 100755 --- a/t/30-invalid-xml.t +++ b/t/30-invalid-xml.t @@ -6,7 +6,7 @@ use 5.020; use utf8; use File::Slurp qw(read_file); -use Test::More tests => 1; +use Test::More tests => 2; use Travel::Status::DE::HAFAS; @@ -15,7 +15,18 @@ my $xml = 'lol'; my $status = Travel::Status::DE::HAFAS->new( service => 'DB', station => 'Berlin Jannowitzbrücke', - xml => $xml + xml => $xml ); -is (scalar $status->results, 0, 'no results on invalid input'); +is( scalar $status->results, + 0, 'no results on valid XML with invalid HAFAS data' ); + +$xml = 'lol<'; + +$status = Travel::Status::DE::HAFAS->new( + service => 'DB', + station => 'Berlin Jannowitzbrücke', + xml => $xml +); + +is( scalar $status->results, 0, 'no results on invalid XML' );