From 047cb7b3e9f694c3e6654102bff3ae2bfd457be8 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Wed, 27 Jul 2011 12:07:02 +0200 Subject: DeutscheBahn.pm: Improve error handling (add ->errstr accessor) --- Changelog | 2 ++ bin/db-ris | 5 +++++ lib/Travel/Status/DE/DeutscheBahn.pm | 37 +++++++++++++++++++++++++++++++----- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/Changelog b/Changelog index 64760ee..e7d11eb 100644 --- a/Changelog +++ b/Changelog @@ -3,6 +3,8 @@ git HEAD [Travel::Status::DE::DeutscheBahn] * Fix ->results returning duplicate connections when accessed more than one time + * new: Only die when encountering wrong options, set ->error otherwise + * Adds new ->errstr accessor to check for request errors Travel::Status::DE::DeutscheBahn 0.04 - Wed Jul 13 2011 diff --git a/bin/db-ris b/bin/db-ris index a61dc07..8117d39 100755 --- a/bin/db-ris +++ b/bin/db-ris @@ -84,6 +84,11 @@ sub display_result { return; } +if ( my $err = $status->errstr ) { + say "Request error: ${err}"; + exit 2; +} + for my $d ( $status->results() ) { my @via; diff --git a/lib/Travel/Status/DE/DeutscheBahn.pm b/lib/Travel/Status/DE/DeutscheBahn.pm index baf1fe2..136cf51 100644 --- a/lib/Travel/Status/DE/DeutscheBahn.pm +++ b/lib/Travel/Status/DE/DeutscheBahn.pm @@ -54,12 +54,14 @@ sub new { } } + bless( $ref, $obj ); + $reply = $ua->post( 'http://reiseauskunft.bahn.de/bin/bhftafel.exe/dn?rt=1', $ref->{post} ); if ( $reply->is_error ) { - my $errstr = $reply->status_line(); - confess("Could not submit POST request: ${errstr}"); + $ref->{errstr} = $reply->status_line(); + return $ref; } $ref->{html} = $reply->content; @@ -71,7 +73,7 @@ sub new { suppress_warnings => 1, ); - return bless( $ref, $obj ); + return $ref; } sub new_from_html { @@ -94,6 +96,12 @@ sub new_from_html { return bless( $ref, $obj ); } +sub errstr { + my ($self) = @_; + + return $self->{errstr}; +} + sub results { my ($self) = @_; my $mode = $self->{post}->{boardType}; @@ -116,6 +124,9 @@ sub results { if ( defined $self->{results} ) { return @{ $self->{results} }; } + if ( not defined $self->{tree} ) { + return; + } for my $tr ( @{ $self->{tree}->findnodes($xp_element) } ) { @@ -194,6 +205,10 @@ arrival/departure monitor station => 'Essen Hbf', ); + if (my $err = $status->errstr) { + die("Request error: ${err}\n"); + } + for my $departure ($status->results) { printf( "At %s: %s to %s from platform %s\n", @@ -224,7 +239,11 @@ unspecified). =item my $status = Travel::Status::DE::DeutscheBahn->new(I<%opts>) -Returns a new Travel::Status::DE::DeutscheBahn element. Supported I are: +Requests the departures/arrivals as specified by I and returns a new +Travel::Status::DE::DeutscheBahn element with the results. Dies if the wrong +I were passed. + +Supported I are: =over @@ -259,11 +278,19 @@ By default, the following are shown: ice, ic_ec, d, nv, s. =back -=item $status->results() +=item $status->error + +In case of an error in the HTTP request, returns a string describing it. If +no error occured, returns undef. + +=item $status->results Returns a list of arrivals/departures. Each list element is a Travel::Status::DE::DeutscheBahn::Result(3pm) object. +If no matching results were found or the parser / http request failed, returns +undef. + =back =head1 DIAGNOSTICS -- cgit v1.2.3