aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--perllib/Open311.pm59
-rw-r--r--t/open311.t24
2 files changed, 67 insertions, 16 deletions
diff --git a/perllib/Open311.pm b/perllib/Open311.pm
index 12f3c2433..86a2c58fd 100644
--- a/perllib/Open311.pm
+++ b/perllib/Open311.pm
@@ -15,10 +15,8 @@ sub get_service_list {
my $self = shift;
my $service_list_xml = $self->_get( 'services.xml' );
- my $xml = XML::Simple->new();
- my $obj = $xml->XMLin( $service_list_xml );
- return $obj;
+ return $self->_get_xml_object( $service_list_xml );
}
sub get_service_meta_info {
@@ -70,14 +68,15 @@ EOT
my $response = $self->_post( 'requests.xml', $params );
if ( $response ) {
- my $xml = XML::Simple->new();
- my $obj = $xml->XMLin( $response );
-
- if ( $obj->{ request }->{ service_request_id } ) {
- return $obj->{ request }->{ service_request_id };
- } else {
- my $token = $obj->{ request }->{ token };
- return $self->get_service_request_id_from_token( $token );
+ my $obj = $self->_get_xml_object( $response );
+
+ if ( $obj ) {
+ if ( $obj->{ request }->{ service_request_id } ) {
+ return $obj->{ request }->{ service_request_id };
+ } else {
+ my $token = $obj->{ request }->{ token };
+ return $self->get_service_request_id_from_token( $token );
+ }
}
}
}
@@ -94,10 +93,9 @@ sub get_service_request_id_from_token {
my $service_token_xml = $self->_get( "tokens/$token.xml" );
- my $xml = XML::Simple->new();
- my $obj = $xml->XMLin( $service_token_xml );
+ my $obj = $self->_get_xml_object( $service_token_xml );
- if ( $obj->{ request }->{ service_request_id } ) {
+ if ( $obj && $obj->{ request }->{ service_request_id } ) {
return $obj->{ request }->{ service_request_id };
} else {
return 0;
@@ -126,7 +124,6 @@ sub _post {
my $uri = URI->new( $self->endpoint );
$uri->path( $uri->path . $path );
- use Data::Dumper;
my $req = POST $uri->as_string,
[
jurisdiction_id => $self->jurisdiction,
@@ -141,8 +138,38 @@ sub _post {
return $res->decoded_content;
} else {
warn "request failed: " . $res->status_line;
- warn $res->decoded_content;
+ warn $self->_process_error( $res->decoded_content );
return 0;
}
}
+
+sub _process_error {
+ my $self = shift;
+ my $error = shift;
+
+ my $obj = $self->_get_xml_object( $error );
+
+ my $msg = '';
+ if ( ref $obj && exists $obj->{error} ) {
+ my $errors = $obj->{error};
+ $errors = [ $errors ] if ref $errors ne 'ARRAY';
+ $msg .= sprintf( "%s: %s\n", $_->{code}, $_->{description} ) for @{ $errors };
+ }
+
+ return $msg || 'unknown error';
+}
+
+sub _get_xml_object {
+ my $self = shift;
+ my $xml= shift;
+
+ my $simple = XML::Simple->new();
+ my $obj;
+
+ eval {
+ $obj = $simple ->XMLin( $xml );
+ };
+
+ return $obj;
+}
1;
diff --git a/t/open311.t b/t/open311.t
new file mode 100644
index 000000000..f7a8cd815
--- /dev/null
+++ b/t/open311.t
@@ -0,0 +1,24 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Test::More tests => 4;
+
+use FindBin;
+use lib "$FindBin::Bin/../perllib";
+use lib "$FindBin::Bin/../commonlib/perllib";
+
+use_ok( 'Open311' );
+
+my $o = Open311->new();
+ok $o, 'created object';
+
+my $err_text = <<EOT
+<?xml version="1.0" encoding="utf-8"?><errors><error><code>400</code><description>Service Code cannot be null -- can't proceed with the request.</description></error></errors>
+EOT
+;
+
+is $o->_process_error( $err_text ), "400: Service Code cannot be null -- can't proceed with the request.\n", 'error text parsing';
+is $o->_process_error( '503 - service unavailable' ), 'unknown error', 'error text parsing of bad error';
+
+